diff options
Diffstat (limited to 'gcc/rust/resolve')
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-expr.h | 7 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-implitem.h | 21 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.h | 14 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-stmt.h | 8 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-toplevel.h | 7 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 40 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-name-resolver.h | 9 |
7 files changed, 106 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-expr.h b/gcc/rust/resolve/rust-ast-resolve-expr.h index b7b8646..bb1cbb0 100644 --- a/gcc/rust/resolve/rust-ast-resolve-expr.h +++ b/gcc/rust/resolve/rust-ast-resolve-expr.h @@ -70,6 +70,13 @@ public: expr->accept_vis (resolver); }; + void visit (AST::MacroInvocation &expr) override + { + AST::ASTFragment &fragment = expr.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::TupleIndexExpr &expr) override { resolve_expr (expr.get_tuple_expr ().get (), expr.get_node_id ()); diff --git a/gcc/rust/resolve/rust-ast-resolve-implitem.h b/gcc/rust/resolve/rust-ast-resolve-implitem.h index f17b222..ce7234c 100644 --- a/gcc/rust/resolve/rust-ast-resolve-implitem.h +++ b/gcc/rust/resolve/rust-ast-resolve-implitem.h @@ -49,6 +49,13 @@ public: item->accept_vis (resolver); } + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::TypeAlias &type) override { auto decl @@ -137,6 +144,13 @@ public: item->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::TraitItemFunc &function) override { auto decl = ResolveTraitItemFunctionToCanonicalPath::resolve (function); @@ -240,6 +254,13 @@ public: item->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::ExternalFunctionItem &function) override { auto decl = CanonicalPath::new_seg (function.get_node_id (), diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index 5d32c00..48f93e5 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -45,6 +45,13 @@ public: item->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::TraitItemType &type) override { auto decl = ResolveTraitItemTypeToCanonicalPath::resolve (type); @@ -227,6 +234,13 @@ public: item->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::TypeAlias &alias) override { auto talias = CanonicalPath::new_seg (alias.get_node_id (), diff --git a/gcc/rust/resolve/rust-ast-resolve-stmt.h b/gcc/rust/resolve/rust-ast-resolve-stmt.h index 3afed53..7521739 100644 --- a/gcc/rust/resolve/rust-ast-resolve-stmt.h +++ b/gcc/rust/resolve/rust-ast-resolve-stmt.h @@ -44,6 +44,14 @@ public: stmt->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::ExprStmtWithBlock &stmt) override { ResolveExpr::go (stmt.get_expr ().get (), stmt.get_node_id (), prefix, diff --git a/gcc/rust/resolve/rust-ast-resolve-toplevel.h b/gcc/rust/resolve/rust-ast-resolve-toplevel.h index 7aba67f..39d6818 100644 --- a/gcc/rust/resolve/rust-ast-resolve-toplevel.h +++ b/gcc/rust/resolve/rust-ast-resolve-toplevel.h @@ -43,6 +43,13 @@ public: item->accept_vis (resolver); }; + void visit (AST::MacroInvocationSemi &invoc) override + { + AST::ASTFragment &fragment = invoc.get_fragment (); + for (auto &node : fragment.get_nodes ()) + node.accept_vis (*this); + } + void visit (AST::Module &module) override { auto mod diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index 8aef313..5ac076a 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -54,6 +54,7 @@ Resolver::Resolver () name_scope (Scope (mappings->get_current_crate ())), type_scope (Scope (mappings->get_current_crate ())), label_scope (Scope (mappings->get_current_crate ())), + macro_scope (Scope (mappings->get_current_crate ())), global_type_node_id (UNKNOWN_NODEID), unit_ty_node_id (UNKNOWN_NODEID) { generate_builtins (); @@ -93,6 +94,13 @@ Resolver::push_new_label_rib (Rib *r) label_ribs[r->get_node_id ()] = r; } +void +Resolver::push_new_macro_rib (Rib *r) +{ + rust_assert (label_ribs.find (r->get_node_id ()) == label_ribs.end ()); + macro_ribs[r->get_node_id ()] = r; +} + bool Resolver::find_name_rib (NodeId id, Rib **rib) { @@ -115,6 +123,17 @@ Resolver::find_type_rib (NodeId id, Rib **rib) return true; } +bool +Resolver::find_macro_rib (NodeId id, Rib **rib) +{ + auto it = macro_ribs.find (id); + if (it == macro_ribs.end ()) + return false; + + *rib = it->second; + return true; +} + void Resolver::insert_builtin_types (Rib *r) { @@ -281,6 +300,27 @@ Resolver::lookup_resolved_label (NodeId refId, NodeId *defId) return true; } +void +Resolver::insert_resolved_macro (NodeId refId, NodeId defId) +{ + auto it = resolved_macros.find (refId); + rust_assert (it == resolved_macros.end ()); + + resolved_labels[refId] = defId; + get_label_scope ().append_reference_for_def (refId, defId); +} + +bool +Resolver::lookup_resolved_macro (NodeId refId, NodeId *defId) +{ + auto it = resolved_macros.find (refId); + if (it == resolved_macros.end ()) + return false; + + *defId = it->second; + return true; +} + // NameResolution NameResolution * diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h index 199b0f9..2084480 100644 --- a/gcc/rust/resolve/rust-name-resolver.h +++ b/gcc/rust/resolve/rust-name-resolver.h @@ -274,10 +274,12 @@ public: void push_new_name_rib (Rib *r); void push_new_type_rib (Rib *r); void push_new_label_rib (Rib *r); + void push_new_macro_rib (Rib *r); bool find_name_rib (NodeId id, Rib **rib); bool find_type_rib (NodeId id, Rib **rib); bool find_label_rib (NodeId id, Rib **rib); + bool find_macro_rib (NodeId id, Rib **rib); void insert_new_definition (NodeId id, Definition def); bool lookup_definition (NodeId id, Definition *def); @@ -291,10 +293,14 @@ public: void insert_resolved_label (NodeId refId, NodeId defId); bool lookup_resolved_label (NodeId refId, NodeId *defId); + void insert_resolved_macro (NodeId refId, NodeId defId); + bool lookup_resolved_macro (NodeId refId, NodeId *defId); + // proxy for scoping Scope &get_name_scope () { return name_scope; } Scope &get_type_scope () { return type_scope; } Scope &get_label_scope () { return label_scope; } + Scope &get_macro_scope () { return macro_scope; } NodeId get_global_type_node_id () { return global_type_node_id; } @@ -371,6 +377,7 @@ private: Scope name_scope; Scope type_scope; Scope label_scope; + Scope macro_scope; NodeId global_type_node_id; NodeId unit_ty_node_id; @@ -379,6 +386,7 @@ private: std::map<NodeId, Rib *> name_ribs; std::map<NodeId, Rib *> type_ribs; std::map<NodeId, Rib *> label_ribs; + std::map<NodeId, Rib *> macro_ribs; // map any Node to its Definition // ie any name or type usage @@ -395,6 +403,7 @@ private: std::map<NodeId, NodeId> resolved_names; std::map<NodeId, NodeId> resolved_types; std::map<NodeId, NodeId> resolved_labels; + std::map<NodeId, NodeId> resolved_macros; // map of resolved names mutability flag std::map<NodeId, bool> decl_mutability; |