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