diff options
Diffstat (limited to 'gcc/rust/expand/rust-expand-visitor.h')
| -rw-r--r-- | gcc/rust/expand/rust-expand-visitor.h | 67 | 
1 files changed, 50 insertions, 17 deletions
diff --git a/gcc/rust/expand/rust-expand-visitor.h b/gcc/rust/expand/rust-expand-visitor.h index 845e10c..b79eb66 100644 --- a/gcc/rust/expand/rust-expand-visitor.h +++ b/gcc/rust/expand/rust-expand-visitor.h @@ -19,7 +19,9 @@  #ifndef RUST_EXPAND_VISITOR_H  #define RUST_EXPAND_VISITOR_H +#include "rust-ast-pointer-visitor.h"  #include "rust-ast-visitor.h" +#include "rust-item.h"  #include "rust-macro-expand.h"  #include "rust-proc-macro.h" @@ -35,27 +37,48 @@ bool is_derive (AST::Attribute &attr);   */  bool is_builtin (AST::Attribute &attr); -class ExpandVisitor : public AST::DefaultASTVisitor +class ExpandVisitor : public AST::PointerVisitor  {  public: -  ExpandVisitor (MacroExpander &expander) : expander (expander) {} +  ExpandVisitor (MacroExpander &expander) +    : expander (expander), macro_invoc_expect_id (UNKNOWN_NODEID) +  {}    /* Expand all of the macro invocations currently contained in a crate */    void go (AST::Crate &crate); -  using AST::DefaultASTVisitor::visit; +  using AST::PointerVisitor::reseat; +  using AST::PointerVisitor::visit; -  /* -     Maybe expand a macro invocation in lieu of an expression -     expr : Core guidelines R33, this function reseat the pointer. -  */ -  void maybe_expand_expr (std::unique_ptr<AST::Expr> &expr); +  void reseat (std::unique_ptr<AST::Expr> &ptr) override +  { +    maybe_expand_expr (ptr); +  } -  /* -     Maybe expand a macro invocation in lieu of a type -     type : Core guidelines R33, this function reseat the pointer. +  void reseat (std::unique_ptr<AST::Type> &ptr) override +  { +    maybe_expand_type (ptr); +  } + +  void reseat (std::unique_ptr<AST::TypeNoBounds> &ptr) override +  { +    maybe_expand_type (ptr); +  } + +  void reseat (std::unique_ptr<AST::Pattern> &ptr) override +  { +    maybe_expand_pattern (ptr); +  } + +  /** +   * Maybe expand a macro invocation in lieu of an expression, type or pattern. +   * +   * @ptr Core guidelines R33, this function reseats the pointer.     */ -  void maybe_expand_type (std::unique_ptr<AST::Type> &type); +  void maybe_expand_expr (std::unique_ptr<AST::Expr> &ptr); +  void maybe_expand_type (std::unique_ptr<AST::Type> &ptr); +  void maybe_expand_type (std::unique_ptr<AST::TypeNoBounds> &type); +  void maybe_expand_pattern (std::unique_ptr<AST::Pattern> &ptr);    /**     * Expand all macro invocations in lieu of types within a vector of struct @@ -128,7 +151,10 @@ public:  	auto &value = *it;  	// Perform expansion +	NodeId old_expect = value->get_node_id (); +	std::swap (macro_invoc_expect_id, old_expect);  	value->accept_vis (*this); +	std::swap (macro_invoc_expect_id, old_expect);  	auto final_fragment = expander.take_expanded_fragment (); @@ -210,17 +236,16 @@ public:    void visit (AST::AttrInputMacro &) override;    void visit (AST::MetaItemLitExpr &) override;    void visit (AST::MetaItemPathExpr &) override; -  void visit (AST::ErrorPropagationExpr &expr) override;    void visit (AST::ArithmeticOrLogicalExpr &expr) override;    void visit (AST::ComparisonExpr &expr) override;    void visit (AST::LazyBooleanExpr &expr) override; +  void visit (AST::TypeCastExpr &expr) override;    void visit (AST::AssignmentExpr &expr) override;    void visit (AST::CompoundAssignmentExpr &expr) override;    void visit (AST::GroupedExpr &expr) override;    void visit (AST::StructExprStruct &expr) override;    void visit (AST::CallExpr &expr) override; -  void visit (AST::MethodCallExpr &expr) override;    void visit (AST::ClosureExprInner &expr) override;    void visit (AST::BlockExpr &expr) override; @@ -231,7 +256,7 @@ public:    void visit (AST::IfExprConseqElse &expr) override;    void visit (AST::IfLetExpr &expr) override;    void visit (AST::IfLetExprConseqElse &expr) override; -  void visit (AST::MatchExpr &expr) override; +  void visit (AST::TupleExpr &expr) override;    void visit (AST::TypeParam ¶m) override;    void visit (AST::LifetimeWhereClauseItem &) override;    void visit (AST::TypeBoundWhereClauseItem &item) override; @@ -251,7 +276,6 @@ public:    void visit (AST::Union &union_item) override;    void visit (AST::ConstantItem &const_item) override;    void visit (AST::StaticItem &static_item) override; -  void visit (AST::TraitItemConst &item) override;    void visit (AST::Trait &trait) override;    void visit (AST::InherentImpl &impl) override;    void visit (AST::TraitImpl &impl) override; @@ -269,12 +293,20 @@ public:    void visit (AST::MetaListNameValueStr &) override;    void visit (AST::StructPatternFieldIdent &field) override;    void visit (AST::GroupedPattern &pattern) override; +  void visit (AST::SlicePatternItemsNoRest &items) override; +  void visit (AST::SlicePatternItemsHasRest &items) override; +  void visit (AST::AltPattern &pattern) override; +  void visit (AST::TupleStructItemsNoRest &tuple_items) override; +  void visit (AST::TupleStructItemsHasRest &tuple_items) override; +  void visit (AST::TuplePatternItemsNoRest &tuple_items) override; +  void visit (AST::TuplePatternItemsHasRest &tuple_items) override;    void visit (AST::LetStmt &stmt) override;    void visit (AST::ExprStmt &stmt) override;    void visit (AST::BareFunctionType &type) override; -  void visit (AST::FunctionParam &type) override; +  void visit (AST::FunctionParam ¶m) override; +  void visit (AST::VariadicParam ¶m) override;    void visit (AST::SelfParam &type) override;    template <typename T> @@ -287,6 +319,7 @@ public:  private:    MacroExpander &expander; +  NodeId macro_invoc_expect_id;  };  } // namespace Rust  | 
