diff options
Diffstat (limited to 'gcc/rust/backend')
-rw-r--r-- | gcc/rust/backend/rust-compile-base.cc | 27 |
1 files changed, 23 insertions, 4 deletions
diff --git a/gcc/rust/backend/rust-compile-base.cc b/gcc/rust/backend/rust-compile-base.cc index fe6d5e3..b4a3685 100644 --- a/gcc/rust/backend/rust-compile-base.cc +++ b/gcc/rust/backend/rust-compile-base.cc @@ -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 |