Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
2 :
3 : // This file is part of GCC.
4 :
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
8 : // version.
9 :
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
13 : // for more details.
14 :
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/>.
18 :
19 : #ifndef RUST_AST_VISITOR_H
20 : #define RUST_AST_VISITOR_H
21 : // Visitor base for AST
22 :
23 : // full include not required - only forward decls
24 : #include "rust-ast-full-decls.h"
25 : #include "rust-ast.h"
26 : #include "rust-item.h"
27 : #include "rust-path.h"
28 : #include "rust-system.h"
29 : #include "rust-stacked-contexts.h"
30 :
31 : namespace Rust {
32 : namespace AST {
33 : /* Pure abstract class that provides an interface for accessing different
34 : * classes of the AST. */
35 477988 : class ASTVisitor
36 : {
37 : public:
38 : // only concrete class overloads are required
39 :
40 : // rust-ast.h
41 : // virtual void visit(AttrInput& attr_input) = 0;
42 : // virtual void visit(TokenTree& token_tree) = 0;
43 : // virtual void visit(MacroMatch& macro_match) = 0;
44 : virtual void visit (Token &tok) = 0;
45 : virtual void visit (DelimTokenTree &delim_tok_tree) = 0;
46 : virtual void visit (AttrInputMetaItemContainer &input) = 0;
47 : // virtual void visit(MetaItem& meta_item) = 0;
48 : // virtual void visit(Stmt& stmt) = 0;
49 : // virtual void visit(Expr& expr) = 0;
50 : virtual void visit (IdentifierExpr &ident_expr) = 0;
51 : // virtual void visit(Pattern& pattern) = 0;
52 : // virtual void visit(Type& type) = 0;
53 : // virtual void visit(TypeParamBound& type_param_bound) = 0;
54 : virtual void visit (Lifetime &lifetime) = 0;
55 : // virtual void visit(GenericParam& generic_param) = 0;
56 : virtual void visit (LifetimeParam &lifetime_param) = 0;
57 : virtual void visit (ConstGenericParam &const_param) = 0;
58 : // virtual void visit(TraitItem& trait_item) = 0;
59 : // virtual void visit(InherentImplItem& inherent_impl_item) = 0;
60 : // virtual void visit(TraitImplItem& trait_impl_item) = 0;
61 :
62 : // rust-path.h
63 : virtual void visit (PathInExpression &path) = 0;
64 : virtual void visit (TypePathSegment &segment) = 0;
65 : virtual void visit (TypePathSegmentGeneric &segment) = 0;
66 : virtual void visit (TypePathSegmentFunction &segment) = 0;
67 : virtual void visit (TypePath &path) = 0;
68 : virtual void visit (QualifiedPathInExpression &path) = 0;
69 : virtual void visit (QualifiedPathInType &path) = 0;
70 :
71 : // rust-expr.h
72 : virtual void visit (LiteralExpr &expr) = 0;
73 : virtual void visit (AttrInputLiteral &attr_input) = 0;
74 : virtual void visit (AttrInputMacro &attr_input) = 0;
75 : virtual void visit (MetaItemLitExpr &meta_item) = 0;
76 : virtual void visit (MetaItemPathExpr &meta_item) = 0;
77 : virtual void visit (BorrowExpr &expr) = 0;
78 : virtual void visit (DereferenceExpr &expr) = 0;
79 : virtual void visit (ErrorPropagationExpr &expr) = 0;
80 : virtual void visit (NegationExpr &expr) = 0;
81 : virtual void visit (ArithmeticOrLogicalExpr &expr) = 0;
82 : virtual void visit (ComparisonExpr &expr) = 0;
83 : virtual void visit (LazyBooleanExpr &expr) = 0;
84 : virtual void visit (TypeCastExpr &expr) = 0;
85 : virtual void visit (AssignmentExpr &expr) = 0;
86 : virtual void visit (CompoundAssignmentExpr &expr) = 0;
87 : virtual void visit (GroupedExpr &expr) = 0;
88 : // virtual void visit(ArrayElems& elems) = 0;
89 : virtual void visit (ArrayElemsValues &elems) = 0;
90 : virtual void visit (ArrayElemsCopied &elems) = 0;
91 : virtual void visit (ArrayExpr &expr) = 0;
92 : virtual void visit (ArrayIndexExpr &expr) = 0;
93 : virtual void visit (TupleExpr &expr) = 0;
94 : virtual void visit (TupleIndexExpr &expr) = 0;
95 : virtual void visit (StructExprStruct &expr) = 0;
96 : // virtual void visit(StructExprField& field) = 0;
97 : virtual void visit (StructExprFieldIdentifier &field) = 0;
98 : virtual void visit (StructExprFieldIdentifierValue &field) = 0;
99 : virtual void visit (StructExprFieldIndexValue &field) = 0;
100 : virtual void visit (StructExprStructFields &expr) = 0;
101 : virtual void visit (StructExprStructBase &expr) = 0;
102 : virtual void visit (CallExpr &expr) = 0;
103 : virtual void visit (MethodCallExpr &expr) = 0;
104 : virtual void visit (FieldAccessExpr &expr) = 0;
105 : virtual void visit (ClosureExprInner &expr) = 0;
106 : virtual void visit (BlockExpr &expr) = 0;
107 : virtual void visit (AnonConst &expr) = 0;
108 : virtual void visit (ConstBlock &expr) = 0;
109 : virtual void visit (ClosureExprInnerTyped &expr) = 0;
110 : virtual void visit (ContinueExpr &expr) = 0;
111 : virtual void visit (BreakExpr &expr) = 0;
112 : virtual void visit (RangeFromToExpr &expr) = 0;
113 : virtual void visit (RangeFromExpr &expr) = 0;
114 : virtual void visit (RangeToExpr &expr) = 0;
115 : virtual void visit (RangeFullExpr &expr) = 0;
116 : virtual void visit (RangeFromToInclExpr &expr) = 0;
117 : virtual void visit (RangeToInclExpr &expr) = 0;
118 : virtual void visit (ReturnExpr &expr) = 0;
119 : virtual void visit (TryExpr &expr) = 0;
120 : virtual void visit (BoxExpr &expr) = 0;
121 : virtual void visit (UnsafeBlockExpr &expr) = 0;
122 : virtual void visit (LoopExpr &expr) = 0;
123 : virtual void visit (WhileLoopExpr &expr) = 0;
124 : virtual void visit (WhileLetLoopExpr &expr) = 0;
125 : virtual void visit (ForLoopExpr &expr) = 0;
126 : virtual void visit (IfExpr &expr) = 0;
127 : virtual void visit (IfExprConseqElse &expr) = 0;
128 : virtual void visit (IfLetExpr &expr) = 0;
129 : virtual void visit (IfLetExprConseqElse &expr) = 0;
130 : // virtual void visit(MatchCase& match_case) = 0;
131 : // virtual void visit (MatchCaseBlockExpr &match_case) = 0;
132 : // virtual void visit (MatchCaseExpr &match_case) = 0;
133 : virtual void visit (MatchExpr &expr) = 0;
134 : virtual void visit (AwaitExpr &expr) = 0;
135 : virtual void visit (AsyncBlockExpr &expr) = 0;
136 : virtual void visit (InlineAsm &expr) = 0;
137 : virtual void visit (LlvmInlineAsm &expr) = 0;
138 :
139 : // rust-item.h
140 : virtual void visit (TypeParam ¶m) = 0;
141 : virtual void visit (SelfParam ¶m) = 0;
142 : virtual void visit (FunctionParam ¶m) = 0;
143 : virtual void visit (VariadicParam ¶m) = 0;
144 :
145 : // virtual void visit(WhereClauseItem& item) = 0;
146 : virtual void visit (LifetimeWhereClauseItem &item) = 0;
147 : virtual void visit (TypeBoundWhereClauseItem &item) = 0;
148 : virtual void visit (Module &module) = 0;
149 : virtual void visit (ExternCrate &crate) = 0;
150 : // virtual void visit(UseTree& use_tree) = 0;
151 : virtual void visit (UseTreeGlob &use_tree) = 0;
152 : virtual void visit (UseTreeList &use_tree) = 0;
153 : virtual void visit (UseTreeRebind &use_tree) = 0;
154 : virtual void visit (UseDeclaration &use_decl) = 0;
155 : virtual void visit (Function &function) = 0;
156 : virtual void visit (TypeAlias &type_alias) = 0;
157 : virtual void visit (StructStruct &struct_item) = 0;
158 : virtual void visit (TupleStruct &tuple_struct) = 0;
159 : virtual void visit (EnumItem &item) = 0;
160 : virtual void visit (EnumItemTuple &item) = 0;
161 : virtual void visit (EnumItemStruct &item) = 0;
162 : virtual void visit (EnumItemDiscriminant &item) = 0;
163 : virtual void visit (Enum &enum_item) = 0;
164 : virtual void visit (Union &union_item) = 0;
165 : virtual void visit (ConstantItem &const_item) = 0;
166 : virtual void visit (StaticItem &static_item) = 0;
167 : virtual void visit (TraitItemType &item) = 0;
168 : virtual void visit (Trait &trait) = 0;
169 : virtual void visit (InherentImpl &impl) = 0;
170 : virtual void visit (TraitImpl &impl) = 0;
171 : // virtual void visit(ExternalItem& item) = 0;
172 : virtual void visit (ExternalTypeItem &type) = 0;
173 : virtual void visit (ExternalStaticItem &item) = 0;
174 : virtual void visit (ExternBlock &block) = 0;
175 :
176 : // rust-macro.h
177 : virtual void visit (MacroMatchFragment &match) = 0;
178 : virtual void visit (MacroMatchRepetition &match) = 0;
179 : virtual void visit (MacroMatcher &matcher) = 0;
180 : virtual void visit (MacroRulesDefinition &rules_def) = 0;
181 : virtual void visit (MacroInvocation ¯o_invoc) = 0;
182 : virtual void visit (MetaItemPath &meta_item) = 0;
183 : virtual void visit (MetaItemSeq &meta_item) = 0;
184 : virtual void visit (MetaWord &meta_item) = 0;
185 : virtual void visit (MetaNameValueStr &meta_item) = 0;
186 : virtual void visit (MetaListPaths &meta_item) = 0;
187 : virtual void visit (MetaListNameValueStr &meta_item) = 0;
188 :
189 : // rust-pattern.h
190 : virtual void visit (LiteralPattern &pattern) = 0;
191 : virtual void visit (IdentifierPattern &pattern) = 0;
192 : virtual void visit (WildcardPattern &pattern) = 0;
193 : virtual void visit (RestPattern &pattern) = 0;
194 : // virtual void visit(RangePatternBound& bound) = 0;
195 : virtual void visit (RangePatternBoundLiteral &bound) = 0;
196 : virtual void visit (RangePatternBoundPath &bound) = 0;
197 : virtual void visit (RangePatternBoundQualPath &bound) = 0;
198 : virtual void visit (RangePattern &pattern) = 0;
199 : virtual void visit (ReferencePattern &pattern) = 0;
200 : // virtual void visit(StructPatternField& field) = 0;
201 : virtual void visit (StructPatternFieldTuplePat &field) = 0;
202 : virtual void visit (StructPatternFieldIdentPat &field) = 0;
203 : virtual void visit (StructPatternFieldIdent &field) = 0;
204 : virtual void visit (StructPattern &pattern) = 0;
205 : // virtual void visit(TupleStructItems& tuple_items) = 0;
206 : virtual void visit (TupleStructItemsNoRest &tuple_items) = 0;
207 : virtual void visit (TupleStructItemsHasRest &tuple_items) = 0;
208 : virtual void visit (TupleStructPattern &pattern) = 0;
209 : // virtual void visit(TuplePatternItems& tuple_items) = 0;
210 : virtual void visit (TuplePatternItemsNoRest &tuple_items) = 0;
211 : virtual void visit (TuplePatternItemsHasRest &tuple_items) = 0;
212 : virtual void visit (TuplePattern &pattern) = 0;
213 : virtual void visit (GroupedPattern &pattern) = 0;
214 : virtual void visit (SlicePatternItemsNoRest &items) = 0;
215 : virtual void visit (SlicePatternItemsHasRest &items) = 0;
216 : virtual void visit (SlicePattern &pattern) = 0;
217 : virtual void visit (AltPattern &pattern) = 0;
218 :
219 : // rust-stmt.h
220 : virtual void visit (EmptyStmt &stmt) = 0;
221 : virtual void visit (LetStmt &stmt) = 0;
222 : virtual void visit (ExprStmt &stmt) = 0;
223 :
224 : // rust-type.h
225 : virtual void visit (TraitBound &bound) = 0;
226 : virtual void visit (ImplTraitType &type) = 0;
227 : virtual void visit (TraitObjectType &type) = 0;
228 : virtual void visit (ParenthesisedType &type) = 0;
229 : virtual void visit (ImplTraitTypeOneBound &type) = 0;
230 : virtual void visit (TraitObjectTypeOneBound &type) = 0;
231 : virtual void visit (TupleType &type) = 0;
232 : virtual void visit (NeverType &type) = 0;
233 : virtual void visit (RawPointerType &type) = 0;
234 : virtual void visit (ReferenceType &type) = 0;
235 : virtual void visit (ArrayType &type) = 0;
236 : virtual void visit (SliceType &type) = 0;
237 : virtual void visit (InferredType &type) = 0;
238 : virtual void visit (BareFunctionType &type) = 0;
239 :
240 : // special AST nodes for certain builtin macros such as `asm!()`
241 : virtual void visit (FormatArgs &fmt) = 0;
242 : virtual void visit (OffsetOf &fmt) = 0;
243 :
244 : // TODO: rust-cond-compilation.h visiting? not currently used
245 : };
246 :
247 82538 : class DefaultASTVisitor : public ASTVisitor
248 : {
249 : public:
250 : virtual void visit_function_params (AST::Function &function);
251 :
252 : virtual void visit (AST::Crate &crate);
253 :
254 : virtual void visit (AST::Token &tok) override;
255 : virtual void visit (AST::DelimTokenTree &delim_tok_tree) override;
256 : virtual void visit (AST::AttrInputMetaItemContainer &input) override;
257 : virtual void visit (AST::IdentifierExpr &ident_expr) override;
258 : virtual void visit (AST::Lifetime &lifetime) override;
259 : virtual void visit (AST::LifetimeParam &lifetime_param) override;
260 : virtual void visit (AST::ConstGenericParam &const_param) override;
261 : virtual void visit (AST::PathInExpression &path) override;
262 : virtual void visit (AST::TypePathSegment &segment) override;
263 : virtual void visit (AST::TypePathSegmentGeneric &segment) override;
264 : virtual void visit (AST::TypePathSegmentFunction &segment) override;
265 : virtual void visit (AST::TypePath &path) override;
266 : virtual void visit (AST::QualifiedPathInExpression &path) override;
267 : virtual void visit (AST::QualifiedPathInType &path) override;
268 : virtual void visit (AST::LiteralExpr &expr) override;
269 : virtual void visit (AST::AttrInputLiteral &attr_input) override;
270 : virtual void visit (AST::AttrInputMacro &attr_input) override;
271 : virtual void visit (AST::MetaItemLitExpr &meta_item) override;
272 : virtual void visit (AST::MetaItemPathExpr &meta_item) override;
273 : virtual void visit (AST::BorrowExpr &expr) override;
274 : virtual void visit (AST::DereferenceExpr &expr) override;
275 : virtual void visit (AST::ErrorPropagationExpr &expr) override;
276 : virtual void visit (AST::NegationExpr &expr) override;
277 : virtual void visit (AST::ArithmeticOrLogicalExpr &expr) override;
278 : virtual void visit (AST::ComparisonExpr &expr) override;
279 : virtual void visit (AST::LazyBooleanExpr &expr) override;
280 : virtual void visit (AST::TypeCastExpr &expr) override;
281 : virtual void visit (AST::AssignmentExpr &expr) override;
282 : virtual void visit (AST::CompoundAssignmentExpr &expr) override;
283 : virtual void visit (AST::GroupedExpr &expr) override;
284 : virtual void visit (AST::ArrayElemsValues &elems) override;
285 : virtual void visit (AST::ArrayElemsCopied &elems) override;
286 : virtual void visit (AST::ArrayExpr &expr) override;
287 : virtual void visit (AST::ArrayIndexExpr &expr) override;
288 : virtual void visit (AST::TupleExpr &expr) override;
289 : virtual void visit (AST::TupleIndexExpr &expr) override;
290 : virtual void visit (AST::StructExprStruct &expr) override;
291 : virtual void visit (AST::StructExprFieldIdentifier &field) override;
292 : virtual void visit (AST::StructExprFieldIdentifierValue &field) override;
293 : virtual void visit (AST::StructExprFieldIndexValue &field) override;
294 : virtual void visit (AST::StructExprStructFields &expr) override;
295 : virtual void visit (AST::StructExprStructBase &expr) override;
296 : virtual void visit (AST::CallExpr &expr) override;
297 : virtual void visit (AST::MethodCallExpr &expr) override;
298 : virtual void visit (AST::FieldAccessExpr &expr) override;
299 : virtual void visit (AST::ClosureExprInner &expr) override;
300 : virtual void visit (AST::BlockExpr &expr) override;
301 : virtual void visit (AST::AnonConst &expr) override;
302 : virtual void visit (AST::ConstBlock &expr) override;
303 : virtual void visit (AST::ClosureExprInnerTyped &expr) override;
304 : virtual void visit (AST::ContinueExpr &expr) override;
305 : virtual void visit (AST::BreakExpr &expr) override;
306 : virtual void visit (AST::RangeFromToExpr &expr) override;
307 : virtual void visit (AST::RangeFromExpr &expr) override;
308 : virtual void visit (AST::RangeToExpr &expr) override;
309 : virtual void visit (AST::RangeFullExpr &expr) override;
310 : virtual void visit (AST::RangeFromToInclExpr &expr) override;
311 : virtual void visit (AST::RangeToInclExpr &expr) override;
312 : virtual void visit (AST::ReturnExpr &expr) override;
313 : virtual void visit (AST::TryExpr &expr) override;
314 : virtual void visit (AST::BoxExpr &expr) override;
315 : virtual void visit (AST::UnsafeBlockExpr &expr) override;
316 : virtual void visit (AST::LoopExpr &expr) override;
317 : virtual void visit (AST::WhileLoopExpr &expr) override;
318 : virtual void visit (AST::WhileLetLoopExpr &expr) override;
319 : virtual void visit (AST::ForLoopExpr &expr) override;
320 : virtual void visit (AST::IfExpr &expr) override;
321 : virtual void visit (AST::IfExprConseqElse &expr) override;
322 : virtual void visit (AST::IfLetExpr &expr) override;
323 : virtual void visit (AST::IfLetExprConseqElse &expr) override;
324 : virtual void visit (AST::MatchExpr &expr) override;
325 : virtual void visit (AST::AwaitExpr &expr) override;
326 : virtual void visit (AST::AsyncBlockExpr &expr) override;
327 : virtual void visit (InlineAsm &expr) override;
328 : virtual void visit (LlvmInlineAsm &expr) override;
329 :
330 : virtual void visit (AST::TypeParam ¶m) override;
331 : virtual void visit (AST::LifetimeWhereClauseItem &item) override;
332 : virtual void visit (AST::TypeBoundWhereClauseItem &item) override;
333 : virtual void visit (AST::Module &module) override;
334 : virtual void visit (AST::ExternCrate &crate) override;
335 : virtual void visit (AST::UseTreeGlob &use_tree) override;
336 : virtual void visit (AST::UseTreeList &use_tree) override;
337 : virtual void visit (AST::UseTreeRebind &use_tree) override;
338 : virtual void visit (AST::UseDeclaration &use_decl) override;
339 : virtual void visit (AST::Function &function) override;
340 : virtual void visit (AST::TypeAlias &type_alias) override;
341 : virtual void visit (AST::StructStruct &struct_item) override;
342 : virtual void visit (AST::TupleStruct &tuple_struct) override;
343 : virtual void visit (AST::EnumItem &item) override;
344 : virtual void visit (AST::EnumItemTuple &item) override;
345 : virtual void visit (AST::EnumItemStruct &item) override;
346 : virtual void visit (AST::EnumItemDiscriminant &item) override;
347 : virtual void visit (AST::Enum &enum_item) override;
348 : virtual void visit (AST::Union &union_item) override;
349 : virtual void visit (AST::ConstantItem &const_item) override;
350 : virtual void visit (AST::StaticItem &static_item) override;
351 : virtual void visit (AST::TraitItemType &item) override;
352 : virtual void visit (AST::Trait &trait) override;
353 : virtual void visit (AST::InherentImpl &impl) override;
354 : virtual void visit (AST::TraitImpl &impl) override;
355 : virtual void visit (AST::ExternalTypeItem &item) override;
356 : virtual void visit (AST::ExternalStaticItem &item) override;
357 : virtual void visit (AST::ExternBlock &block) override;
358 : virtual void visit (AST::MacroMatchFragment &match) override;
359 : virtual void visit (AST::MacroMatchRepetition &match) override;
360 : virtual void visit (AST::MacroMatcher &matcher) override;
361 : virtual void visit (AST::MacroRulesDefinition &rules_def) override;
362 : virtual void visit (AST::MacroInvocation ¯o_invoc) override;
363 : virtual void visit (AST::MetaItemPath &meta_item) override;
364 : virtual void visit (AST::MetaItemSeq &meta_item) override;
365 : virtual void visit (AST::MetaWord &meta_item) override;
366 : virtual void visit (AST::MetaNameValueStr &meta_item) override;
367 : virtual void visit (AST::MetaListPaths &meta_item) override;
368 : virtual void visit (AST::MetaListNameValueStr &meta_item) override;
369 : virtual void visit (AST::LiteralPattern &pattern) override;
370 : virtual void visit (AST::IdentifierPattern &pattern) override;
371 : virtual void visit (AST::WildcardPattern &pattern) override;
372 : virtual void visit (AST::RestPattern &pattern) override;
373 : virtual void visit (AST::RangePatternBoundLiteral &bound) override;
374 : virtual void visit (AST::RangePatternBoundPath &bound) override;
375 : virtual void visit (AST::RangePatternBoundQualPath &bound) override;
376 : virtual void visit (AST::RangePattern &pattern) override;
377 : virtual void visit (AST::ReferencePattern &pattern) override;
378 : virtual void visit (AST::StructPatternFieldTuplePat &field) override;
379 : virtual void visit (AST::StructPatternFieldIdentPat &field) override;
380 : virtual void visit (AST::StructPatternFieldIdent &field) override;
381 : virtual void visit (AST::StructPattern &pattern) override;
382 : virtual void visit (AST::TupleStructItemsNoRest &tuple_items) override;
383 : virtual void visit (AST::TupleStructItemsHasRest &tuple_items) override;
384 : virtual void visit (AST::TupleStructPattern &pattern) override;
385 : virtual void visit (AST::TuplePatternItemsNoRest &tuple_items) override;
386 : virtual void visit (AST::TuplePatternItemsHasRest &tuple_items) override;
387 : virtual void visit (AST::TuplePattern &pattern) override;
388 : virtual void visit (AST::GroupedPattern &pattern) override;
389 : virtual void visit (AST::SlicePatternItemsNoRest &items) override;
390 : virtual void visit (AST::SlicePatternItemsHasRest &items) override;
391 : virtual void visit (AST::SlicePattern &pattern) override;
392 : virtual void visit (AST::AltPattern &pattern) override;
393 : virtual void visit (AST::EmptyStmt &stmt) override;
394 : virtual void visit (AST::LetStmt &stmt) override;
395 : virtual void visit (AST::ExprStmt &stmt) override;
396 : virtual void visit (AST::TraitBound &bound) override;
397 : virtual void visit (AST::ImplTraitType &type) override;
398 : virtual void visit (AST::TraitObjectType &type) override;
399 : virtual void visit (AST::ParenthesisedType &type) override;
400 : virtual void visit (AST::ImplTraitTypeOneBound &type) override;
401 : virtual void visit (AST::TraitObjectTypeOneBound &type) override;
402 : virtual void visit (AST::TupleType &type) override;
403 : virtual void visit (AST::NeverType &type) override;
404 : virtual void visit (AST::RawPointerType &type) override;
405 : virtual void visit (AST::ReferenceType &type) override;
406 : virtual void visit (AST::ArrayType &type) override;
407 : virtual void visit (AST::SliceType &type) override;
408 : virtual void visit (AST::InferredType &type) override;
409 : virtual void visit (AST::BareFunctionType &type) override;
410 : virtual void visit (AST::SelfParam &self) override;
411 : virtual void visit (AST::FunctionParam ¶m) override;
412 : virtual void visit (AST::VariadicParam ¶m) override;
413 : virtual void visit (AST::FormatArgs &fmt) override;
414 : virtual void visit (AST::OffsetOf &fmt) override;
415 :
416 5988355 : template <typename T> void visit (T &node) { node.accept_vis (*this); }
417 :
418 3590659 : template <typename T> void visit (std::unique_ptr<T> &node)
419 : {
420 3590659 : node->accept_vis (*this);
421 193796 : }
422 :
423 : virtual void visit (AST::GenericArgsBinding &binding);
424 : virtual void visit (AST::PathExprSegment &segment);
425 : virtual void visit (AST::GenericArgs &args);
426 : virtual void visit (AST::QualifiedPathType &path);
427 : virtual void visit (AST::TypePathFunction &tpf);
428 : virtual void visit (AST::PathIdentSegment &segment);
429 : virtual void visit (AST::SimplePath &path);
430 : virtual void visit (AST::SimplePathSegment &segment);
431 : virtual void visit (AST::StructBase &base);
432 : virtual void visit (AST::ClosureParam ¶m);
433 : virtual void visit (AST::LoopLabel &label);
434 : virtual void visit (AST::MatchCase &arm);
435 : virtual void visit (AST::MatchArm &arm);
436 : virtual void visit (AST::Visibility &vis);
437 : virtual void visit (AST::FunctionQualifiers &qualifiers);
438 : virtual void visit (AST::WhereClause &where);
439 : virtual void visit (AST::StructField &field);
440 : virtual void visit (AST::TupleField &field);
441 : virtual void visit (AST::MacroRule &rule);
442 : virtual void visit (AST::MacroInvocData &data);
443 : virtual void visit (AST::MacroTranscriber &transcriber);
444 : virtual void visit (AST::StructPatternElements &spe);
445 : virtual void visit (AST::MaybeNamedParam ¶m);
446 :
447 : void visit (AST::Attribute &attribute) {}
448 :
449 797604 : template <typename T> void visit_outer_attrs (T &node)
450 : {
451 6019718 : for (auto &attr : node.get_outer_attrs ())
452 : visit (attr);
453 : }
454 :
455 630558 : template <typename T> void visit_inner_attrs (T &node)
456 : {
457 630558 : for (auto &attr : node.get_inner_attrs ())
458 : visit (attr);
459 : }
460 : };
461 :
462 4509 : class ContextualASTVisitor : public DefaultASTVisitor
463 : {
464 : protected:
465 : enum class Kind
466 : {
467 : FUNCTION,
468 : INHERENT_IMPL,
469 : TRAIT_IMPL,
470 : TRAIT,
471 : MODULE,
472 : CRATE,
473 : };
474 :
475 : using DefaultASTVisitor::visit;
476 :
477 : virtual void visit (AST::Crate &crate) override;
478 :
479 : virtual void visit (AST::InherentImpl &impl) override;
480 :
481 : virtual void visit (AST::TraitImpl &impl) override;
482 :
483 : virtual void visit (AST::Trait &trait) override;
484 :
485 : template <typename T> void visit (T &item)
486 : {
487 : DefaultASTVisitor::visit (item);
488 : }
489 :
490 : StackedContexts<Kind> ctx;
491 : };
492 :
493 : } // namespace AST
494 : } // namespace Rust
495 :
496 : #endif
|