diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-08-21 16:52:48 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2024-01-30 12:36:46 +0100 |
commit | 53d979f361f214ead438c62d74a9adb2c4383651 (patch) | |
tree | 4e493eb9ec2b7a20be8ea7f47aed0e128cb6c33f | |
parent | 0f0ec052b4ad1fb7250a5ad1ec00d276fdc29a09 (diff) | |
download | gcc-53d979f361f214ead438c62d74a9adb2c4383651.zip gcc-53d979f361f214ead438c62d74a9adb2c4383651.tar.gz gcc-53d979f361f214ead438c62d74a9adb2c4383651.tar.bz2 |
gccrs: early: Resolve paths properly
gcc/rust/ChangeLog:
* resolve/rust-early-name-resolver-2.0.cc
(Early::insert_once): New function.
(Early::visit): Likewise.
* resolve/rust-early-name-resolver-2.0.h: Likewise.
-rw-r--r-- | gcc/rust/resolve/rust-early-name-resolver-2.0.cc | 30 | ||||
-rw-r--r-- | gcc/rust/resolve/rust-early-name-resolver-2.0.h | 10 |
2 files changed, 40 insertions, 0 deletions
diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc index 2245ba3..48bb4c6 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.cc +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.cc @@ -27,6 +27,33 @@ namespace Resolver2_0 { Early::Early (NameResolutionContext &ctx) : DefaultResolver (ctx) {} void +Early::insert_once (AST::MacroInvocation &invocation, NodeId resolved) +{ + // TODO: Should we use `ctx.mark_resolved()`? + AST::MacroRulesDefinition *definition; + auto ok = ctx.mappings.lookup_macro_def (resolved, &definition); + + rust_assert (ok); + + AST::MacroRulesDefinition *existing; + auto exists = ctx.mappings.lookup_macro_invocation (invocation, &existing); + + if (!exists) + ctx.mappings.insert_macro_invocation (invocation, definition); +} + +void +Early::insert_once (AST::MacroRulesDefinition &def) +{ + // TODO: Should we use `ctx.mark_resolved()`? + AST::MacroRulesDefinition *definition; + auto exists = ctx.mappings.lookup_macro_def (def.get_node_id (), &definition); + + if (!exists) + ctx.mappings.insert_macro_def (&def); +} + +void Early::go (AST::Crate &crate) { // First we go through TopLevel resolution to get all our declared items @@ -89,6 +116,7 @@ Early::visit (AST::MacroRulesDefinition &def) DefaultResolver::visit (def); textual_scope.insert (def.get_rule_name ().as_string (), def.get_node_id ()); + insert_once (def); } void @@ -141,6 +169,8 @@ Early::visit (AST::MacroInvocation &invoc) return; } + insert_once (invoc, *definition); + // now do we need to keep mappings or something? or insert "uses" into our // ForeverStack? can we do that? are mappings simpler? auto mappings = Analysis::Mappings::get (); diff --git a/gcc/rust/resolve/rust-early-name-resolver-2.0.h b/gcc/rust/resolve/rust-early-name-resolver-2.0.h index dc27319..46c4b93 100644 --- a/gcc/rust/resolve/rust-early-name-resolver-2.0.h +++ b/gcc/rust/resolve/rust-early-name-resolver-2.0.h @@ -61,6 +61,16 @@ private: void visit_attributes (std::vector<AST::Attribute> &attrs); /** + * Insert a resolved macro invocation into the mappings once, meaning that we + * can call this function each time the early name resolution pass is underway + * and it will not trigger assertions for already resolved invocations. + */ + // TODO: Rename + void insert_once (AST::MacroInvocation &invocation, NodeId resolved); + // TODO: Rename + void insert_once (AST::MacroRulesDefinition &definition); + + /** * Macros can either be resolved through textual scoping or regular path * scoping - which this class represents. Textual scoping works similarly to a * "simple" name resolution algorith, with the addition of "shadowing". Each |