Branch data Line data Source code
1 : : // Copyright (C) 2020-2024 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 : : #include "rust-default-resolver.h"
20 : : #include "rust-ast-full.h"
21 : : #include "rust-ast-visitor.h"
22 : : #include "rust-item.h"
23 : :
24 : : namespace Rust {
25 : : namespace Resolver2_0 {
26 : :
27 : : void
28 : 39 : DefaultResolver::visit (AST::BlockExpr &expr)
29 : : {
30 : : // extracting the lambda from the `scoped` call otherwise the code looks like
31 : : // a hot turd thanks to our .clang-format
32 : :
33 : 78 : auto inner_fn = [this, &expr] () {
34 : 95 : for (auto &stmt : expr.get_statements ())
35 : 56 : stmt->accept_vis (*this);
36 : :
37 : 39 : if (expr.has_tail_expr ())
38 : 14 : expr.get_tail_expr ()->accept_vis (*this);
39 : 78 : };
40 : :
41 : 39 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
42 : 39 : }
43 : :
44 : : void
45 : 31 : DefaultResolver::visit (AST::Module &module)
46 : : {
47 : 62 : auto item_fn = [this, &module] () {
48 : 66 : for (auto &item : module.get_items ())
49 : 35 : item->accept_vis (*this);
50 : 62 : };
51 : :
52 : 93 : ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn,
53 : 31 : module.get_name ());
54 : 31 : }
55 : :
56 : : void
57 : 78 : DefaultResolver::visit (AST::Function &function)
58 : : {
59 : 156 : auto def_fn = [this, &function] () {
60 : 78 : for (auto &p : function.get_function_params ())
61 : : {
62 : 0 : if (p->is_variadic ())
63 : : {
64 : 0 : auto param = static_cast<AST::VariadicParam *> (p.get ());
65 : 0 : param->get_pattern ()->accept_vis (*this);
66 : : }
67 : 0 : else if (p->is_self ())
68 : : {
69 : 0 : auto param = static_cast<AST::SelfParam *> (p.get ());
70 : 0 : param->get_type ()->accept_vis (*this);
71 : 0 : param->get_lifetime ().accept_vis (*this);
72 : : }
73 : : else
74 : : {
75 : 0 : auto param = static_cast<AST::FunctionParam *> (p.get ());
76 : 0 : param->get_pattern ()->accept_vis (*this);
77 : 0 : param->get_type ()->accept_vis (*this);
78 : : }
79 : : }
80 : :
81 : 78 : if (function.has_body ())
82 : 78 : function.get_definition ().value ()->accept_vis (*this);
83 : 156 : };
84 : :
85 : 78 : ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn);
86 : 78 : }
87 : :
88 : : void
89 : 0 : DefaultResolver::visit (AST::ForLoopExpr &expr)
90 : : {
91 : 0 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), [this, &expr] () {
92 : 0 : expr.get_pattern ()->accept_vis (*this);
93 : 0 : expr.get_iterator_expr ()->accept_vis (*this);
94 : 0 : expr.get_loop_block ()->accept_vis (*this);
95 : 0 : });
96 : 0 : }
97 : :
98 : : void
99 : 0 : DefaultResolver::visit (AST::Trait &trait)
100 : : {
101 : 0 : auto inner_fn = [this, &trait] () {
102 : 0 : for (auto &item : trait.get_trait_items ())
103 : 0 : item->accept_vis (*this);
104 : 0 : };
105 : :
106 : 0 : ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn,
107 : 0 : trait.get_identifier () /* FIXME: Is that valid?*/);
108 : 0 : }
109 : :
110 : : void
111 : 0 : DefaultResolver::visit (AST::InherentImpl &impl)
112 : : {
113 : 0 : auto inner_fn = [this, &impl] () {
114 : 0 : for (auto &item : impl.get_impl_items ())
115 : 0 : item->accept_vis (*this);
116 : 0 : };
117 : :
118 : 0 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn);
119 : 0 : }
120 : :
121 : : void
122 : 0 : DefaultResolver::visit (AST::TraitImpl &impl)
123 : : {
124 : 0 : auto inner_fn = [this, &impl] () {
125 : 0 : for (auto &item : impl.get_impl_items ())
126 : 0 : item->accept_vis (*this);
127 : 0 : };
128 : :
129 : 0 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn);
130 : 0 : }
131 : :
132 : : void
133 : 14 : DefaultResolver::visit (AST::ExternBlock &block)
134 : : {
135 : 28 : auto inner_fn = [this, &block] () {
136 : 28 : for (auto &item : block.get_extern_items ())
137 : 14 : item->accept_vis (*this);
138 : 28 : };
139 : :
140 : 14 : ctx.scoped (Rib::Kind::Normal /* FIXME: Correct? */, block.get_node_id (),
141 : : inner_fn);
142 : 14 : }
143 : :
144 : : void
145 : 0 : DefaultResolver::visit (AST::StructStruct &type)
146 : : {
147 : : // do we need to scope anything here? no, right?
148 : :
149 : : // we also can't visit `StructField`s by default, so there's nothing to do -
150 : : // correct? or should we do something like
151 : :
152 : 0 : AST::DefaultASTVisitor::visit (type);
153 : :
154 : : // FIXME: ???
155 : 0 : }
156 : :
157 : : void
158 : 0 : DefaultResolver::visit (AST::Enum &type)
159 : : {
160 : : // FIXME: Do we need to scope anything by default?
161 : :
162 : 0 : auto variant_fn = [this, &type] () {
163 : 0 : for (auto &variant : type.get_variants ())
164 : 0 : variant->accept_vis (*this);
165 : 0 : };
166 : :
167 : 0 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
168 : 0 : variant_fn, type.get_identifier ());
169 : 0 : }
170 : :
171 : : void
172 : 0 : DefaultResolver::visit (AST::StructExprFieldIdentifierValue &)
173 : 0 : {}
174 : :
175 : : void
176 : 0 : DefaultResolver::visit (AST::StructExprFieldIndexValue &)
177 : 0 : {}
178 : :
179 : : void
180 : 0 : DefaultResolver::visit (AST::ClosureExprInner &)
181 : 0 : {}
182 : :
183 : : void
184 : 0 : DefaultResolver::visit (AST::ClosureExprInnerTyped &)
185 : 0 : {}
186 : :
187 : : void
188 : 0 : DefaultResolver::visit (AST::ContinueExpr &expr)
189 : 0 : {}
190 : :
191 : : void
192 : 0 : DefaultResolver::visit (AST::RangeFromToExpr &expr)
193 : 0 : {}
194 : :
195 : : void
196 : 0 : DefaultResolver::visit (AST::RangeFromExpr &expr)
197 : 0 : {}
198 : :
199 : : void
200 : 0 : DefaultResolver::visit (AST::RangeToExpr &expr)
201 : 0 : {}
202 : :
203 : : void
204 : 0 : DefaultResolver::visit (AST::RangeFromToInclExpr &expr)
205 : 0 : {}
206 : :
207 : : void
208 : 0 : DefaultResolver::visit (AST::RangeToInclExpr &expr)
209 : 0 : {}
210 : :
211 : : void
212 : 0 : DefaultResolver::visit (AST::ReturnExpr &expr)
213 : 0 : {}
214 : :
215 : : void
216 : 14 : DefaultResolver::visit (AST::UnsafeBlockExpr &expr)
217 : 14 : {}
218 : :
219 : : void
220 : 0 : DefaultResolver::visit (AST::LoopExpr &expr)
221 : 0 : {}
222 : :
223 : : void
224 : 0 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
225 : 0 : {}
226 : :
227 : : void
228 : 0 : DefaultResolver::visit (AST::WhileLetLoopExpr &expr)
229 : 0 : {}
230 : :
231 : : void
232 : 0 : DefaultResolver::visit (AST::IfExpr &expr)
233 : 0 : {}
234 : :
235 : : void
236 : 0 : DefaultResolver::visit (AST::IfExprConseqElse &)
237 : 0 : {}
238 : :
239 : : void
240 : 0 : DefaultResolver::visit (AST::IfLetExpr &expr)
241 : 0 : {}
242 : :
243 : : void
244 : 0 : DefaultResolver::visit (AST::IfLetExprConseqElse &)
245 : 0 : {}
246 : :
247 : : void
248 : 0 : DefaultResolver::visit (AST::MatchExpr &expr)
249 : 0 : {}
250 : :
251 : : void
252 : 0 : DefaultResolver::visit (AST::AwaitExpr &expr)
253 : 0 : {}
254 : :
255 : : void
256 : 0 : DefaultResolver::visit (AST::AsyncBlockExpr &expr)
257 : 0 : {}
258 : :
259 : : void
260 : 0 : DefaultResolver::visit (AST::DelimTokenTree &)
261 : 0 : {}
262 : :
263 : : void
264 : 0 : DefaultResolver::visit (AST::AttrInputMetaItemContainer &)
265 : 0 : {}
266 : :
267 : : void
268 : 20 : DefaultResolver::visit (AST::IdentifierExpr &expr)
269 : 20 : {}
270 : :
271 : : void
272 : 0 : DefaultResolver::visit (AST::LifetimeParam &)
273 : 0 : {}
274 : :
275 : : void
276 : 0 : DefaultResolver::visit (AST::ConstGenericParam &)
277 : 0 : {}
278 : :
279 : : void
280 : 28 : DefaultResolver::visit (AST::PathInExpression &)
281 : 28 : {}
282 : :
283 : : void
284 : 0 : DefaultResolver::visit (AST::TypePathSegmentGeneric &)
285 : 0 : {}
286 : :
287 : : void
288 : 0 : DefaultResolver::visit (AST::TypePathSegmentFunction &)
289 : 0 : {}
290 : :
291 : : void
292 : 0 : DefaultResolver::visit (AST::TypePath &)
293 : 0 : {}
294 : :
295 : : void
296 : 0 : DefaultResolver::visit (AST::QualifiedPathInExpression &)
297 : 0 : {}
298 : :
299 : : void
300 : 0 : DefaultResolver::visit (AST::QualifiedPathInType &)
301 : 0 : {}
302 : :
303 : : void
304 : 38 : DefaultResolver::visit (AST::LiteralExpr &expr)
305 : 38 : {}
306 : :
307 : : void
308 : 0 : DefaultResolver::visit (AST::AttrInputLiteral &)
309 : 0 : {}
310 : :
311 : : void
312 : 0 : DefaultResolver::visit (AST::AttrInputMacro &)
313 : 0 : {}
314 : :
315 : : void
316 : 0 : DefaultResolver::visit (AST::MetaItemLitExpr &expr)
317 : 0 : {}
318 : :
319 : : void
320 : 0 : DefaultResolver::visit (AST::MetaItemPathLit &)
321 : 0 : {}
322 : :
323 : : void
324 : 0 : DefaultResolver::visit (AST::StructExprStruct &)
325 : 0 : {}
326 : :
327 : : void
328 : 0 : DefaultResolver::visit (AST::StructExprStructFields &)
329 : 0 : {}
330 : :
331 : : void
332 : 0 : DefaultResolver::visit (AST::StructExprStructBase &)
333 : 0 : {}
334 : :
335 : : void
336 : 0 : DefaultResolver::visit (AST::TypeParam &)
337 : 0 : {}
338 : :
339 : : void
340 : 0 : DefaultResolver::visit (AST::LifetimeWhereClauseItem &)
341 : 0 : {}
342 : :
343 : : void
344 : 0 : DefaultResolver::visit (AST::TypeBoundWhereClauseItem &)
345 : 0 : {}
346 : :
347 : : void
348 : 0 : DefaultResolver::visit (AST::ExternCrate &)
349 : 0 : {}
350 : :
351 : : void
352 : 0 : DefaultResolver::visit (AST::UseTreeGlob &)
353 : 0 : {}
354 : :
355 : : void
356 : 0 : DefaultResolver::visit (AST::UseTreeList &)
357 : 0 : {}
358 : :
359 : : void
360 : 0 : DefaultResolver::visit (AST::UseTreeRebind &)
361 : 0 : {}
362 : :
363 : : void
364 : 0 : DefaultResolver::visit (AST::UseDeclaration &)
365 : 0 : {}
366 : :
367 : : void
368 : 0 : DefaultResolver::visit (AST::TypeAlias &)
369 : 0 : {}
370 : :
371 : : void
372 : 0 : DefaultResolver::visit (AST::EnumItem &)
373 : 0 : {}
374 : :
375 : : void
376 : 0 : DefaultResolver::visit (AST::EnumItemTuple &)
377 : 0 : {}
378 : :
379 : : void
380 : 0 : DefaultResolver::visit (AST::EnumItemStruct &)
381 : 0 : {}
382 : :
383 : : void
384 : 0 : DefaultResolver::visit (AST::EnumItemDiscriminant &)
385 : 0 : {}
386 : :
387 : : void
388 : 8 : DefaultResolver::visit (AST::ConstantItem &item)
389 : : {
390 : 8 : auto expr_vis = [this, &item] () { item.get_expr ()->accept_vis (*this); };
391 : :
392 : : // FIXME: Why do we need a Rib here?
393 : 8 : ctx.scoped (Rib::Kind::Item, item.get_node_id (), expr_vis);
394 : 8 : }
395 : :
396 : : void
397 : 0 : DefaultResolver::visit (AST::StaticItem &item)
398 : : {
399 : 0 : auto expr_vis = [this, &item] () { item.get_expr ()->accept_vis (*this); };
400 : :
401 : : // FIXME: Why do we need a Rib here?
402 : 0 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis);
403 : 0 : }
404 : :
405 : : void
406 : 0 : DefaultResolver::visit (AST::TraitItemConst &)
407 : 0 : {}
408 : :
409 : : void
410 : 0 : DefaultResolver::visit (AST::TraitItemType &)
411 : 0 : {}
412 : :
413 : : void
414 : 0 : DefaultResolver::visit (AST::ExternalTypeItem &)
415 : 0 : {}
416 : :
417 : : void
418 : 0 : DefaultResolver::visit (AST::ExternalStaticItem &)
419 : 0 : {}
420 : :
421 : : void
422 : 14 : DefaultResolver::visit (AST::ExternalFunctionItem &)
423 : 14 : {}
424 : :
425 : : void
426 : 0 : DefaultResolver::visit (AST::MacroMatchRepetition &)
427 : 0 : {}
428 : :
429 : : void
430 : 0 : DefaultResolver::visit (AST::MacroMatcher &)
431 : 0 : {}
432 : :
433 : : void
434 : 14 : DefaultResolver::visit (AST::MacroRulesDefinition &)
435 : 14 : {}
436 : :
437 : : void
438 : 17 : DefaultResolver::visit (AST::MacroInvocation &)
439 : 17 : {}
440 : :
441 : : void
442 : 0 : DefaultResolver::visit (AST::MetaItemPath &)
443 : 0 : {}
444 : :
445 : : void
446 : 0 : DefaultResolver::visit (AST::MetaItemSeq &)
447 : 0 : {}
448 : :
449 : : void
450 : 0 : DefaultResolver::visit (AST::MetaListPaths &)
451 : 0 : {}
452 : :
453 : : void
454 : 0 : DefaultResolver::visit (AST::MetaListNameValueStr &)
455 : 0 : {}
456 : :
457 : : void
458 : 0 : DefaultResolver::visit (AST::RangePatternBoundPath &)
459 : 0 : {}
460 : :
461 : : void
462 : 0 : DefaultResolver::visit (AST::RangePatternBoundQualPath &)
463 : 0 : {}
464 : :
465 : : void
466 : 0 : DefaultResolver::visit (AST::RangePattern &)
467 : 0 : {}
468 : :
469 : : void
470 : 0 : DefaultResolver::visit (AST::ReferencePattern &)
471 : 0 : {}
472 : :
473 : : void
474 : 0 : DefaultResolver::visit (AST::StructPatternFieldTuplePat &)
475 : 0 : {}
476 : :
477 : : void
478 : 0 : DefaultResolver::visit (AST::StructPatternFieldIdentPat &)
479 : 0 : {}
480 : :
481 : : void
482 : 0 : DefaultResolver::visit (AST::StructPatternFieldIdent &)
483 : 0 : {}
484 : :
485 : : void
486 : 0 : DefaultResolver::visit (AST::StructPattern &)
487 : 0 : {}
488 : :
489 : : void
490 : 0 : DefaultResolver::visit (AST::TupleStructItemsNoRange &)
491 : 0 : {}
492 : :
493 : : void
494 : 0 : DefaultResolver::visit (AST::TupleStructItemsRange &)
495 : 0 : {}
496 : :
497 : : void
498 : 0 : DefaultResolver::visit (AST::TupleStructPattern &)
499 : 0 : {}
500 : :
501 : : void
502 : 0 : DefaultResolver::visit (AST::TuplePatternItemsMultiple &)
503 : 0 : {}
504 : :
505 : : void
506 : 0 : DefaultResolver::visit (AST::TuplePatternItemsRanged &)
507 : 0 : {}
508 : :
509 : : void
510 : 0 : DefaultResolver::visit (AST::TuplePattern &)
511 : 0 : {}
512 : :
513 : : void
514 : 0 : DefaultResolver::visit (AST::GroupedPattern &)
515 : 0 : {}
516 : :
517 : : void
518 : 0 : DefaultResolver::visit (AST::SlicePattern &)
519 : 0 : {}
520 : :
521 : : void
522 : 0 : DefaultResolver::visit (AST::AltPattern &)
523 : 0 : {}
524 : :
525 : : void
526 : 0 : DefaultResolver::visit (AST::EmptyStmt &)
527 : 0 : {}
528 : :
529 : : void
530 : 0 : DefaultResolver::visit (AST::TraitBound &)
531 : 0 : {}
532 : :
533 : : void
534 : 0 : DefaultResolver::visit (AST::ImplTraitType &)
535 : 0 : {}
536 : :
537 : : void
538 : 0 : DefaultResolver::visit (AST::TraitObjectType &)
539 : 0 : {}
540 : :
541 : : void
542 : 0 : DefaultResolver::visit (AST::ParenthesisedType &)
543 : 0 : {}
544 : :
545 : : void
546 : 0 : DefaultResolver::visit (AST::ImplTraitTypeOneBound &)
547 : 0 : {}
548 : :
549 : : void
550 : 0 : DefaultResolver::visit (AST::TraitObjectTypeOneBound &)
551 : 0 : {}
552 : :
553 : : void
554 : 0 : DefaultResolver::visit (AST::TupleType &)
555 : 0 : {}
556 : :
557 : : void
558 : 0 : DefaultResolver::visit (AST::RawPointerType &)
559 : 0 : {}
560 : :
561 : : void
562 : 0 : DefaultResolver::visit (AST::ReferenceType &)
563 : 0 : {}
564 : :
565 : : void
566 : 0 : DefaultResolver::visit (AST::ArrayType &)
567 : 0 : {}
568 : :
569 : : void
570 : 0 : DefaultResolver::visit (AST::SliceType &)
571 : 0 : {}
572 : :
573 : : void
574 : 0 : DefaultResolver::visit (AST::BareFunctionType &)
575 : 0 : {}
576 : :
577 : : void
578 : 0 : DefaultResolver::visit (AST::SelfParam &)
579 : 0 : {}
580 : :
581 : : void
582 : 0 : DefaultResolver::visit (AST::FunctionParam &)
583 : 0 : {}
584 : :
585 : : void
586 : 0 : DefaultResolver::visit (AST::VariadicParam &)
587 : 0 : {}
588 : :
589 : : } // namespace Resolver2_0
590 : : } // namespace Rust
|