]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Add proc macro top level discovery
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Tue, 1 Aug 2023 10:45:11 +0000 (12:45 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:04:33 +0000 (19:04 +0100)
Add mechanism to discover proc macros in loaded extern crates. In the
top level resolver.

gcc/rust/ChangeLog:

* resolve/rust-toplevel-name-resolver-2.0.cc (TopLevel::go):
Visit crate's newly stored proc macros.
* rust-session-manager.cc (Session::load_extern_crate):
Store proc macros in the parsed crate instead of a local
variable to achieve mappings.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/resolve/rust-toplevel-name-resolver-2.0.cc
gcc/rust/rust-session-manager.cc

index e6c48d5d0edf71d8b61987e44b4ce42d0de0f920..ed039de2a67714d4b0667b71bbaf42a867bc508b 100644 (file)
@@ -55,6 +55,40 @@ TopLevel::go (AST::Crate &crate)
 {
   for (auto &item : crate.items)
     item->accept_vis (*this);
+
+  for (auto &derive : crate.get_derive_macros ())
+    {
+      auto res = ctx.macros.insert_at_root (derive.get_trait_name (),
+                                           derive.get_node_id ());
+      if (!res)
+       {
+         rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+                        "macro %qs defined multiple times",
+                        derive.get_trait_name ().c_str ());
+       }
+    }
+  for (auto &attribute : crate.get_attribute_macros ())
+    {
+      auto res = ctx.macros.insert_at_root (attribute.get_name (),
+                                           attribute.get_node_id ());
+      if (!res)
+       {
+         rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+                        "macro %qs defined multiple times",
+                        attribute.get_name ().c_str ());
+       }
+    }
+  for (auto &bang : crate.get_bang_macros ())
+    {
+      auto res
+       = ctx.macros.insert_at_root (bang.get_name (), bang.get_node_id ());
+      if (!res)
+       {
+         rust_error_at (UNKNOWN_LOCATION, ErrorCode::E0428,
+                        "macro %qs defined multiple times",
+                        bang.get_name ().c_str ());
+       }
+    }
 }
 
 void
index 292506d5e573bb11ea4b57c5a88b4746fc25cd23..6f2657c68acfaf8ef4956636e29fae484ab645dc 100644 (file)
@@ -1053,34 +1053,27 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus)
   Parser<Lexer> parser (lex);
   std::unique_ptr<AST::Crate> metadata_crate = parser.parse_crate ();
 
-  std::vector<ProcMacro::Attribute> attribute_macros;
-  std::vector<ProcMacro::CustomDerive> derive_macros;
-  std::vector<ProcMacro::Bang> bang_macros;
+  AST::Crate &parsed_crate
+    = mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
+
   for (auto &macro : extern_crate.get_proc_macros ())
     {
       switch (macro.tag)
        {
        case ProcMacro::CUSTOM_DERIVE:
-         derive_macros.push_back (macro.payload.custom_derive);
+         parsed_crate.add_derive_macro (macro.payload.custom_derive);
          break;
        case ProcMacro::ATTR:
-         attribute_macros.push_back (macro.payload.attribute);
+         parsed_crate.add_attribute_macro (macro.payload.attribute);
          break;
        case ProcMacro::BANG:
-         bang_macros.push_back (macro.payload.bang);
+         parsed_crate.add_bang_macro (macro.payload.bang);
          break;
        default:
          gcc_unreachable ();
        }
     }
 
-  mappings->insert_attribute_proc_macros (crate_num, attribute_macros);
-  mappings->insert_derive_proc_macros (crate_num, derive_macros);
-  mappings->insert_bang_proc_macros (crate_num, bang_macros);
-
-  AST::Crate &parsed_crate
-    = mappings->insert_ast_crate (std::move (metadata_crate), crate_num);
-
   // name resolve it
   Resolver::NameResolution::Resolve (parsed_crate);