diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/ast.hpp | 4 | ||||
-rw-r--r-- | src/ast/item.hpp | 2 | ||||
-rw-r--r-- | src/dump_as_rust.cpp | 3 | ||||
-rw-r--r-- | src/expand/cfg.cpp | 9 | ||||
-rw-r--r-- | src/expand/mod.cpp | 22 | ||||
-rw-r--r-- | src/include/synext_decorator.hpp | 2 |
6 files changed, 38 insertions, 4 deletions
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp index 47b09ed4..362af210 100644 --- a/src/ast/ast.hpp +++ b/src/ast/ast.hpp @@ -424,8 +424,8 @@ struct UseStmt ::AST::Path path;
::AST::MetaItems attrs;
- UseStmt(UseStmt&&) = default;
- UseStmt(){}
+ UseStmt()
+ {}
UseStmt(Span sp, Path p):
sp(sp),
path(p)
diff --git a/src/ast/item.hpp b/src/ast/item.hpp index 07abb39b..2d3d1a1b 100644 --- a/src/ast/item.hpp +++ b/src/ast/item.hpp @@ -18,6 +18,7 @@ struct NamedNS {} NamedNS(NamedNS&&) = default; NamedNS(const NamedNS&) = default; + NamedNS& operator=(NamedNS&&) = default; NamedNS(::std::string name, T data, bool is_pub): name( ::std::move(name) ), data( ::std::move(data) ), @@ -39,6 +40,7 @@ struct Named: {} Named(Named&&) = default; Named(const Named&) = default; + Named& operator=(Named&&) = default; Named(::std::string name, T data, bool is_pub): NamedNS<T>( ::std::move(name), ::std::move(data), is_pub ) {} diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp index 3c3a215d..8c79c744 100644 --- a/src/dump_as_rust.cpp +++ b/src/dump_as_rust.cpp @@ -561,6 +561,9 @@ void RustPrinter::handle_module(const AST::Module& mod) // m_os << "\n"; // need_nl = false; //} + if( i.data.path == AST::Path() ) { + continue ; + } m_os << indent() << (i.is_pub ? "pub " : "") << "use " << i.data; if( i.name == "" ) { diff --git a/src/expand/cfg.cpp b/src/expand/cfg.cpp index 70ac6ac1..2a629432 100644 --- a/src/expand/cfg.cpp +++ b/src/expand/cfg.cpp @@ -117,6 +117,15 @@ class CCfgHandler: mac.clear(); } } + void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, AST::UseStmt& use) const override { + DEBUG("#[cfg] use - " << mi); + if( check_cfg(sp, mi) ) { + // Leave as is + } + else { + use.path = AST::Path(); + } + } void handle(const Span& sp, const AST::MetaItem& mi, ::AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const override { DEBUG("#[cfg] item - " << mi); if( check_cfg(sp, mi) ) { diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index 97934db2..be7e17b0 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -604,7 +604,25 @@ void Expand_Mod(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> mo } } - // 2. General items + // 2. Use statements + for( auto it = mod.imports().begin(); it != mod.imports().end(); ) + { + auto& i = *it; + auto attrs = mv$(i.data.attrs); + Expand_Attrs(attrs, stage_pre (is_early), [&](const auto& sp, const auto& d, const auto& a){ d.handle(sp, a, crate, i.data); }); + Expand_Attrs(attrs, stage_post(is_early), [&](const auto& sp, const auto& d, const auto& a){ d.handle(sp, a, crate, i.data); }); + if( i.data.attrs.m_items.size() == 0 ) + i.data.attrs = mv$(attrs); + + if( i.data.path == AST::Path() ) { + it = mod.imports().erase(it); + } + else { + ++ it; + } + } + + // 3. General items DEBUG("Items"); for( auto& i : mod.items() ) { @@ -619,7 +637,7 @@ void Expand_Mod(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> mo // Skip, nothing ), (MacroInv, - TODO(Span(), "Macro invocation"); + TODO(Span(), "Macro invocation in item list"); ), (Module, LList<const AST::Module*> sub_modstack(&modstack, &e); diff --git a/src/include/synext_decorator.hpp b/src/include/synext_decorator.hpp index 5ae1af53..06f603b1 100644 --- a/src/include/synext_decorator.hpp +++ b/src/include/synext_decorator.hpp @@ -21,6 +21,7 @@ namespace AST { class Module; class Item; + class UseStmt; class Expr; class ExprNode; @@ -47,6 +48,7 @@ public: virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate) const { unexpected(sp, mi, "crate"); } virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, AST::MacroInvocation& mac) const { unexpected(sp, mi, "macro invocation"); } + virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, AST::UseStmt& use) const { unexpected(sp, mi, "use statement"); } virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Path& path, AST::Module& mod, AST::Item&i) const { unexpected(sp, mi, "item"); } // NOTE: To delete, set the type to `_` virtual void handle(const Span& sp, const AST::MetaItem& mi, AST::Crate& crate, const AST::Module& mod, AST::ImplDef& impl) const { unexpected(sp, mi, "impl"); } |