1 // Copyright (C) 2020-2025 Free Software Foundation, Inc.
3 // This file is part of GCC.
5 // GCC is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU General Public License as published by the Free
7 // Software Foundation; either version 3, or (at your option) any later
10 // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 // You should have received a copy of the GNU General Public License
16 // along with GCC; see the file COPYING3. If not see
17 // <http://www.gnu.org/licenses/>.
19 #ifndef RUST_AST_VISITOR_H
20 #define RUST_AST_VISITOR_H
21 // Visitor base for AST
23 // full include not required - only forward decls
24 #include "rust-ast-full-decls.h"
26 #include "rust-item.h"
27 #include "rust-system.h"
31 /* Pure abstract class that provides an interface for accessing different
32 * classes of the AST. */
36 // only concrete class overloads are required
39 // virtual void visit(AttrInput& attr_input) = 0;
40 // virtual void visit(TokenTree& token_tree) = 0;
41 // virtual void visit(MacroMatch& macro_match) = 0;
42 virtual void visit (Token
&tok
) = 0;
43 virtual void visit (DelimTokenTree
&delim_tok_tree
) = 0;
44 virtual void visit (AttrInputMetaItemContainer
&input
) = 0;
45 // virtual void visit(MetaItem& meta_item) = 0;
46 // virtual void visit(Stmt& stmt) = 0;
47 // virtual void visit(Expr& expr) = 0;
48 virtual void visit (IdentifierExpr
&ident_expr
) = 0;
49 // virtual void visit(Pattern& pattern) = 0;
50 // virtual void visit(Type& type) = 0;
51 // virtual void visit(TypeParamBound& type_param_bound) = 0;
52 virtual void visit (Lifetime
&lifetime
) = 0;
53 // virtual void visit(GenericParam& generic_param) = 0;
54 virtual void visit (LifetimeParam
&lifetime_param
) = 0;
55 virtual void visit (ConstGenericParam
&const_param
) = 0;
56 // virtual void visit(TraitItem& trait_item) = 0;
57 // virtual void visit(InherentImplItem& inherent_impl_item) = 0;
58 // virtual void visit(TraitImplItem& trait_impl_item) = 0;
61 virtual void visit (PathInExpression
&path
) = 0;
62 virtual void visit (TypePathSegment
&segment
) = 0;
63 virtual void visit (TypePathSegmentGeneric
&segment
) = 0;
64 virtual void visit (TypePathSegmentFunction
&segment
) = 0;
65 virtual void visit (TypePath
&path
) = 0;
66 virtual void visit (QualifiedPathInExpression
&path
) = 0;
67 virtual void visit (QualifiedPathInType
&path
) = 0;
70 virtual void visit (LiteralExpr
&expr
) = 0;
71 virtual void visit (AttrInputLiteral
&attr_input
) = 0;
72 virtual void visit (AttrInputMacro
&attr_input
) = 0;
73 virtual void visit (MetaItemLitExpr
&meta_item
) = 0;
74 virtual void visit (MetaItemPathLit
&meta_item
) = 0;
75 virtual void visit (BorrowExpr
&expr
) = 0;
76 virtual void visit (DereferenceExpr
&expr
) = 0;
77 virtual void visit (ErrorPropagationExpr
&expr
) = 0;
78 virtual void visit (NegationExpr
&expr
) = 0;
79 virtual void visit (ArithmeticOrLogicalExpr
&expr
) = 0;
80 virtual void visit (ComparisonExpr
&expr
) = 0;
81 virtual void visit (LazyBooleanExpr
&expr
) = 0;
82 virtual void visit (TypeCastExpr
&expr
) = 0;
83 virtual void visit (AssignmentExpr
&expr
) = 0;
84 virtual void visit (CompoundAssignmentExpr
&expr
) = 0;
85 virtual void visit (GroupedExpr
&expr
) = 0;
86 // virtual void visit(ArrayElems& elems) = 0;
87 virtual void visit (ArrayElemsValues
&elems
) = 0;
88 virtual void visit (ArrayElemsCopied
&elems
) = 0;
89 virtual void visit (ArrayExpr
&expr
) = 0;
90 virtual void visit (ArrayIndexExpr
&expr
) = 0;
91 virtual void visit (TupleExpr
&expr
) = 0;
92 virtual void visit (TupleIndexExpr
&expr
) = 0;
93 virtual void visit (StructExprStruct
&expr
) = 0;
94 // virtual void visit(StructExprField& field) = 0;
95 virtual void visit (StructExprFieldIdentifier
&field
) = 0;
96 virtual void visit (StructExprFieldIdentifierValue
&field
) = 0;
97 virtual void visit (StructExprFieldIndexValue
&field
) = 0;
98 virtual void visit (StructExprStructFields
&expr
) = 0;
99 virtual void visit (StructExprStructBase
&expr
) = 0;
100 virtual void visit (CallExpr
&expr
) = 0;
101 virtual void visit (MethodCallExpr
&expr
) = 0;
102 virtual void visit (FieldAccessExpr
&expr
) = 0;
103 virtual void visit (ClosureExprInner
&expr
) = 0;
104 virtual void visit (BlockExpr
&expr
) = 0;
105 virtual void visit (ClosureExprInnerTyped
&expr
) = 0;
106 virtual void visit (ContinueExpr
&expr
) = 0;
107 virtual void visit (BreakExpr
&expr
) = 0;
108 virtual void visit (RangeFromToExpr
&expr
) = 0;
109 virtual void visit (RangeFromExpr
&expr
) = 0;
110 virtual void visit (RangeToExpr
&expr
) = 0;
111 virtual void visit (RangeFullExpr
&expr
) = 0;
112 virtual void visit (RangeFromToInclExpr
&expr
) = 0;
113 virtual void visit (RangeToInclExpr
&expr
) = 0;
114 virtual void visit (ReturnExpr
&expr
) = 0;
115 virtual void visit (UnsafeBlockExpr
&expr
) = 0;
116 virtual void visit (LoopExpr
&expr
) = 0;
117 virtual void visit (WhileLoopExpr
&expr
) = 0;
118 virtual void visit (WhileLetLoopExpr
&expr
) = 0;
119 virtual void visit (ForLoopExpr
&expr
) = 0;
120 virtual void visit (IfExpr
&expr
) = 0;
121 virtual void visit (IfExprConseqElse
&expr
) = 0;
122 virtual void visit (IfLetExpr
&expr
) = 0;
123 virtual void visit (IfLetExprConseqElse
&expr
) = 0;
124 // virtual void visit(MatchCase& match_case) = 0;
125 // virtual void visit (MatchCaseBlockExpr &match_case) = 0;
126 // virtual void visit (MatchCaseExpr &match_case) = 0;
127 virtual void visit (MatchExpr
&expr
) = 0;
128 virtual void visit (AwaitExpr
&expr
) = 0;
129 virtual void visit (AsyncBlockExpr
&expr
) = 0;
132 virtual void visit (TypeParam
¶m
) = 0;
133 virtual void visit (SelfParam
¶m
) = 0;
134 virtual void visit (FunctionParam
¶m
) = 0;
135 virtual void visit (VariadicParam
¶m
) = 0;
137 // virtual void visit(WhereClauseItem& item) = 0;
138 virtual void visit (LifetimeWhereClauseItem
&item
) = 0;
139 virtual void visit (TypeBoundWhereClauseItem
&item
) = 0;
140 virtual void visit (Module
&module
) = 0;
141 virtual void visit (ExternCrate
&crate
) = 0;
142 // virtual void visit(UseTree& use_tree) = 0;
143 virtual void visit (UseTreeGlob
&use_tree
) = 0;
144 virtual void visit (UseTreeList
&use_tree
) = 0;
145 virtual void visit (UseTreeRebind
&use_tree
) = 0;
146 virtual void visit (UseDeclaration
&use_decl
) = 0;
147 virtual void visit (Function
&function
) = 0;
148 virtual void visit (TypeAlias
&type_alias
) = 0;
149 virtual void visit (StructStruct
&struct_item
) = 0;
150 virtual void visit (TupleStruct
&tuple_struct
) = 0;
151 virtual void visit (EnumItem
&item
) = 0;
152 virtual void visit (EnumItemTuple
&item
) = 0;
153 virtual void visit (EnumItemStruct
&item
) = 0;
154 virtual void visit (EnumItemDiscriminant
&item
) = 0;
155 virtual void visit (Enum
&enum_item
) = 0;
156 virtual void visit (Union
&union_item
) = 0;
157 virtual void visit (ConstantItem
&const_item
) = 0;
158 virtual void visit (StaticItem
&static_item
) = 0;
159 virtual void visit (TraitItemConst
&item
) = 0;
160 virtual void visit (TraitItemType
&item
) = 0;
161 virtual void visit (Trait
&trait
) = 0;
162 virtual void visit (InherentImpl
&impl
) = 0;
163 virtual void visit (TraitImpl
&impl
) = 0;
164 // virtual void visit(ExternalItem& item) = 0;
165 virtual void visit (ExternalTypeItem
&type
) = 0;
166 virtual void visit (ExternalStaticItem
&item
) = 0;
167 virtual void visit (ExternBlock
&block
) = 0;
170 virtual void visit (MacroMatchFragment
&match
) = 0;
171 virtual void visit (MacroMatchRepetition
&match
) = 0;
172 virtual void visit (MacroMatcher
&matcher
) = 0;
173 virtual void visit (MacroRulesDefinition
&rules_def
) = 0;
174 virtual void visit (MacroInvocation
¯o_invoc
) = 0;
175 virtual void visit (MetaItemPath
&meta_item
) = 0;
176 virtual void visit (MetaItemSeq
&meta_item
) = 0;
177 virtual void visit (MetaWord
&meta_item
) = 0;
178 virtual void visit (MetaNameValueStr
&meta_item
) = 0;
179 virtual void visit (MetaListPaths
&meta_item
) = 0;
180 virtual void visit (MetaListNameValueStr
&meta_item
) = 0;
183 virtual void visit (LiteralPattern
&pattern
) = 0;
184 virtual void visit (IdentifierPattern
&pattern
) = 0;
185 virtual void visit (WildcardPattern
&pattern
) = 0;
186 virtual void visit (RestPattern
&pattern
) = 0;
187 // virtual void visit(RangePatternBound& bound) = 0;
188 virtual void visit (RangePatternBoundLiteral
&bound
) = 0;
189 virtual void visit (RangePatternBoundPath
&bound
) = 0;
190 virtual void visit (RangePatternBoundQualPath
&bound
) = 0;
191 virtual void visit (RangePattern
&pattern
) = 0;
192 virtual void visit (ReferencePattern
&pattern
) = 0;
193 // virtual void visit(StructPatternField& field) = 0;
194 virtual void visit (StructPatternFieldTuplePat
&field
) = 0;
195 virtual void visit (StructPatternFieldIdentPat
&field
) = 0;
196 virtual void visit (StructPatternFieldIdent
&field
) = 0;
197 virtual void visit (StructPattern
&pattern
) = 0;
198 // virtual void visit(TupleStructItems& tuple_items) = 0;
199 virtual void visit (TupleStructItemsNoRange
&tuple_items
) = 0;
200 virtual void visit (TupleStructItemsRange
&tuple_items
) = 0;
201 virtual void visit (TupleStructPattern
&pattern
) = 0;
202 // virtual void visit(TuplePatternItems& tuple_items) = 0;
203 virtual void visit (TuplePatternItemsMultiple
&tuple_items
) = 0;
204 virtual void visit (TuplePatternItemsRanged
&tuple_items
) = 0;
205 virtual void visit (TuplePattern
&pattern
) = 0;
206 virtual void visit (GroupedPattern
&pattern
) = 0;
207 virtual void visit (SlicePattern
&pattern
) = 0;
208 virtual void visit (AltPattern
&pattern
) = 0;
211 virtual void visit (EmptyStmt
&stmt
) = 0;
212 virtual void visit (LetStmt
&stmt
) = 0;
213 virtual void visit (ExprStmt
&stmt
) = 0;
216 virtual void visit (TraitBound
&bound
) = 0;
217 virtual void visit (ImplTraitType
&type
) = 0;
218 virtual void visit (TraitObjectType
&type
) = 0;
219 virtual void visit (ParenthesisedType
&type
) = 0;
220 virtual void visit (ImplTraitTypeOneBound
&type
) = 0;
221 virtual void visit (TraitObjectTypeOneBound
&type
) = 0;
222 virtual void visit (TupleType
&type
) = 0;
223 virtual void visit (NeverType
&type
) = 0;
224 virtual void visit (RawPointerType
&type
) = 0;
225 virtual void visit (ReferenceType
&type
) = 0;
226 virtual void visit (ArrayType
&type
) = 0;
227 virtual void visit (SliceType
&type
) = 0;
228 virtual void visit (InferredType
&type
) = 0;
229 virtual void visit (BareFunctionType
&type
) = 0;
231 // special AST nodes for certain builtin macros such as `asm!()`
232 virtual void visit (FormatArgs
&fmt
) = 0;
234 // TODO: rust-cond-compilation.h visiting? not currently used
237 class DefaultASTVisitor
: public ASTVisitor
240 virtual void visit (AST::Crate
&crate
);
243 virtual void visit (AST::Token
&tok
) override
;
244 virtual void visit (AST::DelimTokenTree
&delim_tok_tree
) override
;
245 virtual void visit (AST::AttrInputMetaItemContainer
&input
) override
;
246 virtual void visit (AST::IdentifierExpr
&ident_expr
) override
;
247 virtual void visit (AST::Lifetime
&lifetime
) override
;
248 virtual void visit (AST::LifetimeParam
&lifetime_param
) override
;
249 virtual void visit (AST::ConstGenericParam
&const_param
) override
;
250 virtual void visit (AST::PathInExpression
&path
) override
;
251 virtual void visit (AST::TypePathSegment
&segment
) override
;
252 virtual void visit (AST::TypePathSegmentGeneric
&segment
) override
;
253 virtual void visit (AST::TypePathSegmentFunction
&segment
) override
;
254 virtual void visit (AST::TypePath
&path
) override
;
255 virtual void visit (AST::QualifiedPathInExpression
&path
) override
;
256 virtual void visit (AST::QualifiedPathInType
&path
) override
;
257 virtual void visit (AST::LiteralExpr
&expr
) override
;
258 virtual void visit (AST::AttrInputLiteral
&attr_input
) override
;
259 virtual void visit (AST::AttrInputMacro
&attr_input
) override
;
260 virtual void visit (AST::MetaItemLitExpr
&meta_item
) override
;
261 virtual void visit (AST::MetaItemPathLit
&meta_item
) override
;
262 virtual void visit (AST::BorrowExpr
&expr
) override
;
263 virtual void visit (AST::DereferenceExpr
&expr
) override
;
264 virtual void visit (AST::ErrorPropagationExpr
&expr
) override
;
265 virtual void visit (AST::NegationExpr
&expr
) override
;
266 virtual void visit (AST::ArithmeticOrLogicalExpr
&expr
) override
;
267 virtual void visit (AST::ComparisonExpr
&expr
) override
;
268 virtual void visit (AST::LazyBooleanExpr
&expr
) override
;
269 virtual void visit (AST::TypeCastExpr
&expr
) override
;
270 virtual void visit (AST::AssignmentExpr
&expr
) override
;
271 virtual void visit (AST::CompoundAssignmentExpr
&expr
) override
;
272 virtual void visit (AST::GroupedExpr
&expr
) override
;
273 virtual void visit (AST::ArrayElemsValues
&elems
) override
;
274 virtual void visit (AST::ArrayElemsCopied
&elems
) override
;
275 virtual void visit (AST::ArrayExpr
&expr
) override
;
276 virtual void visit (AST::ArrayIndexExpr
&expr
) override
;
277 virtual void visit (AST::TupleExpr
&expr
) override
;
278 virtual void visit (AST::TupleIndexExpr
&expr
) override
;
279 virtual void visit (AST::StructExprStruct
&expr
) override
;
280 virtual void visit (AST::StructExprFieldIdentifier
&field
) override
;
281 virtual void visit (AST::StructExprFieldIdentifierValue
&field
) override
;
282 virtual void visit (AST::StructExprFieldIndexValue
&field
) override
;
283 virtual void visit (AST::StructExprStructFields
&expr
) override
;
284 virtual void visit (AST::StructExprStructBase
&expr
) override
;
285 virtual void visit (AST::CallExpr
&expr
) override
;
286 virtual void visit (AST::MethodCallExpr
&expr
) override
;
287 virtual void visit (AST::FieldAccessExpr
&expr
) override
;
288 virtual void visit (AST::ClosureExprInner
&expr
) override
;
289 virtual void visit (AST::BlockExpr
&expr
) override
;
290 virtual void visit (AST::ClosureExprInnerTyped
&expr
) override
;
291 virtual void visit (AST::ContinueExpr
&expr
) override
;
292 virtual void visit (AST::BreakExpr
&expr
) override
;
293 virtual void visit (AST::RangeFromToExpr
&expr
) override
;
294 virtual void visit (AST::RangeFromExpr
&expr
) override
;
295 virtual void visit (AST::RangeToExpr
&expr
) override
;
296 virtual void visit (AST::RangeFullExpr
&expr
) override
;
297 virtual void visit (AST::RangeFromToInclExpr
&expr
) override
;
298 virtual void visit (AST::RangeToInclExpr
&expr
) override
;
299 virtual void visit (AST::ReturnExpr
&expr
) override
;
300 virtual void visit (AST::UnsafeBlockExpr
&expr
) override
;
301 virtual void visit (AST::LoopExpr
&expr
) override
;
302 virtual void visit (AST::WhileLoopExpr
&expr
) override
;
303 virtual void visit (AST::WhileLetLoopExpr
&expr
) override
;
304 virtual void visit (AST::ForLoopExpr
&expr
) override
;
305 virtual void visit (AST::IfExpr
&expr
) override
;
306 virtual void visit (AST::IfExprConseqElse
&expr
) override
;
307 virtual void visit (AST::IfLetExpr
&expr
) override
;
308 virtual void visit (AST::IfLetExprConseqElse
&expr
) override
;
309 virtual void visit (AST::MatchExpr
&expr
) override
;
310 virtual void visit (AST::AwaitExpr
&expr
) override
;
311 virtual void visit (AST::AsyncBlockExpr
&expr
) override
;
312 virtual void visit (AST::TypeParam
¶m
) override
;
313 virtual void visit (AST::LifetimeWhereClauseItem
&item
) override
;
314 virtual void visit (AST::TypeBoundWhereClauseItem
&item
) override
;
315 virtual void visit (AST::Module
&module
) override
;
316 virtual void visit (AST::ExternCrate
&crate
) override
;
317 virtual void visit (AST::UseTreeGlob
&use_tree
) override
;
318 virtual void visit (AST::UseTreeList
&use_tree
) override
;
319 virtual void visit (AST::UseTreeRebind
&use_tree
) override
;
320 virtual void visit (AST::UseDeclaration
&use_decl
) override
;
321 virtual void visit (AST::Function
&function
) override
;
322 virtual void visit (AST::TypeAlias
&type_alias
) override
;
323 virtual void visit (AST::StructStruct
&struct_item
) override
;
324 virtual void visit (AST::TupleStruct
&tuple_struct
) override
;
325 virtual void visit (AST::EnumItem
&item
) override
;
326 virtual void visit (AST::EnumItemTuple
&item
) override
;
327 virtual void visit (AST::EnumItemStruct
&item
) override
;
328 virtual void visit (AST::EnumItemDiscriminant
&item
) override
;
329 virtual void visit (AST::Enum
&enum_item
) override
;
330 virtual void visit (AST::Union
&union_item
) override
;
331 virtual void visit (AST::ConstantItem
&const_item
) override
;
332 virtual void visit (AST::StaticItem
&static_item
) override
;
333 virtual void visit (AST::TraitItemConst
&item
) override
;
334 virtual void visit (AST::TraitItemType
&item
) override
;
335 virtual void visit (AST::Trait
&trait
) override
;
336 virtual void visit (AST::InherentImpl
&impl
) override
;
337 virtual void visit (AST::TraitImpl
&impl
) override
;
338 virtual void visit (AST::ExternalTypeItem
&item
) override
;
339 virtual void visit (AST::ExternalStaticItem
&item
) override
;
340 virtual void visit (AST::ExternBlock
&block
) override
;
341 virtual void visit (AST::MacroMatchFragment
&match
) override
;
342 virtual void visit (AST::MacroMatchRepetition
&match
) override
;
343 virtual void visit (AST::MacroMatcher
&matcher
) override
;
344 virtual void visit (AST::MacroRulesDefinition
&rules_def
) override
;
345 virtual void visit (AST::MacroInvocation
¯o_invoc
) override
;
346 virtual void visit (AST::MetaItemPath
&meta_item
) override
;
347 virtual void visit (AST::MetaItemSeq
&meta_item
) override
;
348 virtual void visit (AST::MetaWord
&meta_item
) override
;
349 virtual void visit (AST::MetaNameValueStr
&meta_item
) override
;
350 virtual void visit (AST::MetaListPaths
&meta_item
) override
;
351 virtual void visit (AST::MetaListNameValueStr
&meta_item
) override
;
352 virtual void visit (AST::LiteralPattern
&pattern
) override
;
353 virtual void visit (AST::IdentifierPattern
&pattern
) override
;
354 virtual void visit (AST::WildcardPattern
&pattern
) override
;
355 virtual void visit (AST::RestPattern
&pattern
) override
;
356 virtual void visit (AST::RangePatternBoundLiteral
&bound
) override
;
357 virtual void visit (AST::RangePatternBoundPath
&bound
) override
;
358 virtual void visit (AST::RangePatternBoundQualPath
&bound
) override
;
359 virtual void visit (AST::RangePattern
&pattern
) override
;
360 virtual void visit (AST::ReferencePattern
&pattern
) override
;
361 virtual void visit (AST::StructPatternFieldTuplePat
&field
) override
;
362 virtual void visit (AST::StructPatternFieldIdentPat
&field
) override
;
363 virtual void visit (AST::StructPatternFieldIdent
&field
) override
;
364 virtual void visit (AST::StructPattern
&pattern
) override
;
365 virtual void visit (AST::TupleStructItemsNoRange
&tuple_items
) override
;
366 virtual void visit (AST::TupleStructItemsRange
&tuple_items
) override
;
367 virtual void visit (AST::TupleStructPattern
&pattern
) override
;
368 virtual void visit (AST::TuplePatternItemsMultiple
&tuple_items
) override
;
369 virtual void visit (AST::TuplePatternItemsRanged
&tuple_items
) override
;
370 virtual void visit (AST::TuplePattern
&pattern
) override
;
371 virtual void visit (AST::GroupedPattern
&pattern
) override
;
372 virtual void visit (AST::SlicePattern
&pattern
) override
;
373 virtual void visit (AST::AltPattern
&pattern
) override
;
374 virtual void visit (AST::EmptyStmt
&stmt
) override
;
375 virtual void visit (AST::LetStmt
&stmt
) override
;
376 virtual void visit (AST::ExprStmt
&stmt
) override
;
377 virtual void visit (AST::TraitBound
&bound
) override
;
378 virtual void visit (AST::ImplTraitType
&type
) override
;
379 virtual void visit (AST::TraitObjectType
&type
) override
;
380 virtual void visit (AST::ParenthesisedType
&type
) override
;
381 virtual void visit (AST::ImplTraitTypeOneBound
&type
) override
;
382 virtual void visit (AST::TraitObjectTypeOneBound
&type
) override
;
383 virtual void visit (AST::TupleType
&type
) override
;
384 virtual void visit (AST::NeverType
&type
) override
;
385 virtual void visit (AST::RawPointerType
&type
) override
;
386 virtual void visit (AST::ReferenceType
&type
) override
;
387 virtual void visit (AST::ArrayType
&type
) override
;
388 virtual void visit (AST::SliceType
&type
) override
;
389 virtual void visit (AST::InferredType
&type
) override
;
390 virtual void visit (AST::BareFunctionType
&type
) override
;
391 virtual void visit (AST::SelfParam
&self
) override
;
392 virtual void visit (AST::FunctionParam
¶m
) override
;
393 virtual void visit (AST::VariadicParam
¶m
) override
;
394 virtual void visit (AST::FormatArgs
&fmt
) override
;
396 template <typename T
> void visit (T
&node
) { node
.accept_vis (*this); }
398 template <typename T
> void visit (std::unique_ptr
<T
> &node
)
400 node
->accept_vis (*this);
403 virtual void visit (AST::GenericArgsBinding
&binding
);
404 virtual void visit (AST::PathExprSegment
&segment
);
405 virtual void visit (AST::GenericArgs
&args
);
406 virtual void visit (AST::QualifiedPathType
&path
);
407 virtual void visit (AST::TypePathFunction
&tpf
);
408 virtual void visit (AST::PathIdentSegment
&segment
);
409 virtual void visit (AST::SimplePath
&path
);
410 virtual void visit (AST::SimplePathSegment
&segment
);
411 virtual void visit (AST::StructBase
&base
);
412 virtual void visit (AST::ClosureParam
¶m
);
413 virtual void visit (AST::LoopLabel
&label
);
414 virtual void visit (AST::MatchCase
&arm
);
415 virtual void visit (AST::MatchArm
&arm
);
416 virtual void visit (AST::Visibility
&vis
);
417 virtual void visit (AST::FunctionQualifiers
&qualifiers
);
418 virtual void visit (AST::WhereClause
&where
);
419 virtual void visit (AST::StructField
&field
);
420 virtual void visit (AST::TupleField
&field
);
421 virtual void visit (AST::NamedFunctionParam
¶m
);
422 virtual void visit (AST::MacroRule
&rule
);
423 virtual void visit (AST::MacroInvocData
&data
);
424 virtual void visit (AST::MacroTranscriber
&transcriber
);
425 virtual void visit (AST::StructPatternElements
&spe
);
426 virtual void visit (AST::MaybeNamedParam
¶m
);
428 void visit (AST::Attribute
&attribute
) {}
430 template <typename T
> void visit_outer_attrs (T
&node
)
432 for (auto &attr
: node
.get_outer_attrs ())
436 template <typename T
> void visit_inner_attrs (T
&node
)
438 for (auto &attr
: node
.get_inner_attrs ())
443 class ContextualASTVisitor
: public DefaultASTVisitor
455 using DefaultASTVisitor::visit
;
457 virtual void visit (AST::Crate
&crate
) override
;
459 virtual void visit (AST::InherentImpl
&impl
) override
;
461 virtual void visit (AST::TraitImpl
&impl
) override
;
463 virtual void visit (AST::Trait
&trait
) override
;
465 template <typename T
> void visit (T
&item
)
467 DefaultASTVisitor::visit (item
);
470 std::vector
<Context
> context
;
472 void push_context (Context ctx
) { context
.push_back (ctx
); }
474 void pop_context () { context
.pop_back (); }