]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: resolve: Add extern crate proc macro collection
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Fri, 16 Jun 2023 16:17:39 +0000 (18:17 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 17:55:58 +0000 (18:55 +0100)
Create a mapping for procedural macros with their crate num.

gcc/rust/ChangeLog:

* metadata/rust-extern-crate.h: Add proc macro getter.
* rust-session-manager.cc (Session::load_extern_crate): Collect
mappings and create mappings.
* util/rust-hir-map.cc: Add insertion and lookup functions for
every mapping.
* util/rust-hir-map.h: Add function prototypes.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/metadata/rust-extern-crate.h
gcc/rust/rust-session-manager.cc
gcc/rust/util/rust-hir-map.cc
gcc/rust/util/rust-hir-map.h

index cf7eadcb7eb72ada036dfd05316dbb63842eae3e..fcd54f66425bd655c5ffe742a740f9d547816e96 100644 (file)
@@ -40,6 +40,8 @@ public:
 
   const std::string &get_metadata () const;
 
+  std::vector<ProcMacro::Procmacro> &get_proc_macros () { return proc_macros; }
+
   static bool string_to_int (location_t locus, const std::string &s,
                             bool is_neg_ok, int *ret);
 
index 572ecfad49bd88df36dd352dee06c71a8024b442..ee7dd0830e36bfc75c1609e13f4d5bc6ac5c83e4 100644 (file)
@@ -1024,6 +1024,32 @@ Session::load_extern_crate (const std::string &crate_name, location_t locus)
   Lexer lex (extern_crate.get_metadata ());
   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;
+  for (auto &macro : extern_crate.get_proc_macros ())
+    {
+      switch (macro.tag)
+       {
+       case ProcMacro::CUSTOM_DERIVE:
+         derive_macros.push_back (macro.payload.custom_derive);
+         break;
+       case ProcMacro::ATTR:
+         attribute_macros.push_back (macro.payload.attribute);
+         break;
+       case ProcMacro::BANG:
+         bang_macros.push_back (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);
 
index c9696365dc2177bb8a57d5c368bc0533fcbf8fa5..caf44a282490d50fcc0dd4e401d9483e50417273 100644 (file)
@@ -942,6 +942,70 @@ Mappings::get_exported_macros ()
   return exportedMacros;
 }
 
+void
+Mappings::insert_derive_proc_macros (
+  CrateNum num, std::vector<ProcMacro::CustomDerive> macros)
+{
+  auto it = procmacrosDeriveMappings.find (num);
+  rust_assert (it == procmacrosDeriveMappings.end ());
+
+  procmacrosDeriveMappings[num] = macros;
+}
+
+void
+Mappings::insert_bang_proc_macros (CrateNum num,
+                                  std::vector<ProcMacro::Bang> macros)
+{
+  auto it = procmacrosBangMappings.find (num);
+  rust_assert (it == procmacrosBangMappings.end ());
+
+  procmacrosBangMappings[num] = macros;
+}
+
+void
+Mappings::insert_attribute_proc_macros (
+  CrateNum num, std::vector<ProcMacro::Attribute> macros)
+{
+  auto it = procmacrosAttributeMappings.find (num);
+  rust_assert (it == procmacrosAttributeMappings.end ());
+
+  procmacrosAttributeMappings[num] = macros;
+}
+
+bool
+Mappings::lookup_derive_proc_macros (
+  CrateNum num, std::vector<ProcMacro::CustomDerive> &macros)
+{
+  auto it = procmacrosDeriveMappings.find (num);
+  if (it == procmacrosDeriveMappings.end ())
+    return false;
+
+  macros = it->second;
+  return true;
+}
+bool
+Mappings::lookup_bang_proc_macros (CrateNum num,
+                                  std::vector<ProcMacro::Bang> &macros)
+{
+  auto it = procmacrosBangMappings.find (num);
+  if (it == procmacrosBangMappings.end ())
+    return false;
+
+  macros = it->second;
+  return true;
+}
+bool
+Mappings::lookup_attribute_proc_macros (
+  CrateNum num, std::vector<ProcMacro::Attribute> &macros)
+{
+  auto it = procmacrosAttributeMappings.find (num);
+  if (it == procmacrosAttributeMappings.end ())
+    return false;
+
+  macros = it->second;
+  return true;
+}
+
 void
 Mappings::insert_derive_proc_macro (
   std::pair<std::string, std::string> hierarchy, ProcMacro::CustomDerive macro)
index 7f3f4fb7a155217364f434ea7aab19f6b2e9c1eb..a47898b84048f8200b1f4508997976ae2da99ca9 100644 (file)
@@ -283,6 +283,20 @@ public:
   void insert_exported_macro (AST::MacroRulesDefinition &def);
   std::vector<NodeId> &get_exported_macros ();
 
+  void insert_derive_proc_macros (CrateNum num,
+                                 std::vector<ProcMacro::CustomDerive> macros);
+  void insert_bang_proc_macros (CrateNum num,
+                               std::vector<ProcMacro::Bang> macros);
+  void insert_attribute_proc_macros (CrateNum num,
+                                    std::vector<ProcMacro::Attribute> macros);
+
+  bool lookup_derive_proc_macros (CrateNum num,
+                                 std::vector<ProcMacro::CustomDerive> &macros);
+  bool lookup_bang_proc_macros (CrateNum num,
+                               std::vector<ProcMacro::Bang> &macros);
+  bool lookup_attribute_proc_macros (CrateNum num,
+                                    std::vector<ProcMacro::Attribute> &macros);
+
   void insert_derive_proc_macro (std::pair<std::string, std::string> hierachy,
                                 ProcMacro::CustomDerive macro);
   void insert_bang_proc_macro (std::pair<std::string, std::string> hierachy,
@@ -376,6 +390,14 @@ private:
   std::vector<NodeId> exportedMacros;
 
   // Procedural macros
+  std::map<CrateNum, std::vector<ProcMacro::CustomDerive>>
+    procmacrosDeriveMappings;
+
+  std::map<CrateNum, std::vector<ProcMacro::Bang>> procmacrosBangMappings;
+
+  std::map<CrateNum, std::vector<ProcMacro::Attribute>>
+    procmacrosAttributeMappings;
+
   std::map<std::pair<std::string, std::string>, ProcMacro::CustomDerive>
     procmacroDeriveMappings;