// Copyright (C) 2020-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
// .
#include "rust-ast-visitor.h"
#include "rust-ast-full-decls.h"
#include "rust-ast.h"
#include "rust-path.h"
#include "rust-token.h"
#include "rust-expr.h"
#include "rust-macro.h"
#include "rust-pattern.h"
#include "rust-stmt.h"
#include "rust-type.h"
namespace Rust {
namespace AST {
void
DefaultASTVisitor::visit (AST::Crate &crate)
{
visit_inner_attrs (crate);
for (auto &item : crate.items)
visit (item);
}
void
DefaultASTVisitor::visit (AST::Token &tok)
{}
void
DefaultASTVisitor::visit (AST::DelimTokenTree &delim_tok_tree)
{
for (auto &token : delim_tok_tree.get_token_trees ())
visit (token);
}
void
DefaultASTVisitor::visit (AST::AttrInputMetaItemContainer &input)
{
for (auto &item : input.get_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::IdentifierExpr &ident_expr)
{
visit_outer_attrs (ident_expr);
}
void
DefaultASTVisitor::visit (AST::Lifetime &lifetime)
{}
void
DefaultASTVisitor::visit (AST::LifetimeParam &lifetime_param)
{
visit_outer_attrs (lifetime_param);
visit (lifetime_param.get_lifetime ());
for (auto &lifetime_bound : lifetime_param.get_lifetime_bounds ())
visit (lifetime_bound);
}
void
DefaultASTVisitor::visit (AST::ConstGenericParam &const_param)
{
visit_outer_attrs (const_param);
if (const_param.has_type ())
visit (const_param.get_type ());
if (const_param.has_default_value ())
visit (const_param.get_default_value ());
}
void
DefaultASTVisitor::visit (AST::PathInExpression &path)
{
visit_outer_attrs (path);
for (auto &segment : path.get_segments ())
visit (segment);
}
void
DefaultASTVisitor::visit (AST::TypePathSegment &segment)
{}
void
DefaultASTVisitor::visit (GenericArgsBinding &binding)
{
visit (binding.get_type ());
}
void
DefaultASTVisitor::visit (AST::TypePathSegmentGeneric &segment)
{
visit (segment.get_generic_args ());
}
void
DefaultASTVisitor::visit (AST::TypePathFunction &tpf)
{
for (auto &input : tpf.get_params ())
visit (input);
if (tpf.has_return_type ())
visit (tpf.get_return_type ());
}
void
DefaultASTVisitor::visit (AST::PathIdentSegment &segment)
{}
void
DefaultASTVisitor::visit (AST::TypePathSegmentFunction &segment)
{
visit (segment.get_type_path_function ());
visit (segment.get_ident_segment ());
}
void
DefaultASTVisitor::visit (AST::GenericArgs &args)
{
for (auto &lifetime : args.get_lifetime_args ())
visit (lifetime);
for (auto &generic : args.get_generic_args ())
visit (generic);
for (auto &binding : args.get_binding_args ())
visit (binding);
}
void
DefaultASTVisitor::visit (AST::PathExprSegment &segment)
{
visit (segment.get_ident_segment ());
if (segment.has_generic_args ())
visit (segment.get_generic_args ());
}
void
DefaultASTVisitor::visit (AST::TypePath &path)
{
for (auto &segment : path.get_segments ())
visit (segment);
}
void
DefaultASTVisitor::visit (AST::QualifiedPathInExpression &path)
{
visit_outer_attrs (path);
visit (path.get_qualified_path_type ());
for (auto &segment : path.get_segments ())
visit (segment);
}
void
DefaultASTVisitor::visit (AST::QualifiedPathType &path)
{
visit (path.get_type ());
if (path.has_as_clause ())
visit (path.get_as_type_path ());
}
void
DefaultASTVisitor::visit (AST::QualifiedPathInType &path)
{
visit (path.get_qualified_path_type ());
visit (path.get_associated_segment ());
for (auto &segment : path.get_segments ())
visit (segment);
}
void
DefaultASTVisitor::visit (AST::LiteralExpr &expr)
{
visit_outer_attrs (expr);
}
void
DefaultASTVisitor::visit (AST::AttrInputLiteral &attr_input)
{
visit (attr_input.get_literal ());
}
void
DefaultASTVisitor::visit (AST::AttrInputMacro &attr_input)
{
visit (attr_input.get_macro ());
}
void
DefaultASTVisitor::visit (AST::MetaItemLitExpr &meta_item)
{
visit (meta_item.get_literal ());
}
void
DefaultASTVisitor::visit (AST::SimplePathSegment &segment)
{}
void
DefaultASTVisitor::visit (AST::SimplePath &path)
{
for (auto &segment : path.get_segments ())
visit (segment);
}
void
DefaultASTVisitor::visit (AST::MetaItemPathLit &meta_item)
{
visit (meta_item.get_path ());
visit (meta_item.get_literal ());
}
void
DefaultASTVisitor::visit (AST::BorrowExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_borrowed_expr ());
}
void
DefaultASTVisitor::visit (AST::DereferenceExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_dereferenced_expr ());
}
void
DefaultASTVisitor::visit (AST::ErrorPropagationExpr &expr)
{
visit_outer_attrs (expr);
}
void
DefaultASTVisitor::visit (AST::NegationExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_negated_expr ());
}
void
DefaultASTVisitor::visit (AST::ArithmeticOrLogicalExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_left_expr ());
visit (expr.get_right_expr ());
}
void
DefaultASTVisitor::visit (AST::ComparisonExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_left_expr ());
visit (expr.get_right_expr ());
}
void
DefaultASTVisitor::visit (AST::LazyBooleanExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_left_expr ());
visit (expr.get_right_expr ());
}
void
DefaultASTVisitor::visit (AST::TypeCastExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_casted_expr ());
visit (expr.get_type_to_cast_to ());
}
void
DefaultASTVisitor::visit (AST::AssignmentExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_left_expr ());
visit (expr.get_right_expr ());
}
void
DefaultASTVisitor::visit (AST::CompoundAssignmentExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_left_expr ());
visit (expr.get_right_expr ());
}
void
DefaultASTVisitor::visit (AST::GroupedExpr &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
visit (expr.get_expr_in_parens ());
}
void
DefaultASTVisitor::visit (AST::ArrayElemsValues &elems)
{
for (auto &value : elems.get_values ())
visit (value);
}
void
DefaultASTVisitor::visit (AST::ArrayElemsCopied &elems)
{
visit (elems.get_elem_to_copy ());
visit (elems.get_num_copies ());
}
void
DefaultASTVisitor::visit (AST::ArrayExpr &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
visit (expr.get_array_elems ());
}
void
DefaultASTVisitor::visit (AST::ArrayIndexExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_array_expr ());
visit (expr.get_index_expr ());
}
void
DefaultASTVisitor::visit (AST::TupleExpr &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
for (auto &elem : expr.get_tuple_elems ())
visit (elem);
}
void
DefaultASTVisitor::visit (AST::TupleIndexExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_tuple_expr ());
}
void
DefaultASTVisitor::visit (AST::StructExprStruct &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
visit (expr.get_struct_name ());
}
void
DefaultASTVisitor::visit (AST::StructExprFieldIdentifier &field)
{}
void
DefaultASTVisitor::visit (AST::StructExprFieldIdentifierValue &field)
{
visit (field.get_value ());
}
void
DefaultASTVisitor::visit (AST::StructExprFieldIndexValue &field)
{
visit (field.get_value ());
}
void
DefaultASTVisitor::visit (AST::StructBase &base)
{
visit (base.get_base_struct ());
}
void
DefaultASTVisitor::visit (AST::StructExprStructFields &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
if (expr.has_struct_base ())
visit (expr.get_struct_base ());
for (auto &field : expr.get_fields ())
visit (field);
}
void
DefaultASTVisitor::visit (AST::StructExprStructBase &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
visit (expr.get_struct_base ());
}
void
DefaultASTVisitor::visit (AST::CallExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_function_expr ());
for (auto ¶m : expr.get_params ())
visit (param);
}
void
DefaultASTVisitor::visit (AST::MethodCallExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_receiver_expr ());
visit (expr.get_method_name ());
for (auto ¶m : expr.get_params ())
visit (param);
}
void
DefaultASTVisitor::visit (AST::FieldAccessExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_receiver_expr ());
}
void
DefaultASTVisitor::visit (AST::ClosureExprInner &expr)
{
visit_outer_attrs (expr);
for (auto ¶m : expr.get_params ())
visit (param);
visit (expr.get_definition_expr ());
}
void
DefaultASTVisitor::visit (AST::BlockExpr &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
for (auto &stmt : expr.get_statements ())
visit (stmt);
if (expr.has_tail_expr ())
visit (expr.get_tail_expr ());
}
void
DefaultASTVisitor::visit (AST::ClosureExprInnerTyped &expr)
{
visit_outer_attrs (expr);
for (auto ¶m : expr.get_params ())
visit (param);
visit (expr.get_return_type ());
visit (expr.get_definition_block ());
}
void
DefaultASTVisitor::visit (AST::ClosureParam ¶m)
{
visit_outer_attrs (param);
visit (param.get_pattern ());
if (param.has_type_given ())
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::ContinueExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_label ());
}
void
DefaultASTVisitor::visit (AST::BreakExpr &expr)
{
visit_outer_attrs (expr);
if (expr.has_label ())
visit (expr.get_label ());
if (expr.has_break_expr ())
visit (expr.get_break_expr ());
}
void
DefaultASTVisitor::visit (AST::RangeFromToExpr &expr)
{
visit (expr.get_from_expr ());
visit (expr.get_to_expr ());
}
void
DefaultASTVisitor::visit (AST::RangeFromExpr &expr)
{
visit (expr.get_from_expr ());
}
void
DefaultASTVisitor::visit (AST::RangeToExpr &expr)
{
visit (expr.get_to_expr ());
}
void
DefaultASTVisitor::visit (AST::RangeFullExpr &expr)
{}
void
DefaultASTVisitor::visit (AST::RangeFromToInclExpr &expr)
{
visit (expr.get_from_expr ());
visit (expr.get_to_expr ());
}
void
DefaultASTVisitor::visit (AST::RangeToInclExpr &expr)
{
visit (expr.get_to_expr ());
}
void
DefaultASTVisitor::visit (AST::ReturnExpr &expr)
{
visit_outer_attrs (expr);
if (expr.has_returned_expr ())
visit (expr.get_returned_expr ());
}
void
DefaultASTVisitor::visit (AST::BoxExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_boxed_expr ());
}
void
DefaultASTVisitor::visit (AST::UnsafeBlockExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_block_expr ());
}
void
DefaultASTVisitor::visit (AST::LoopLabel &label)
{
visit (label.get_lifetime ());
}
void
DefaultASTVisitor::visit (AST::LoopExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
void
DefaultASTVisitor::visit (AST::WhileLoopExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_predicate_expr ());
visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
void
DefaultASTVisitor::visit (AST::WhileLetLoopExpr &expr)
{
visit_outer_attrs (expr);
for (auto &pattern : expr.get_patterns ())
visit (pattern);
visit (expr.get_scrutinee_expr ());
visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
void
DefaultASTVisitor::visit (AST::ForLoopExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_pattern ());
visit (expr.get_iterator_expr ());
visit (expr.get_loop_label ());
visit (expr.get_loop_block ());
}
void
DefaultASTVisitor::visit (AST::IfExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_condition_expr ());
visit (expr.get_if_block ());
}
void
DefaultASTVisitor::visit (AST::IfExprConseqElse &expr)
{
visit (reinterpret_cast (expr));
visit (expr.get_else_block ());
}
void
DefaultASTVisitor::visit (AST::IfLetExpr &expr)
{
visit_outer_attrs (expr);
for (auto &pattern : expr.get_patterns ())
visit (pattern);
visit (expr.get_value_expr ());
visit (expr.get_if_block ());
}
void
DefaultASTVisitor::visit (AST::IfLetExprConseqElse &expr)
{
visit (reinterpret_cast (expr));
visit (expr.get_else_block ());
}
void
DefaultASTVisitor::visit (AST::MatchArm &arm)
{
visit_outer_attrs (arm);
for (auto &pattern : arm.get_patterns ())
visit (pattern);
if (arm.has_match_arm_guard ())
visit (arm.get_guard_expr ());
}
void
DefaultASTVisitor::visit (AST::MatchCase &arm)
{
visit (arm.get_arm ());
visit (arm.get_expr ());
}
void
DefaultASTVisitor::visit (AST::MatchExpr &expr)
{
visit_outer_attrs (expr);
visit_inner_attrs (expr);
visit (expr.get_scrutinee_expr ());
for (auto &arm : expr.get_match_cases ())
visit (arm);
}
void
DefaultASTVisitor::visit (AST::AwaitExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_awaited_expr ());
}
void
DefaultASTVisitor::visit (AST::AsyncBlockExpr &expr)
{
visit_outer_attrs (expr);
visit (expr.get_block_expr ());
}
void
DefaultASTVisitor::visit (AST::InlineAsm &expr)
{
rust_unreachable ();
}
void
DefaultASTVisitor::visit (AST::TypeParam ¶m)
{
visit_outer_attrs (param);
for (auto &bound : param.get_type_param_bounds ())
visit (bound);
if (param.has_type ())
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::LifetimeWhereClauseItem &item)
{
visit (item.get_lifetime ());
for (auto &bound : item.get_lifetime_bounds ())
visit (bound);
}
void
DefaultASTVisitor::visit (AST::TypeBoundWhereClauseItem &item)
{
for (auto &lifetime : item.get_for_lifetimes ())
visit (lifetime);
visit (item.get_type ());
for (auto ¶m : item.get_type_param_bounds ())
visit (param);
}
void
DefaultASTVisitor::visit (AST::Visibility &vis)
{
visit (vis.get_path ());
}
void
DefaultASTVisitor::visit (AST::FunctionQualifiers &qualifiers)
{}
void
DefaultASTVisitor::visit (AST::WhereClause &where)
{
for (auto &item : where.get_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::FunctionParam ¶m)
{
visit_outer_attrs (param);
if (param.has_name ())
visit (param.get_pattern ());
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::SelfParam ¶m)
{
visit_outer_attrs (param);
if (param.has_lifetime ())
visit (param.get_lifetime ());
if (param.has_type ())
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::Module &module)
{
visit_outer_attrs (module);
visit (module.get_visibility ());
visit_inner_attrs (module);
for (auto &item : module.get_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::ExternCrate &crate)
{
visit_outer_attrs (crate);
visit (crate.get_visibility ());
}
void
DefaultASTVisitor::visit (AST::UseTreeGlob &use_tree)
{
visit (use_tree.get_path ());
}
void
DefaultASTVisitor::visit (AST::UseTreeList &use_tree)
{
visit (use_tree.get_path ());
}
void
DefaultASTVisitor::visit (AST::UseTreeRebind &use_tree)
{
visit (use_tree.get_path ());
}
void
DefaultASTVisitor::visit (AST::UseDeclaration &use_decl)
{
visit (use_decl.get_tree ());
}
void
DefaultASTVisitor::visit (AST::Function &function)
{
visit_outer_attrs (function);
visit (function.get_visibility ());
visit (function.get_qualifiers ());
for (auto &generic : function.get_generic_params ())
visit (generic);
if (function.has_self_param ())
visit (function.get_self_param ());
for (auto ¶m : function.get_function_params ())
visit (param);
if (function.has_return_type ())
visit (function.get_return_type ());
if (function.has_where_clause ())
visit (function.get_where_clause ());
if (function.has_body ())
visit (*function.get_definition ());
}
void
DefaultASTVisitor::visit (AST::TypeAlias &type_alias)
{
visit_outer_attrs (type_alias);
visit (type_alias.get_visibility ());
for (auto &generic : type_alias.get_generic_params ())
visit (generic);
if (type_alias.has_where_clause ())
visit (type_alias.get_where_clause ());
visit (type_alias.get_type_aliased ());
}
void
DefaultASTVisitor::visit (AST::StructField &field)
{
visit_outer_attrs (field);
visit (field.get_visibility ());
visit (field.get_field_type ());
}
void
DefaultASTVisitor::visit (AST::StructStruct &struct_item)
{
visit_outer_attrs (struct_item);
visit (struct_item.get_visibility ());
for (auto &generic : struct_item.get_generic_params ())
visit (generic);
if (struct_item.has_where_clause ())
visit (struct_item.get_where_clause ());
for (auto &field : struct_item.get_fields ())
visit (field);
}
void
DefaultASTVisitor::visit (AST::TupleField &field)
{
visit_outer_attrs (field);
visit (field.get_visibility ());
visit (field.get_field_type ());
}
void
DefaultASTVisitor::visit (AST::TupleStruct &tuple_struct)
{
visit_outer_attrs (tuple_struct);
visit (tuple_struct.get_visibility ());
for (auto &generic : tuple_struct.get_generic_params ())
visit (generic);
if (tuple_struct.has_where_clause ())
visit (tuple_struct.get_where_clause ());
for (auto &field : tuple_struct.get_fields ())
visit (field);
}
void
DefaultASTVisitor::visit (AST::EnumItem &item)
{
visit_outer_attrs (item);
visit (item.get_visibility ());
}
void
DefaultASTVisitor::visit (AST::EnumItemTuple &item)
{
visit (reinterpret_cast (item));
for (auto &field : item.get_tuple_fields ())
visit (field);
}
void
DefaultASTVisitor::visit (AST::EnumItemStruct &item)
{
visit (reinterpret_cast (item));
for (auto &field : item.get_struct_fields ())
visit (field);
}
void
DefaultASTVisitor::visit (AST::EnumItemDiscriminant &item)
{
visit (reinterpret_cast (item));
visit (item.get_expr ());
}
void
DefaultASTVisitor::visit (AST::Enum &enum_item)
{
visit_outer_attrs (enum_item);
visit (enum_item.get_visibility ());
for (auto &generic : enum_item.get_generic_params ())
visit (generic);
if (enum_item.has_where_clause ())
visit (enum_item.get_where_clause ());
for (auto &item : enum_item.get_variants ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::Union &union_item)
{
visit_outer_attrs (union_item);
visit (union_item.get_visibility ());
for (auto &generic : union_item.get_generic_params ())
visit (generic);
if (union_item.has_where_clause ())
visit (union_item.get_where_clause ());
for (auto &variant : union_item.get_variants ())
visit (variant);
}
void
DefaultASTVisitor::visit (AST::ConstantItem &const_item)
{
visit_outer_attrs (const_item);
visit (const_item.get_visibility ());
visit (const_item.get_type ());
if (const_item.has_expr ())
visit (const_item.get_expr ());
}
void
DefaultASTVisitor::visit (AST::StaticItem &static_item)
{
visit_outer_attrs (static_item);
visit (static_item.get_visibility ());
visit (static_item.get_type ());
visit (static_item.get_expr ());
}
void
DefaultASTVisitor::visit (AST::TraitItemConst &item)
{
visit_outer_attrs (item);
visit (item.get_type ());
if (item.has_expr ())
visit (item.get_expr ());
}
void
DefaultASTVisitor::visit (AST::TraitItemType &item)
{
visit_outer_attrs (item);
for (auto &bound : item.get_type_param_bounds ())
visit (bound);
}
void
DefaultASTVisitor::visit (AST::Trait &trait)
{
visit_outer_attrs (trait);
visit (trait.get_visibility ());
visit_inner_attrs (trait);
for (auto &generic : trait.get_generic_params ())
visit (generic);
if (trait.has_where_clause ())
visit (trait.get_where_clause ());
for (auto &bound : trait.get_type_param_bounds ())
visit (bound);
for (auto &item : trait.get_trait_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::InherentImpl &impl)
{
visit_outer_attrs (impl);
visit (impl.get_visibility ());
for (auto &generic : impl.get_generic_params ())
visit (generic);
if (impl.has_where_clause ())
visit (impl.get_where_clause ());
visit (impl.get_type ());
visit_inner_attrs (impl);
for (auto &item : impl.get_impl_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::TraitImpl &impl)
{
visit_outer_attrs (impl);
visit (impl.get_visibility ());
for (auto &generic : impl.get_generic_params ())
visit (generic);
if (impl.has_where_clause ())
visit (impl.get_where_clause ());
visit (impl.get_type ());
visit_inner_attrs (impl);
for (auto &item : impl.get_impl_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::ExternalTypeItem &item)
{
visit_outer_attrs (item);
visit (item.get_visibility ());
}
void
DefaultASTVisitor::visit (AST::ExternalStaticItem &item)
{
visit_outer_attrs (item);
visit (item.get_visibility ());
visit (item.get_type ());
}
void
DefaultASTVisitor::visit (AST::NamedFunctionParam ¶m)
{
visit_outer_attrs (param);
if (!param.is_variadic ())
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::ExternBlock &block)
{
visit_outer_attrs (block);
visit (block.get_visibility ());
visit_inner_attrs (block);
for (auto &item : block.get_extern_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::MacroMatchFragment &match)
{}
void
DefaultASTVisitor::visit (AST::MacroMatchRepetition &match)
{
for (auto &m : match.get_matches ())
visit (m);
}
void
DefaultASTVisitor::visit (AST::MacroMatcher &matcher)
{
for (auto &m : matcher.get_matches ())
visit (m);
}
void
DefaultASTVisitor::visit (AST::MacroTranscriber &transcriber)
{
visit (transcriber.get_token_tree ());
}
void
DefaultASTVisitor::visit (AST::MacroRule &rule)
{
visit (rule.get_matcher ());
visit (rule.get_transcriber ());
}
void
DefaultASTVisitor::visit (AST::MacroRulesDefinition &rules_def)
{
visit_outer_attrs (rules_def);
for (auto &rule : rules_def.get_macro_rules ())
visit (rule);
}
void
DefaultASTVisitor::visit (AST::MacroInvocData &data)
{
visit (data.get_path ());
visit (data.get_delim_tok_tree ());
}
void
DefaultASTVisitor::visit (AST::MacroInvocation ¯o_invoc)
{
visit_outer_attrs (macro_invoc);
visit (macro_invoc.get_invoc_data ());
}
void
DefaultASTVisitor::visit (AST::MetaItemPath &meta_item)
{
visit (meta_item.get_path ());
}
void
DefaultASTVisitor::visit (AST::MetaItemSeq &meta_item)
{
visit (meta_item.get_path ());
for (auto &inner : meta_item.get_seq ())
visit (inner);
}
void
DefaultASTVisitor::visit (AST::MetaWord &meta_item)
{}
void
DefaultASTVisitor::visit (AST::MetaNameValueStr &meta_item)
{}
void
DefaultASTVisitor::visit (AST::MetaListPaths &meta_item)
{
for (auto &path : meta_item.get_paths ())
visit (path);
}
void
DefaultASTVisitor::visit (AST::MetaListNameValueStr &meta_item)
{
for (auto &str : meta_item.get_values ())
visit (str);
}
void
DefaultASTVisitor::visit (AST::LiteralPattern &pattern)
{}
void
DefaultASTVisitor::visit (AST::IdentifierPattern &pattern)
{
if (pattern.has_pattern_to_bind ())
visit (pattern.get_pattern_to_bind ());
}
void
DefaultASTVisitor::visit (AST::WildcardPattern &pattern)
{}
void
DefaultASTVisitor::visit (AST::RestPattern &pattern)
{}
void
DefaultASTVisitor::visit (AST::RangePatternBoundLiteral &bound)
{}
void
DefaultASTVisitor::visit (AST::RangePatternBoundPath &bound)
{
visit (bound.get_path ());
}
void
DefaultASTVisitor::visit (AST::RangePatternBoundQualPath &bound)
{
visit (bound.get_qualified_path ());
}
void
DefaultASTVisitor::visit (AST::RangePattern &pattern)
{
if (pattern.get_has_lower_bound ())
visit (pattern.get_lower_bound ());
if (pattern.get_has_upper_bound ())
visit (pattern.get_upper_bound ());
}
void
DefaultASTVisitor::visit (AST::ReferencePattern &pattern)
{
visit (pattern.get_referenced_pattern ());
}
void
DefaultASTVisitor::visit (AST::StructPatternFieldTuplePat &field)
{
visit_outer_attrs (field);
visit (field.get_index_pattern ());
}
void
DefaultASTVisitor::visit (AST::StructPatternFieldIdentPat &field)
{
visit_outer_attrs (field);
visit (field.get_ident_pattern ());
}
void
DefaultASTVisitor::visit (AST::StructPatternFieldIdent &field)
{
visit_outer_attrs (field);
}
void
DefaultASTVisitor::visit (AST::StructPatternElements &spe)
{
for (auto &field : spe.get_struct_pattern_fields ())
visit (field);
for (auto &attribute : spe.get_etc_outer_attrs ())
visit (attribute);
}
void
DefaultASTVisitor::visit (AST::StructPattern &pattern)
{
visit (pattern.get_path ());
visit (pattern.get_struct_pattern_elems ());
}
void
DefaultASTVisitor::visit (AST::TupleStructItemsNoRange &tuple_items)
{
for (auto &pattern : tuple_items.get_patterns ())
visit (pattern);
}
void
DefaultASTVisitor::visit (AST::TupleStructItemsRange &tuple_items)
{
for (auto &lower : tuple_items.get_lower_patterns ())
visit (lower);
for (auto &upper : tuple_items.get_upper_patterns ())
visit (upper);
}
void
DefaultASTVisitor::visit (AST::TupleStructPattern &pattern)
{
visit (pattern.get_path ());
visit (pattern.get_items ());
}
void
DefaultASTVisitor::visit (AST::TuplePatternItemsMultiple &tuple_items)
{
for (auto &pattern : tuple_items.get_patterns ())
visit (pattern);
}
void
DefaultASTVisitor::visit (AST::TuplePatternItemsRanged &tuple_items)
{
for (auto &lower : tuple_items.get_lower_patterns ())
visit (lower);
for (auto &upper : tuple_items.get_upper_patterns ())
visit (upper);
}
void
DefaultASTVisitor::visit (AST::TuplePattern &pattern)
{
visit (pattern.get_items ());
}
void
DefaultASTVisitor::visit (AST::GroupedPattern &pattern)
{
visit (pattern.get_pattern_in_parens ());
}
void
DefaultASTVisitor::visit (AST::SlicePattern &pattern)
{
for (auto &item : pattern.get_items ())
visit (item);
}
void
DefaultASTVisitor::visit (AST::AltPattern &pattern)
{
for (auto &alt : pattern.get_alts ())
visit (alt);
}
void
DefaultASTVisitor::visit (AST::EmptyStmt &stmt)
{}
void
DefaultASTVisitor::visit (AST::LetStmt &stmt)
{
visit_outer_attrs (stmt);
visit (stmt.get_pattern ());
if (stmt.has_type ())
visit (stmt.get_type ());
if (stmt.has_init_expr ())
visit (stmt.get_init_expr ());
}
void
DefaultASTVisitor::visit (AST::ExprStmt &stmt)
{
visit (stmt.get_expr ());
}
void
DefaultASTVisitor::visit (AST::TraitBound &bound)
{
for (auto &lifetime : bound.get_for_lifetimes ())
visit (lifetime);
visit (bound.get_type_path ());
}
void
DefaultASTVisitor::visit (AST::ImplTraitType &type)
{
for (auto &bound : type.get_type_param_bounds ())
visit (bound);
}
void
DefaultASTVisitor::visit (AST::TraitObjectType &type)
{
for (auto &bound : type.get_type_param_bounds ())
visit (bound);
}
void
DefaultASTVisitor::visit (AST::ParenthesisedType &type)
{
visit (type.get_type_in_parens ());
}
void
DefaultASTVisitor::visit (AST::ImplTraitTypeOneBound &type)
{
visit (type.get_trait_bound ());
}
void
DefaultASTVisitor::visit (AST::TraitObjectTypeOneBound &type)
{
visit (type.get_trait_bound ());
}
void
DefaultASTVisitor::visit (AST::TupleType &type)
{
for (auto &elem : type.get_elems ())
visit (elem);
}
void
DefaultASTVisitor::visit (AST::NeverType &type)
{}
void
DefaultASTVisitor::visit (AST::RawPointerType &type)
{
visit (type.get_type_pointed_to ());
}
void
DefaultASTVisitor::visit (AST::ReferenceType &type)
{
visit (type.get_lifetime ());
visit (type.get_base_type ());
}
void
DefaultASTVisitor::visit (AST::ArrayType &type)
{
visit (type.get_elem_type ());
visit (type.get_size_expr ());
}
void
DefaultASTVisitor::visit (AST::SliceType &type)
{
visit (type.get_elem_type ());
}
void
DefaultASTVisitor::visit (AST::InferredType &type)
{}
void
DefaultASTVisitor::visit (AST::MaybeNamedParam ¶m)
{
visit_outer_attrs (param);
visit (param.get_type ());
}
void
DefaultASTVisitor::visit (AST::BareFunctionType &type)
{
for (auto &lifetime : type.get_for_lifetimes ())
visit (lifetime);
visit (type.get_function_qualifiers ());
for (auto ¶m : type.get_function_params ())
visit (param);
if (type.is_variadic ())
for (auto attr : type.get_variadic_attr ())
visit (attr);
if (type.has_return_type ())
visit (type.get_return_type ());
}
void
DefaultASTVisitor::visit (AST::FormatArgs &)
{
// FIXME: Do we have anything to do? any subnodes to visit? Probably, right?
}
void
DefaultASTVisitor::visit (AST::VariadicParam ¶m)
{
if (param.has_pattern ())
visit (param.get_pattern ());
}
void
ContextualASTVisitor::visit (AST::Crate &crate)
{
push_context (Context::CRATE);
DefaultASTVisitor::visit (crate);
pop_context ();
}
void
ContextualASTVisitor::visit (AST::InherentImpl &impl)
{
push_context (Context::INHERENT_IMPL);
DefaultASTVisitor::visit (impl);
pop_context ();
}
void
ContextualASTVisitor::visit (AST::TraitImpl &impl)
{
push_context (Context::TRAIT_IMPL);
DefaultASTVisitor::visit (impl);
pop_context ();
}
void
ContextualASTVisitor::visit (AST::Trait &trait)
{
push_context (Context::TRAIT);
DefaultASTVisitor::visit (trait);
pop_context ();
}
} // namespace AST
} // namespace Rust