summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/ast.hpp4
-rw-r--r--src/ast/item.hpp2
-rw-r--r--src/dump_as_rust.cpp3
-rw-r--r--src/expand/cfg.cpp9
-rw-r--r--src/expand/mod.cpp22
-rw-r--r--src/include/synext_decorator.hpp2
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"); }