summaryrefslogtreecommitdiff
path: root/src/parse/root.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-28 11:06:10 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-28 11:06:10 +0800
commit5a2bb22435e3da9250c129ed0a27ca9d4e5feaf9 (patch)
tree85559ce630dd354040e0df0e3854e50f445b7a22 /src/parse/root.cpp
parent7f087ee36d98117ed47a8da548ff26802448df70 (diff)
downloadmrust-5a2bb22435e3da9250c129ed0a27ca9d4e5feaf9.tar.gz
Parse - Don't load #[cfg] disabled modules
Diffstat (limited to 'src/parse/root.cpp')
-rw-r--r--src/parse/root.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/parse/root.cpp b/src/parse/root.cpp
index feb5d37a..ce3cb5fb 100644
--- a/src/parse/root.cpp
+++ b/src/parse/root.cpp
@@ -15,6 +15,7 @@
#include "common.hpp"
#include <cassert>
#include <hir/hir.hpp> // ABI_RUST - TODO: Move elsewhere?
+#include <expand/cfg.hpp> // check_cfg - for `mod nonexistant;`
template<typename T>
Spanned<T> get_spanned(TokenStream& lex, ::std::function<T()> f) {
@@ -48,7 +49,7 @@ void Parse_ModRoot(TokenStream& lex, AST::Module& mod, AST::MetaItems& mod_attrs
::std::vector< ::std::string> lifetimes;
GET_CHECK_TOK(tok, lex, TOK_LT);
do {
- GET_TOK(tok, lex);
+ GET_TOK(tok, lex);
::AST::MetaItems attrs;
while(tok.type() == TOK_ATTR_OPEN)
@@ -1622,6 +1623,19 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin
submod.m_file_info.path = sub_path;
submod.m_file_info.controls_dir = sub_file_controls_dir;
+ // Check #[cfg] and don't load if it fails
+ struct H {
+ static bool check_item_cfg(const ::AST::MetaItems& attrs)
+ {
+ for(const auto& at : attrs.m_items) {
+ if( at.name() == "cfg" && !check_cfg(attrs.m_span, at) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+ };
+
switch( GET_TOK(tok, lex) )
{
case TOK_BRACE_OPEN:
@@ -1637,6 +1651,12 @@ void Parse_Use(TokenStream& lex, ::std::function<void(AST::UseStmt, ::std::strin
{
ERROR(lex.getPosition(), E0000, "Can't load from files outside of mod.rs or crate root");
}
+ else if( !H::check_item_cfg(meta_items) ) {
+ // Ignore - emit Item::None
+ item_name = mv$(name);
+ item_data = ::AST::Item( );
+ break ;
+ }
else
{
::std::string newpath_dir = sub_path + "/";