diff options
Diffstat (limited to 'gcc/rust/ast/rust-macro.h')
-rw-r--r-- | gcc/rust/ast/rust-macro.h | 52 |
1 files changed, 49 insertions, 3 deletions
diff --git a/gcc/rust/ast/rust-macro.h b/gcc/rust/ast/rust-macro.h index 9f8f19c..2b39624 100644 --- a/gcc/rust/ast/rust-macro.h +++ b/gcc/rust/ast/rust-macro.h @@ -27,7 +27,6 @@ namespace AST { // Decls as definitions moved to rust-ast.h class MacroItem; -class MacroInvocationSemi; enum MacroFragSpec { @@ -454,6 +453,10 @@ protected: * compile time */ class MacroInvocation : public TypeNoBounds, public Pattern, + public MacroItem, + public TraitItem, + public TraitImplItem, + public InherentImplItem, public ExprWithoutBlock { std::vector<Attribute> outer_attrs; @@ -463,14 +466,22 @@ class MacroInvocation : public TypeNoBounds, // this is the expanded macro ASTFragment fragment; + // Important for when we actually expand the macro + bool is_semi_coloned; + + NodeId node_id; + public: std::string as_string () const override; MacroInvocation (MacroInvocData invoc_data, - std::vector<Attribute> outer_attrs, Location locus) + std::vector<Attribute> outer_attrs, Location locus, + bool is_semi_coloned = false) : outer_attrs (std::move (outer_attrs)), invoc_data (std::move (invoc_data)), locus (locus), - fragment (ASTFragment::create_empty ()) + fragment (ASTFragment::create_empty ()), + is_semi_coloned (is_semi_coloned), + node_id (Analysis::Mappings::get ()->get_next_node_id ()) {} Location get_locus () const override final { return locus; } @@ -497,12 +508,16 @@ public: return ExprWithoutBlock::get_node_id (); } + NodeId get_macro_node_id () const { return node_id; } + MacroInvocData &get_invoc_data () { return invoc_data; } ASTFragment &get_fragment () { return fragment; } void set_fragment (ASTFragment &&f) { fragment = std::move (f); } + bool has_semicolon () const { return is_semi_coloned; } + protected: /* Use covariance to implement clone function as returning this object rather * than base */ @@ -529,6 +544,37 @@ protected: { return new MacroInvocation (*this); } + + Item *clone_item_impl () const override + { + return clone_macro_invocation_impl (); + } + + bool is_item () const override { return !has_semicolon (); } + + TraitItem *clone_trait_item_impl () const override + { + return clone_macro_invocation_impl (); + }; + + TraitImplItem *clone_trait_impl_item_impl () const override + { + return clone_macro_invocation_impl (); + }; + + InherentImplItem *clone_inherent_impl_item_impl () const override + { + return clone_macro_invocation_impl (); + } + + ExprWithoutBlock *to_stmt () const override + + { + auto new_impl = clone_macro_invocation_impl (); + new_impl->is_semi_coloned = true; + + return new_impl; + } }; // more generic meta item path-only form |