]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
gccrs: Document proc macro token tree indices
authorPierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
Mon, 23 Oct 2023 13:00:54 +0000 (15:00 +0200)
committerArthur Cohen <arthur.cohen@embecosm.com>
Tue, 16 Jan 2024 18:09:34 +0000 (19:09 +0100)
Multiple references to procedural macro token trees were left as magic
number in the code. This commit introduces some constexpr for those along
some explanation for the selected value.

gcc/rust/ChangeLog:

* backend/rust-compile-base.cc (get_attributes): Add documentation for
indices 3 and 4.
(get_trait_name): Add documentation for index 1.

Signed-off-by: Pierre-Emmanuel Patry <pierre-emmanuel.patry@embecosm.com>
gcc/rust/backend/rust-compile-base.cc

index fe6d5e3380f689e81668c0520183c8e52a80e57c..b4a3685ad93c26779f0640d9888d0a75a71cdba8 100644 (file)
@@ -165,12 +165,24 @@ get_attributes (const AST::Attribute &attr)
 
   // TODO: Should we rely on fixed index ? Should we search for the
   // attribute tokentree instead ?
-  if (tt.get_token_trees ().size () > 3)
+
+  // Derive proc macros have the following format:
+  // #[proc_macro_derive(TraitName, attributes(attr1, attr2, attr3))]
+  //                    -~~~~~~~~ - ~~~~~~~~~~---------------------
+  //                    ^0  ^1    ^2     ^3           ^4
+  // - "attributes" is stored at position 3 in the token tree
+  // - attribute are stored in the delimited token tree in position 4
+  constexpr size_t attr_kw_pos = 3;
+  constexpr size_t attribute_list_pos = 4;
+
+  if (tt.get_token_trees ().size () > attr_kw_pos)
     {
-      rust_assert (tt.get_token_trees ()[3]->as_string () == "attributes");
+      rust_assert (tt.get_token_trees ()[attr_kw_pos]->as_string ()
+                  == "attributes");
 
       auto attributes = static_cast<const AST::DelimTokenTree *> (
-       tt.get_token_trees ()[4].get ());
+       tt.get_token_trees ()[attribute_list_pos].get ());
+
       auto &token_trees = attributes->get_token_trees ();
 
       for (auto i = token_trees.cbegin () + 1; // Skip opening parenthesis
@@ -186,11 +198,18 @@ get_attributes (const AST::Attribute &attr)
 static std::string
 get_trait_name (const AST::Attribute &attr)
 {
+  // Derive proc macros have the following format:
+  // #[proc_macro_derive(TraitName, attributes(attr1, attr2, attr3))]
+  //                    -~~~~~~~~ - ~~~~~~~~~~---------------------
+  //                    ^0  ^1    ^2     ^3           ^4
+  // - The trait name is stored at position 1
+  constexpr size_t trait_name_pos = 1;
+
   rust_assert (attr.get_attr_input ().get_attr_input_type ()
               == Rust::AST::AttrInput::TOKEN_TREE);
   const auto &tt
     = static_cast<const AST::DelimTokenTree &> (attr.get_attr_input ());
-  return tt.get_token_trees ()[1]->as_string ();
+  return tt.get_token_trees ()[trait_name_pos]->as_string ();
 }
 
 void