diff options
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-item.h | 3 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve-unused.h | 1 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-ast-resolve.cc | 37 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-name-resolver.h | 15 |
4 files changed, 55 insertions, 1 deletions
diff --git a/gcc/rust/resolve/rust-ast-resolve-item.h b/gcc/rust/resolve/rust-ast-resolve-item.h index 8b6227e..f5dc579 100644 --- a/gcc/rust/resolve/rust-ast-resolve-item.h +++ b/gcc/rust/resolve/rust-ast-resolve-item.h @@ -88,8 +88,10 @@ public: NodeId scope_node_id = function.get_node_id (); resolver->get_name_scope ().push (scope_node_id); resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); // we make a new scope so the names of parameters are resolved and shadowed // correctly @@ -111,6 +113,7 @@ public: resolver->get_name_scope ().pop (); resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); } void visit (AST::InherentImpl &impl_block) diff --git a/gcc/rust/resolve/rust-ast-resolve-unused.h b/gcc/rust/resolve/rust-ast-resolve-unused.h index 928cf11..748f972 100644 --- a/gcc/rust/resolve/rust-ast-resolve-unused.h +++ b/gcc/rust/resolve/rust-ast-resolve-unused.h @@ -43,6 +43,7 @@ public: auto resolver = Resolver::get (); resolver->iterate_name_ribs ([&] (Rib *r) -> void { ScanRib (r); }); resolver->iterate_type_ribs ([&] (Rib *r) -> void { ScanRib (r); }); + resolver->iterate_label_ribs ([&] (Rib *r) -> void { ScanRib (r); }); } }; diff --git a/gcc/rust/resolve/rust-ast-resolve.cc b/gcc/rust/resolve/rust-ast-resolve.cc index 593a732..0ed2bfb 100644 --- a/gcc/rust/resolve/rust-ast-resolve.cc +++ b/gcc/rust/resolve/rust-ast-resolve.cc @@ -49,7 +49,8 @@ namespace Resolver { Resolver::Resolver () : mappings (Analysis::Mappings::get ()), tyctx (TypeCheckContext::get ()), name_scope (Scope (mappings->get_current_crate ())), - type_scope (Scope (mappings->get_current_crate ())) + type_scope (Scope (mappings->get_current_crate ())), + label_scope (Scope (mappings->get_current_crate ())) { generate_builtins (); } @@ -81,6 +82,13 @@ Resolver::push_new_type_rib (Rib *r) type_ribs[r->get_node_id ()] = r; } +void +Resolver::push_new_label_rib (Rib *r) +{ + rust_assert (label_ribs.find (r->get_node_id ()) == label_ribs.end ()); + label_ribs[r->get_node_id ()] = r; +} + bool Resolver::find_name_rib (NodeId id, Rib **rib) { @@ -238,6 +246,27 @@ Resolver::lookup_resolved_type (NodeId refId, NodeId *defId) return true; } +void +Resolver::insert_resolved_label (NodeId refId, NodeId defId) +{ + auto it = resolved_labels.find (refId); + rust_assert (it == resolved_labels.end ()); + + resolved_types[refId] = defId; + get_label_scope ().append_reference_for_def (refId, defId); +} + +bool +Resolver::lookup_resolved_label (NodeId refId, NodeId *defId) +{ + auto it = resolved_labels.find (refId); + if (it == resolved_labels.end ()) + return false; + + *defId = it->second; + return true; +} + // NameResolution NameResolution * @@ -275,6 +304,9 @@ NameResolution::go (AST::Crate &crate) // setup parent scoping for new types resolver->get_type_scope ().push (mappings->get_next_node_id ()); resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + // setup label scope + resolver->get_label_scope ().push (mappings->get_next_node_id ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); // first gather the top-level namespace names then we drill down for (auto it = crate.items.begin (); it != crate.items.end (); it++) @@ -293,8 +325,10 @@ ResolveExpr::visit (AST::BlockExpr &expr) NodeId scope_node_id = expr.get_node_id (); resolver->get_name_scope ().push (scope_node_id); resolver->get_type_scope ().push (scope_node_id); + resolver->get_label_scope ().push (scope_node_id); resolver->push_new_name_rib (resolver->get_name_scope ().peek ()); resolver->push_new_type_rib (resolver->get_type_scope ().peek ()); + resolver->push_new_label_rib (resolver->get_type_scope ().peek ()); expr.iterate_stmts ([&] (AST::Stmt *s) mutable -> bool { ResolveStmt::go (s, s->get_node_id ()); @@ -306,6 +340,7 @@ ResolveExpr::visit (AST::BlockExpr &expr) resolver->get_name_scope ().pop (); resolver->get_type_scope ().pop (); + resolver->get_label_scope ().pop (); } // rust-ast-resolve-struct-expr-field.h diff --git a/gcc/rust/resolve/rust-name-resolver.h b/gcc/rust/resolve/rust-name-resolver.h index ea0e4f5..9c01d47 100644 --- a/gcc/rust/resolve/rust-name-resolver.h +++ b/gcc/rust/resolve/rust-name-resolver.h @@ -250,9 +250,11 @@ public: void push_new_name_rib (Rib *r); void push_new_type_rib (Rib *r); + void push_new_label_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); void insert_new_definition (NodeId id, Definition def); bool lookup_definition (NodeId id, Definition *def); @@ -263,9 +265,13 @@ public: void insert_resolved_type (NodeId refId, NodeId defId); bool lookup_resolved_type (NodeId refId, NodeId *defId); + void insert_resolved_label (NodeId refId, NodeId defId); + bool lookup_resolved_label (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; } NodeId get_global_type_node_id () { return global_type_node_id; } @@ -320,6 +326,12 @@ public: } } + void iterate_label_ribs (std::function<void (Rib *)> cb) + { + for (auto it = label_ribs.begin (); it != label_ribs.end (); it++) + cb (it->second); + } + private: Resolver (); @@ -332,6 +344,7 @@ private: Scope name_scope; Scope type_scope; + Scope label_scope; NodeId global_type_node_id; NodeId unit_ty_node_id; @@ -339,6 +352,7 @@ private: // map a AST Node to a Rib std::map<NodeId, Rib *> name_ribs; std::map<NodeId, Rib *> type_ribs; + std::map<NodeId, Rib *> label_ribs; // map any Node to its Definition // ie any name or type usage @@ -354,6 +368,7 @@ private: // we need two namespaces one for names and ones for types std::map<NodeId, NodeId> resolved_names; std::map<NodeId, NodeId> resolved_types; + std::map<NodeId, NodeId> resolved_labels; // map of resolved names mutability flag std::map<NodeId, bool> decl_mutability; |