From 1a2ef9cae90db5bdb18723b6adafe2750a95ed76 Mon Sep 17 00:00:00 2001 From: Arthur Cohen Date: Mon, 14 Mar 2022 17:08:07 +0100 Subject: macros: Add remaining context and improve parsing macro dispatch This allows us to expand macor invocations in more places, as macro calls are not limited to statements or expressions. It is quite common to use macros to abstract writing repetitive boilerplate for type implementations, for example. --- gcc/rust/parse/rust-parse-impl.h | 7 ++++--- gcc/rust/parse/rust-parse.h | 6 +++--- 2 files changed, 7 insertions(+), 6 deletions(-) (limited to 'gcc/rust/parse') diff --git a/gcc/rust/parse/rust-parse-impl.h b/gcc/rust/parse/rust-parse-impl.h index 0bbd8fb..82e7e24 100644 --- a/gcc/rust/parse/rust-parse-impl.h +++ b/gcc/rust/parse/rust-parse-impl.h @@ -5251,12 +5251,11 @@ Parser::parse_inherent_impl_item () switch (t->get_id ()) { case IDENTIFIER: + // FIXME: Arthur: Do we need to some lookahead here? + return parse_macro_invocation_semi (outer_attrs); case SUPER: case SELF: case CRATE: - case DOLLAR_SIGN: - // these seem to be SimplePath tokens, so this is a macro invocation semi - return parse_macro_invocation_semi (std::move (outer_attrs)); case PUB: { // visibility, so not a macro invocation semi - must be constant, // function, or method @@ -5813,6 +5812,8 @@ Parser::parse_external_item () const_TokenPtr t = lexer.peek_token (); switch (t->get_id ()) { + case IDENTIFIER: + return parse_macro_invocation_semi (outer_attrs); case STATIC_TOK: { // parse extern static item lexer.skip_token (); diff --git a/gcc/rust/parse/rust-parse.h b/gcc/rust/parse/rust-parse.h index 5fcb305..bb5bf3d 100644 --- a/gcc/rust/parse/rust-parse.h +++ b/gcc/rust/parse/rust-parse.h @@ -135,6 +135,9 @@ public: */ std::unique_ptr parse_stmt (bool allow_no_semi = false); std::unique_ptr parse_type (); + std::unique_ptr parse_external_item (); + std::unique_ptr parse_trait_item (); + std::unique_ptr parse_inherent_impl_item (); AST::PathInExpression parse_path_in_expression (); std::vector > parse_lifetime_params (); AST::Visibility parse_visibility (); @@ -285,7 +288,6 @@ private: AST::AttrVec outer_attrs); std::unique_ptr parse_trait (AST::Visibility vis, AST::AttrVec outer_attrs); - std::unique_ptr parse_trait_item (); std::unique_ptr parse_trait_type (AST::AttrVec outer_attrs); std::unique_ptr @@ -293,7 +295,6 @@ private: AST::SelfParam parse_self_param (); std::unique_ptr parse_impl (AST::Visibility vis, AST::AttrVec outer_attrs); - std::unique_ptr parse_inherent_impl_item (); std::unique_ptr parse_inherent_impl_function_or_method (AST::Visibility vis, AST::AttrVec outer_attrs); @@ -303,7 +304,6 @@ private: AST::AttrVec outer_attrs); std::unique_ptr parse_extern_block (AST::Visibility vis, AST::AttrVec outer_attrs); - std::unique_ptr parse_external_item (); AST::NamedFunctionParam parse_named_function_param (AST::AttrVec outer_attrs = AST::AttrVec ()); AST::Method parse_method (); -- cgit v1.1