{
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
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 ¯o : 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);