From f41c335b538466b8e3d9eafdea8c786f89c620c8 Mon Sep 17 00:00:00 2001 From: Owen Avery Date: Fri, 18 Jul 2025 22:55:36 -0400 Subject: [PATCH] Use X macros to simplify ASTVisitor inheritance ASTVisitor itself is left as-is for now, as a sanity check against the contents of "rust-ast-visitable.h". This should slightly reduce the amount of repetition involved with inheriting from ASTVisitor, which might help us deal with the footgun that is ExpandVisitor later. gcc/rust/ChangeLog: * ast/rust-ast-collector.h (CollectItem::visit): Use "rust-ast-visitable.h" to simplify visitor method declarations. * ast/rust-ast-visitor.h (DefaultASTVisitor::visit): Likewise. * ast/rust-ast-visitable.h: New file. Signed-off-by: Owen Avery --- gcc/rust/ast/rust-ast-collector.h | 183 +--------------------------- gcc/rust/ast/rust-ast-visitable.h | 195 ++++++++++++++++++++++++++++++ gcc/rust/ast/rust-ast-visitor.h | 162 +------------------------ 3 files changed, 204 insertions(+), 336 deletions(-) create mode 100644 gcc/rust/ast/rust-ast-visitable.h diff --git a/gcc/rust/ast/rust-ast-collector.h b/gcc/rust/ast/rust-ast-collector.h index e8af5878a2c..439fc2f52c2 100644 --- a/gcc/rust/ast/rust-ast-collector.h +++ b/gcc/rust/ast/rust-ast-collector.h @@ -202,8 +202,6 @@ class TokenCollector : public ASTVisitor void visit (Literal &lit, location_t locus = UNDEF_LOCATION); - void visit (FunctionParam ¶m); - void visit (VariadicParam ¶m); void visit (Attribute &attrib); void visit (Visibility &vis); void visit (std::vector> ¶ms); @@ -219,190 +217,21 @@ class TokenCollector : public ASTVisitor void visit (GenericArgsBinding &binding); void visit (GenericArg &arg); - // rust-ast.h - void visit (Token &tok); - void visit (DelimTokenTree &delim_tok_tree); - void visit (AttrInputMetaItemContainer &input); - void visit (IdentifierExpr &ident_expr); - void visit (Lifetime &lifetime); - void visit (LifetimeParam &lifetime_param); - void visit (ConstGenericParam &const_param); - - // rust-path.h void visit (SimplePath &path); void visit (PathExprSegment &segment); void visit (PathIdentSegment &segment); - void visit (PathInExpression &path); - void visit (TypePathSegment &segment); - void visit (TypePathSegmentGeneric &segment); - void visit (TypePathSegmentFunction &segment); - void visit (TypePath &path); void visit (QualifiedPathType &path); - void visit (QualifiedPathInExpression &path); - void visit (QualifiedPathInType &path); - - // rust-expr.h - void visit (LiteralExpr &expr); - void visit (AttrInputLiteral &attr_input); - void visit (AttrInputMacro &attr_input); - void visit (MetaItemLitExpr &meta_item); - void visit (MetaItemPathLit &meta_item); - void visit (BorrowExpr &expr); - void visit (DereferenceExpr &expr); - void visit (ErrorPropagationExpr &expr); - void visit (NegationExpr &expr); - void visit (ArithmeticOrLogicalExpr &expr); - void visit (ComparisonExpr &expr); - void visit (LazyBooleanExpr &expr); - void visit (TypeCastExpr &expr); - void visit (AssignmentExpr &expr); - void visit (CompoundAssignmentExpr &expr); - void visit (GroupedExpr &expr); - void visit (ArrayElemsValues &elems); - void visit (ArrayElemsCopied &elems); - void visit (ArrayExpr &expr); - void visit (ArrayIndexExpr &expr); - void visit (TupleExpr &expr); - void visit (TupleIndexExpr &expr); - void visit (StructExprStruct &expr); - void visit (StructExprFieldIdentifier &field); - void visit (StructExprFieldIdentifierValue &field); - void visit (StructExprFieldIndexValue &field); + void visit (StructBase &base); - void visit (StructExprStructFields &expr); - void visit (StructExprStructBase &expr); - void visit (CallExpr &expr); - void visit (MethodCallExpr &expr); - void visit (FieldAccessExpr &expr); void visit (ClosureParam ¶m); - void visit (ClosureExprInner &expr); - void visit (BlockExpr &expr); - void visit (AnonConst &expr); - void visit (ConstBlock &expr); - void visit (ClosureExprInnerTyped &expr); - void visit (ContinueExpr &expr); - void visit (BreakExpr &expr); - void visit (RangeFromToExpr &expr); - void visit (RangeFromExpr &expr); - void visit (RangeToExpr &expr); - void visit (RangeFullExpr &expr); - void visit (RangeFromToInclExpr &expr); - void visit (RangeToInclExpr &expr); - void visit (ReturnExpr &expr); - void visit (TryExpr &expr); - void visit (BoxExpr &expr); - void visit (UnsafeBlockExpr &expr); - void visit (LoopExpr &expr); - void visit (WhileLoopExpr &expr); - void visit (WhileLetLoopExpr &expr); - void visit (ForLoopExpr &expr); - void visit (IfExpr &expr); - void visit (IfExprConseqElse &expr); - void visit (IfLetExpr &expr); - void visit (IfLetExprConseqElse &expr); void visit (MatchArm &arm); void visit (MatchCase &arm); - void visit (MatchExpr &expr); - void visit (AwaitExpr &expr); - void visit (AsyncBlockExpr &expr); - void visit (InlineAsm &expr); - void visit (LlvmInlineAsm &expr); - // rust-item.h - void visit (TypeParam ¶m); - void visit (LifetimeWhereClauseItem &item); - void visit (TypeBoundWhereClauseItem &item); - void visit (Module &module); - void visit (ExternCrate &crate); - void visit (UseTreeGlob &use_tree); - void visit (UseTreeList &use_tree); - void visit (UseTreeRebind &use_tree); - void visit (UseDeclaration &use_decl); - void visit (Function &function); - void visit (TypeAlias &type_alias); - void visit (StructStruct &struct_item); - void visit (TupleStruct &tuple_struct); - void visit (EnumItem &item); - void visit (EnumItemTuple &item); - void visit (EnumItemStruct &item); - void visit (EnumItemDiscriminant &item); - void visit (Enum &enumeration); - void visit (Union &union_item); - void visit (ConstantItem &const_item); - void visit (StaticItem &static_item); - void visit (SelfParam ¶m); - void visit (TraitItemConst &item); - void visit (TraitItemType &item); - void visit (Trait &trait); - void visit (InherentImpl &impl); - void visit (TraitImpl &impl); - void visit (ExternalTypeItem &item); - void visit (ExternalStaticItem &item); - void visit (ExternBlock &block); - - // rust-macro.h - void visit (MacroMatchFragment &match); - void visit (MacroMatchRepetition &match); - void visit (MacroMatcher &matcher); - void visit (MacroRulesDefinition &rules_def); + void visit (MacroInvocData &invoc_data); - void visit (MacroInvocation ¯o_invoc); - void visit (MetaItemPath &meta_item); - void visit (MetaItemSeq &meta_item); - void visit (MetaWord &meta_item); - void visit (MetaNameValueStr &meta_item); - void visit (MetaListPaths &meta_item); - void visit (MetaListNameValueStr &meta_item); - - // rust-pattern.h - void visit (LiteralPattern &pattern); - void visit (IdentifierPattern &pattern); - void visit (WildcardPattern &pattern); - void visit (RestPattern &pattern); - // void visit(RangePatternBound& bound); - void visit (RangePatternBoundLiteral &bound); - void visit (RangePatternBoundPath &bound); - void visit (RangePatternBoundQualPath &bound); - void visit (RangePattern &pattern); - void visit (ReferencePattern &pattern); - // void visit(StructPatternField& field); - void visit (StructPatternFieldTuplePat &field); - void visit (StructPatternFieldIdentPat &field); - void visit (StructPatternFieldIdent &field); - void visit (StructPattern &pattern); - // void visit(TupleStructItems& tuple_items); - void visit (TupleStructItemsNoRange &tuple_items); - void visit (TupleStructItemsRange &tuple_items); - void visit (TupleStructPattern &pattern); - // void visit(TuplePatternItems& tuple_items); - void visit (TuplePatternItemsMultiple &tuple_items); - void visit (TuplePatternItemsRanged &tuple_items); - void visit (TuplePattern &pattern); - void visit (GroupedPattern &pattern); - void visit (SlicePattern &pattern); - void visit (AltPattern &pattern); - - // rust-stmt.h - void visit (EmptyStmt &stmt); - void visit (LetStmt &stmt); - void visit (ExprStmt &stmt); - - // rust-type.h - void visit (TraitBound &bound); - void visit (ImplTraitType &type); - void visit (TraitObjectType &type); - void visit (ParenthesisedType &type); - void visit (ImplTraitTypeOneBound &type); - void visit (TraitObjectTypeOneBound &type); - void visit (TupleType &type); - void visit (NeverType &type); - void visit (RawPointerType &type); - void visit (ReferenceType &type); - void visit (ArrayType &type); - void visit (SliceType &type); - void visit (InferredType &type); - void visit (BareFunctionType &type); - - void visit (FormatArgs &fmt); + +#define VISIT(X) void visit (X &) override; +#include "rust-ast-visitable.h" +#undef VISIT }; } // namespace AST diff --git a/gcc/rust/ast/rust-ast-visitable.h b/gcc/rust/ast/rust-ast-visitable.h new file mode 100644 index 00000000000..973c9d61d35 --- /dev/null +++ b/gcc/rust/ast/rust-ast-visitable.h @@ -0,0 +1,195 @@ +// Copyright (C) 2025 Free Software Foundation, Inc. + +// This file is part of GCC. + +// GCC is free software; you can redistribute it and/or modify it under +// the terms of the GNU General Public License as published by the Free +// Software Foundation; either version 3, or (at your option) any later +// version. + +// GCC is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or +// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +// for more details. + +// You should have received a copy of the GNU General Public License +// along with GCC; see the file COPYING3. If not see +// . + +// This header contains a list of concrete classes visitable using ASTVisitor + +// rust-ast.h +VISIT (Token) +VISIT (DelimTokenTree) +VISIT (AttrInputMetaItemContainer) +VISIT (IdentifierExpr) +VISIT (Lifetime) +VISIT (LifetimeParam) + +// rust-path.h +VISIT (ConstGenericParam) +VISIT (PathInExpression) +VISIT (TypePathSegment) +VISIT (TypePathSegmentGeneric) +VISIT (TypePathSegmentFunction) +VISIT (TypePath) +VISIT (QualifiedPathInExpression) +VISIT (QualifiedPathInType) + +// rust-expr.h +VISIT (LiteralExpr) +VISIT (AttrInputLiteral) +VISIT (AttrInputMacro) +VISIT (MetaItemLitExpr) +VISIT (MetaItemPathLit) +VISIT (BorrowExpr) +VISIT (DereferenceExpr) +VISIT (ErrorPropagationExpr) +VISIT (NegationExpr) +VISIT (ArithmeticOrLogicalExpr) +VISIT (ComparisonExpr) +VISIT (LazyBooleanExpr) +VISIT (TypeCastExpr) +VISIT (AssignmentExpr) +VISIT (CompoundAssignmentExpr) +VISIT (GroupedExpr) +VISIT (ArrayElemsValues) +VISIT (ArrayElemsCopied) +VISIT (ArrayExpr) +VISIT (ArrayIndexExpr) +VISIT (TupleExpr) +VISIT (TupleIndexExpr) +VISIT (StructExprStruct) +VISIT (StructExprFieldIdentifier) +VISIT (StructExprFieldIdentifierValue) +VISIT (StructExprFieldIndexValue) +VISIT (StructExprStructFields) +VISIT (StructExprStructBase) +VISIT (CallExpr) +VISIT (MethodCallExpr) +VISIT (FieldAccessExpr) +VISIT (ClosureExprInner) +VISIT (BlockExpr) +VISIT (AnonConst) +VISIT (ConstBlock) +VISIT (ClosureExprInnerTyped) +VISIT (ContinueExpr) +VISIT (BreakExpr) +VISIT (RangeFromToExpr) +VISIT (RangeFromExpr) +VISIT (RangeToExpr) +VISIT (RangeFullExpr) +VISIT (RangeFromToInclExpr) +VISIT (RangeToInclExpr) +VISIT (ReturnExpr) +VISIT (TryExpr) +VISIT (BoxExpr) +VISIT (UnsafeBlockExpr) +VISIT (LoopExpr) +VISIT (WhileLoopExpr) +VISIT (WhileLetLoopExpr) +VISIT (ForLoopExpr) +VISIT (IfExpr) +VISIT (IfExprConseqElse) +VISIT (IfLetExpr) +VISIT (IfLetExprConseqElse) +VISIT (MatchExpr) +VISIT (AwaitExpr) +VISIT (AsyncBlockExpr) +VISIT (InlineAsm) +VISIT (LlvmInlineAsm) + +// rust-item.h +VISIT (TypeParam) +VISIT (SelfParam) +VISIT (FunctionParam) +VISIT (VariadicParam) +VISIT (LifetimeWhereClauseItem) +VISIT (TypeBoundWhereClauseItem) +VISIT (Module) +VISIT (ExternCrate) +VISIT (UseTreeGlob) +VISIT (UseTreeList) +VISIT (UseTreeRebind) +VISIT (UseDeclaration) +VISIT (Function) +VISIT (TypeAlias) +VISIT (StructStruct) +VISIT (TupleStruct) +VISIT (EnumItem) +VISIT (EnumItemTuple) +VISIT (EnumItemStruct) +VISIT (EnumItemDiscriminant) +VISIT (Enum) +VISIT (Union) +VISIT (ConstantItem) +VISIT (StaticItem) +VISIT (TraitItemConst) +VISIT (TraitItemType) +VISIT (Trait) +VISIT (InherentImpl) +VISIT (TraitImpl) +VISIT (ExternalTypeItem) +VISIT (ExternalStaticItem) +VISIT (ExternBlock) + +// rust-macro.h +VISIT (MacroMatchFragment) +VISIT (MacroMatchRepetition) +VISIT (MacroMatcher) +VISIT (MacroRulesDefinition) +VISIT (MacroInvocation) +VISIT (MetaItemPath) +VISIT (MetaItemSeq) +VISIT (MetaWord) +VISIT (MetaNameValueStr) +VISIT (MetaListPaths) +VISIT (MetaListNameValueStr) + +// rust-pattern.h +VISIT (LiteralPattern) +VISIT (IdentifierPattern) +VISIT (WildcardPattern) +VISIT (RestPattern) +VISIT (RangePatternBoundLiteral) +VISIT (RangePatternBoundPath) +VISIT (RangePatternBoundQualPath) +VISIT (RangePattern) +VISIT (ReferencePattern) +VISIT (StructPatternFieldTuplePat) +VISIT (StructPatternFieldIdentPat) +VISIT (StructPatternFieldIdent) +VISIT (StructPattern) +VISIT (TupleStructItemsNoRange) +VISIT (TupleStructItemsRange) +VISIT (TupleStructPattern) +VISIT (TuplePatternItemsMultiple) +VISIT (TuplePatternItemsRanged) +VISIT (TuplePattern) +VISIT (GroupedPattern) +VISIT (SlicePattern) +VISIT (AltPattern) + +// rust-stmt.h +VISIT (EmptyStmt) +VISIT (LetStmt) +VISIT (ExprStmt) + +// rust-type.h +VISIT (TraitBound) +VISIT (ImplTraitType) +VISIT (TraitObjectType) +VISIT (ParenthesisedType) +VISIT (ImplTraitTypeOneBound) +VISIT (TraitObjectTypeOneBound) +VISIT (TupleType) +VISIT (NeverType) +VISIT (RawPointerType) +VISIT (ReferenceType) +VISIT (ArrayType) +VISIT (SliceType) +VISIT (InferredType) +VISIT (BareFunctionType) + +// rust-builtin-ast-nodes.h +VISIT (FormatArgs) diff --git a/gcc/rust/ast/rust-ast-visitor.h b/gcc/rust/ast/rust-ast-visitor.h index 6111b0548ed..34a9ebb6cb5 100644 --- a/gcc/rust/ast/rust-ast-visitor.h +++ b/gcc/rust/ast/rust-ast-visitor.h @@ -249,165 +249,9 @@ class DefaultASTVisitor : public ASTVisitor virtual void visit (AST::Crate &crate); - virtual void visit (AST::Token &tok) override; - virtual void visit (AST::DelimTokenTree &delim_tok_tree) override; - virtual void visit (AST::AttrInputMetaItemContainer &input) override; - virtual void visit (AST::IdentifierExpr &ident_expr) override; - virtual void visit (AST::Lifetime &lifetime) override; - virtual void visit (AST::LifetimeParam &lifetime_param) override; - virtual void visit (AST::ConstGenericParam &const_param) override; - virtual void visit (AST::PathInExpression &path) override; - virtual void visit (AST::TypePathSegment &segment) override; - virtual void visit (AST::TypePathSegmentGeneric &segment) override; - virtual void visit (AST::TypePathSegmentFunction &segment) override; - virtual void visit (AST::TypePath &path) override; - virtual void visit (AST::QualifiedPathInExpression &path) override; - virtual void visit (AST::QualifiedPathInType &path) override; - virtual void visit (AST::LiteralExpr &expr) override; - virtual void visit (AST::AttrInputLiteral &attr_input) override; - virtual void visit (AST::AttrInputMacro &attr_input) override; - virtual void visit (AST::MetaItemLitExpr &meta_item) override; - virtual void visit (AST::MetaItemPathLit &meta_item) override; - virtual void visit (AST::BorrowExpr &expr) override; - virtual void visit (AST::DereferenceExpr &expr) override; - virtual void visit (AST::ErrorPropagationExpr &expr) override; - virtual void visit (AST::NegationExpr &expr) override; - virtual void visit (AST::ArithmeticOrLogicalExpr &expr) override; - virtual void visit (AST::ComparisonExpr &expr) override; - virtual void visit (AST::LazyBooleanExpr &expr) override; - virtual void visit (AST::TypeCastExpr &expr) override; - virtual void visit (AST::AssignmentExpr &expr) override; - virtual void visit (AST::CompoundAssignmentExpr &expr) override; - virtual void visit (AST::GroupedExpr &expr) override; - virtual void visit (AST::ArrayElemsValues &elems) override; - virtual void visit (AST::ArrayElemsCopied &elems) override; - virtual void visit (AST::ArrayExpr &expr) override; - virtual void visit (AST::ArrayIndexExpr &expr) override; - virtual void visit (AST::TupleExpr &expr) override; - virtual void visit (AST::TupleIndexExpr &expr) override; - virtual void visit (AST::StructExprStruct &expr) override; - virtual void visit (AST::StructExprFieldIdentifier &field) override; - virtual void visit (AST::StructExprFieldIdentifierValue &field) override; - virtual void visit (AST::StructExprFieldIndexValue &field) override; - virtual void visit (AST::StructExprStructFields &expr) override; - virtual void visit (AST::StructExprStructBase &expr) override; - virtual void visit (AST::CallExpr &expr) override; - virtual void visit (AST::MethodCallExpr &expr) override; - virtual void visit (AST::FieldAccessExpr &expr) override; - virtual void visit (AST::ClosureExprInner &expr) override; - virtual void visit (AST::BlockExpr &expr) override; - virtual void visit (AST::AnonConst &expr) override; - virtual void visit (AST::ConstBlock &expr) override; - virtual void visit (AST::ClosureExprInnerTyped &expr) override; - virtual void visit (AST::ContinueExpr &expr) override; - virtual void visit (AST::BreakExpr &expr) override; - virtual void visit (AST::RangeFromToExpr &expr) override; - virtual void visit (AST::RangeFromExpr &expr) override; - virtual void visit (AST::RangeToExpr &expr) override; - virtual void visit (AST::RangeFullExpr &expr) override; - virtual void visit (AST::RangeFromToInclExpr &expr) override; - virtual void visit (AST::RangeToInclExpr &expr) override; - virtual void visit (AST::ReturnExpr &expr) override; - virtual void visit (AST::TryExpr &expr) override; - virtual void visit (AST::BoxExpr &expr) override; - virtual void visit (AST::UnsafeBlockExpr &expr) override; - virtual void visit (AST::LoopExpr &expr) override; - virtual void visit (AST::WhileLoopExpr &expr) override; - virtual void visit (AST::WhileLetLoopExpr &expr) override; - virtual void visit (AST::ForLoopExpr &expr) override; - virtual void visit (AST::IfExpr &expr) override; - virtual void visit (AST::IfExprConseqElse &expr) override; - virtual void visit (AST::IfLetExpr &expr) override; - virtual void visit (AST::IfLetExprConseqElse &expr) override; - virtual void visit (AST::MatchExpr &expr) override; - virtual void visit (AST::AwaitExpr &expr) override; - virtual void visit (AST::AsyncBlockExpr &expr) override; - virtual void visit (InlineAsm &expr) override; - virtual void visit (LlvmInlineAsm &expr) override; - - virtual void visit (AST::TypeParam ¶m) override; - virtual void visit (AST::LifetimeWhereClauseItem &item) override; - virtual void visit (AST::TypeBoundWhereClauseItem &item) override; - virtual void visit (AST::Module &module) override; - virtual void visit (AST::ExternCrate &crate) override; - virtual void visit (AST::UseTreeGlob &use_tree) override; - virtual void visit (AST::UseTreeList &use_tree) override; - virtual void visit (AST::UseTreeRebind &use_tree) override; - virtual void visit (AST::UseDeclaration &use_decl) override; - virtual void visit (AST::Function &function) override; - virtual void visit (AST::TypeAlias &type_alias) override; - virtual void visit (AST::StructStruct &struct_item) override; - virtual void visit (AST::TupleStruct &tuple_struct) override; - virtual void visit (AST::EnumItem &item) override; - virtual void visit (AST::EnumItemTuple &item) override; - virtual void visit (AST::EnumItemStruct &item) override; - virtual void visit (AST::EnumItemDiscriminant &item) override; - virtual void visit (AST::Enum &enum_item) override; - virtual void visit (AST::Union &union_item) override; - virtual void visit (AST::ConstantItem &const_item) override; - virtual void visit (AST::StaticItem &static_item) override; - virtual void visit (AST::TraitItemConst &item) override; - virtual void visit (AST::TraitItemType &item) override; - virtual void visit (AST::Trait &trait) override; - virtual void visit (AST::InherentImpl &impl) override; - virtual void visit (AST::TraitImpl &impl) override; - virtual void visit (AST::ExternalTypeItem &item) override; - virtual void visit (AST::ExternalStaticItem &item) override; - virtual void visit (AST::ExternBlock &block) override; - virtual void visit (AST::MacroMatchFragment &match) override; - virtual void visit (AST::MacroMatchRepetition &match) override; - virtual void visit (AST::MacroMatcher &matcher) override; - virtual void visit (AST::MacroRulesDefinition &rules_def) override; - virtual void visit (AST::MacroInvocation ¯o_invoc) override; - virtual void visit (AST::MetaItemPath &meta_item) override; - virtual void visit (AST::MetaItemSeq &meta_item) override; - virtual void visit (AST::MetaWord &meta_item) override; - virtual void visit (AST::MetaNameValueStr &meta_item) override; - virtual void visit (AST::MetaListPaths &meta_item) override; - virtual void visit (AST::MetaListNameValueStr &meta_item) override; - virtual void visit (AST::LiteralPattern &pattern) override; - virtual void visit (AST::IdentifierPattern &pattern) override; - virtual void visit (AST::WildcardPattern &pattern) override; - virtual void visit (AST::RestPattern &pattern) override; - virtual void visit (AST::RangePatternBoundLiteral &bound) override; - virtual void visit (AST::RangePatternBoundPath &bound) override; - virtual void visit (AST::RangePatternBoundQualPath &bound) override; - virtual void visit (AST::RangePattern &pattern) override; - virtual void visit (AST::ReferencePattern &pattern) override; - virtual void visit (AST::StructPatternFieldTuplePat &field) override; - virtual void visit (AST::StructPatternFieldIdentPat &field) override; - virtual void visit (AST::StructPatternFieldIdent &field) override; - virtual void visit (AST::StructPattern &pattern) override; - virtual void visit (AST::TupleStructItemsNoRange &tuple_items) override; - virtual void visit (AST::TupleStructItemsRange &tuple_items) override; - virtual void visit (AST::TupleStructPattern &pattern) override; - virtual void visit (AST::TuplePatternItemsMultiple &tuple_items) override; - virtual void visit (AST::TuplePatternItemsRanged &tuple_items) override; - virtual void visit (AST::TuplePattern &pattern) override; - virtual void visit (AST::GroupedPattern &pattern) override; - virtual void visit (AST::SlicePattern &pattern) override; - virtual void visit (AST::AltPattern &pattern) override; - virtual void visit (AST::EmptyStmt &stmt) override; - virtual void visit (AST::LetStmt &stmt) override; - virtual void visit (AST::ExprStmt &stmt) override; - virtual void visit (AST::TraitBound &bound) override; - virtual void visit (AST::ImplTraitType &type) override; - virtual void visit (AST::TraitObjectType &type) override; - virtual void visit (AST::ParenthesisedType &type) override; - virtual void visit (AST::ImplTraitTypeOneBound &type) override; - virtual void visit (AST::TraitObjectTypeOneBound &type) override; - virtual void visit (AST::TupleType &type) override; - virtual void visit (AST::NeverType &type) override; - virtual void visit (AST::RawPointerType &type) override; - virtual void visit (AST::ReferenceType &type) override; - virtual void visit (AST::ArrayType &type) override; - virtual void visit (AST::SliceType &type) override; - virtual void visit (AST::InferredType &type) override; - virtual void visit (AST::BareFunctionType &type) override; - virtual void visit (AST::SelfParam &self) override; - virtual void visit (AST::FunctionParam ¶m) override; - virtual void visit (AST::VariadicParam ¶m) override; - virtual void visit (AST::FormatArgs &fmt) override; +#define VISIT(X) void visit (X &) override; +#include "rust-ast-visitable.h" +#undef VISIT template void visit (T &node) { node.accept_vis (*this); }