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 : #include "rust-default-resolver.h"
20 : #include "optional.h"
21 : #include "rust-ast-full.h"
22 : #include "rust-ast-visitor.h"
23 : #include "rust-ast.h"
24 : #include "rust-attribute-values.h"
25 : #include "rust-item.h"
26 : #include "rust-path.h"
27 :
28 : namespace Rust {
29 : namespace Resolver2_0 {
30 :
31 : void
32 33304 : DefaultResolver::visit (AST::Crate &crate)
33 : {
34 : // Guard against infinite recursion: `extern crate self;` resolves to the
35 : // current crate, causing visit(AST::Crate) to call itself infinitely.
36 33304 : if (!visited_crates.insert (crate.get_node_id ()).second)
37 0 : return;
38 :
39 66608 : auto inner_fn = [this, &crate] () {
40 33304 : maybe_prelude_import ();
41 33304 : AST::DefaultASTVisitor::visit (crate);
42 66606 : };
43 :
44 33304 : auto &crate_mappings = Analysis::Mappings::get ().crate;
45 :
46 33304 : auto crate_num = crate_mappings.lookup_crate_num (crate.get_node_id ());
47 33304 : rust_assert (crate_num.has_value ());
48 33304 : auto crate_name = crate_mappings.crate_names.lookup (*crate_num);
49 33304 : rust_assert (crate_name.has_value ());
50 :
51 66608 : ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
52 : }
53 :
54 : void
55 1351594 : DefaultResolver::visit (AST::BlockExpr &expr)
56 : {
57 : // extracting the lambda from the `scoped` call otherwise the code looks like
58 : // a hot turd thanks to our .clang-format
59 :
60 1351594 : auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
61 :
62 1351594 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
63 1351589 : }
64 :
65 : void
66 27790 : DefaultResolver::visit (AST::Module &module)
67 : {
68 55580 : auto item_fn_1 = [this, &module] () {
69 27790 : maybe_prelude_import ();
70 27790 : AST::DefaultASTVisitor::visit (module);
71 55580 : };
72 :
73 55580 : auto item_fn_2 = [this, &module, &item_fn_1] () {
74 27790 : ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
75 : std::move (item_fn_1));
76 55580 : };
77 :
78 55580 : ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
79 55580 : module.get_name ());
80 27790 : }
81 :
82 : void
83 1011620 : DefaultResolver::visit (AST::Function &function)
84 : {
85 1011620 : auto def_fn_1
86 1011620 : = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
87 :
88 2023240 : auto def_fn_2 = [this, &function, &def_fn_1] () {
89 1011620 : ctx.canonical_ctx.scope (function.get_node_id (),
90 1011620 : function.get_function_name (),
91 : std::move (def_fn_1));
92 2023238 : };
93 :
94 1011620 : ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2);
95 1011618 : }
96 :
97 : void
98 5369 : DefaultResolver::visit (AST::LoopExpr &expr)
99 : {
100 5369 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
101 16106 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
102 5368 : }
103 :
104 : void
105 8074 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
106 : {
107 8074 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
108 24222 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
109 8074 : }
110 :
111 : void
112 1762 : DefaultResolver::visit (AST::WhileLetLoopExpr &expr)
113 : {
114 1762 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
115 5286 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
116 1762 : }
117 : void
118 7588 : DefaultResolver::visit (AST::ForLoopExpr &expr)
119 : {
120 7588 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
121 22764 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
122 7588 : }
123 :
124 : void
125 7148 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
126 : {
127 7148 : visit (expr.get_pattern ());
128 7148 : }
129 :
130 : void
131 7148 : DefaultResolver::visit (AST::IfLetExpr &expr)
132 : {
133 14296 : auto inner_vis = [this, &expr] () {
134 7148 : visit_if_let_patterns (expr);
135 7148 : visit (expr.get_if_block ());
136 14296 : };
137 :
138 7148 : visit_outer_attrs (expr);
139 :
140 7148 : visit (expr.get_value_expr ());
141 :
142 7148 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
143 7148 : }
144 :
145 : void
146 2562 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
147 : {
148 2562 : DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
149 2562 : visit (expr.get_else_block ());
150 2562 : }
151 :
152 : void
153 39208 : DefaultResolver::visit (AST::Trait &trait)
154 : {
155 39208 : visit_outer_attrs (trait);
156 39208 : visit (trait.get_visibility ());
157 39208 : visit_inner_attrs (trait);
158 :
159 78416 : auto inner_fn_1 = [this, &trait] () {
160 94238 : for (auto &item : trait.get_trait_items ())
161 55030 : visit (item);
162 78416 : };
163 :
164 78416 : auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
165 39208 : visit (trait.get_implicit_self ());
166 49252 : for (auto &generic : trait.get_generic_params ())
167 10044 : visit (generic);
168 39208 : if (trait.has_where_clause ())
169 56 : visit (trait.get_where_clause ());
170 49666 : for (auto &bound : trait.get_type_param_bounds ())
171 10458 : visit (bound);
172 :
173 39208 : ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
174 78416 : };
175 :
176 78416 : auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
177 39208 : ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
178 : std::move (inner_fn_2));
179 78416 : };
180 :
181 78416 : ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
182 78416 : trait.get_identifier () /* FIXME: Is that valid?*/);
183 39208 : }
184 :
185 : static bool
186 29590 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
187 : {
188 33285 : for (auto &attr : outer_attrs)
189 6981 : if (attr.get_path ().as_string () == Values::Attributes::LANG)
190 29590 : return true;
191 :
192 : return false;
193 : }
194 :
195 : void
196 29590 : DefaultResolver::visit (AST::InherentImpl &impl)
197 : {
198 29590 : visit_outer_attrs (impl);
199 29590 : visit (impl.get_visibility ());
200 29590 : visit_inner_attrs (impl);
201 :
202 59180 : auto inner_fn_1 = [this, &impl] () {
203 213624 : for (auto &item : impl.get_impl_items ())
204 184034 : visit (item);
205 59180 : };
206 :
207 59180 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
208 29590 : maybe_insert_big_self (impl);
209 54549 : for (auto &generic : impl.get_generic_params ())
210 24959 : visit (generic);
211 29590 : if (impl.has_where_clause ())
212 221 : visit (impl.get_where_clause ());
213 29590 : visit_impl_type (impl.get_type ());
214 :
215 29590 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
216 59180 : };
217 :
218 59180 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
219 29590 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
220 59180 : };
221 :
222 29590 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
223 :
224 29590 : if (is_lang_impl (impl.get_outer_attrs ()))
225 : {
226 3286 : if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
227 : {
228 1492 : auto type = static_cast<AST::TypePath &> (impl.get_type ());
229 1492 : auto type_name = type.as_string ();
230 :
231 4476 : ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
232 1492 : }
233 : }
234 29590 : }
235 :
236 : void
237 504037 : DefaultResolver::visit (AST::TraitImpl &impl)
238 : {
239 504037 : visit_outer_attrs (impl);
240 504037 : visit (impl.get_visibility ());
241 504037 : visit_inner_attrs (impl);
242 :
243 1008074 : auto inner_fn_1 = [this, &impl] () {
244 1214358 : for (auto &item : impl.get_impl_items ())
245 710321 : visit (item);
246 1008074 : };
247 :
248 1008074 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
249 504037 : maybe_insert_big_self (impl);
250 975807 : for (auto &generic : impl.get_generic_params ())
251 471770 : visit (generic);
252 504037 : if (impl.has_where_clause ())
253 26514 : visit (impl.get_where_clause ());
254 504037 : visit_impl_type (impl.get_type ());
255 504037 : visit (impl.get_trait_path ());
256 :
257 504037 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
258 1008074 : };
259 :
260 1008074 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
261 504037 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
262 1008074 : };
263 :
264 504037 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
265 504037 : }
266 :
267 : void
268 54921 : DefaultResolver::visit (AST::StructStruct &type)
269 : {
270 54921 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
271 :
272 109842 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
273 54921 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
274 : std::move (inner_fn_1));
275 109842 : };
276 :
277 54921 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
278 164763 : inner_fn_2, type.get_struct_name ());
279 54921 : }
280 :
281 : void
282 14056 : DefaultResolver::visit (AST::TupleStruct &type)
283 : {
284 14056 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
285 :
286 28112 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
287 14056 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
288 : std::move (inner_fn_1));
289 28112 : };
290 :
291 14056 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
292 42168 : inner_fn_2, type.get_struct_name ());
293 14056 : }
294 :
295 : void
296 7792 : DefaultResolver::visit (AST::EnumItem &item)
297 : {
298 7792 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
299 :
300 7792 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
301 : inner_fn);
302 7792 : }
303 :
304 : void
305 5807 : DefaultResolver::visit (AST::EnumItemTuple &item)
306 : {
307 5807 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
308 :
309 5807 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
310 : inner_fn);
311 5807 : }
312 :
313 : void
314 660 : DefaultResolver::visit (AST::EnumItemStruct &item)
315 : {
316 660 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
317 :
318 660 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
319 : inner_fn);
320 660 : }
321 :
322 : void
323 2235 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
324 : {
325 2235 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
326 :
327 2235 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
328 : inner_fn);
329 2235 : }
330 :
331 : void
332 6583 : DefaultResolver::visit (AST::Enum &type)
333 : {
334 6583 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
335 :
336 13166 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
337 6583 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
338 : std::move (inner_fn_1));
339 13166 : };
340 :
341 13166 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
342 19749 : inner_fn_2, type.get_identifier ());
343 6583 : }
344 :
345 : void
346 845 : DefaultResolver::visit (AST::Union &type)
347 : {
348 845 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
349 :
350 1690 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
351 845 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
352 : std::move (inner_fn_1));
353 1690 : };
354 :
355 1690 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
356 2535 : inner_fn_2, type.get_identifier ());
357 845 : }
358 :
359 : void
360 189972 : DefaultResolver::visit (AST::TypeAlias &type)
361 : {
362 189972 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
363 :
364 379944 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
365 189972 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
366 : std::move (inner_fn_1));
367 379944 : };
368 :
369 379944 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
370 569916 : inner_fn_2, type.get_new_type_name ());
371 189972 : }
372 :
373 : void
374 12 : DefaultResolver::visit (AST::TraitAlias &trait)
375 : {
376 12 : auto inner_fn_1
377 12 : = [this, &trait] () { AST::DefaultASTVisitor::visit (trait); };
378 :
379 24 : auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
380 12 : ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_alias_name (),
381 : std::move (inner_fn_1));
382 24 : };
383 :
384 24 : ctx.scoped (Rib::Kind::Item, trait.get_node_id (), inner_fn_2,
385 12 : trait.get_alias_name ());
386 12 : }
387 :
388 : void
389 23184 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
390 : {
391 50596 : for (auto ¶m : expr.get_params ())
392 27412 : visit (param);
393 23184 : }
394 :
395 : void
396 23184 : DefaultResolver::visit (AST::ClosureExpr &expr)
397 : {
398 46368 : auto expr_fn = [this, &expr] () {
399 23184 : visit_closure_params (expr);
400 23184 : visit (expr.get_definition_expr ());
401 46368 : };
402 :
403 23184 : visit_outer_attrs (expr);
404 :
405 23184 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
406 23184 : }
407 :
408 : void
409 22932 : DefaultResolver::visit (AST::ClosureExprInner &expr)
410 : {
411 22932 : if (expr.is_marked_for_strip ())
412 : return;
413 :
414 22932 : visit (static_cast<AST::ClosureExpr &> (expr));
415 : }
416 :
417 : void
418 252 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
419 : {
420 252 : if (expr.is_marked_for_strip ())
421 : return;
422 :
423 252 : visit (static_cast<AST::ClosureExpr &> (expr));
424 252 : visit (expr.get_return_type ());
425 : }
426 :
427 : void
428 320700 : DefaultResolver::visit (AST::MatchExpr &expr)
429 : {
430 320700 : if (expr.is_marked_for_strip ())
431 : return;
432 :
433 320700 : AST::DefaultASTVisitor::visit (expr);
434 : }
435 :
436 : void
437 3318400 : DefaultResolver::visit (AST::MatchCase &cas)
438 : {
439 3318400 : auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
440 :
441 3318400 : ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
442 3318399 : }
443 :
444 : void
445 54230 : DefaultResolver::visit (AST::ConstantItem &item)
446 : {
447 54230 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
448 :
449 108460 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
450 54230 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
451 : std::move (expr_vis_1));
452 108460 : };
453 :
454 : // FIXME: Why do we need a Rib here?
455 54230 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
456 54230 : }
457 :
458 : void
459 3089 : DefaultResolver::visit (AST::StaticItem &item)
460 : {
461 3089 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
462 :
463 6178 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
464 3089 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
465 : std::move (expr_vis_1));
466 6178 : };
467 :
468 : // FIXME: Why do we need a Rib here?
469 3089 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
470 3089 : }
471 :
472 : void
473 611567 : DefaultResolver::visit (AST::TypeParam ¶m)
474 : {
475 1223134 : auto param_ban_vis = [this, ¶m] () {
476 611567 : visit_outer_attrs (param);
477 611567 : if (param.has_type ())
478 5047 : visit (param.get_type ());
479 1223134 : };
480 :
481 611567 : ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (),
482 1223134 : param_ban_vis);
483 :
484 782049 : for (auto &bound : param.get_type_param_bounds ())
485 170482 : visit (bound);
486 611567 : }
487 :
488 : void
489 195 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
490 : AST::Crate &crate, CrateNum num)
491 : {
492 : // We do *NOT* visit the crate because loaded crates are resolved
493 : // independently.
494 195 : }
495 :
496 : void
497 375 : DefaultResolver::visit (AST::ExternCrate &crate)
498 : {
499 375 : auto &mappings = Analysis::Mappings::get ();
500 375 : auto &crate_mappings = mappings.crate;
501 375 : tl::optional<CrateNum> num_opt;
502 375 : if (crate.get_referenced_crate () == "self")
503 6 : num_opt = crate_mappings.get_current_crate ();
504 : else
505 369 : num_opt = crate_mappings.lookup_crate_name (crate.get_referenced_crate ());
506 :
507 375 : if (!num_opt)
508 : {
509 9 : rust_error_at (crate.get_locus (), "unknown crate %qs",
510 9 : crate.get_referenced_crate ().c_str ());
511 9 : return;
512 : }
513 :
514 366 : CrateNum num = *num_opt;
515 :
516 366 : AST::Crate &referenced_crate = mappings.crate.get_ast_crate (num);
517 :
518 366 : auto sub_visitor_1
519 366 : = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
520 :
521 732 : auto sub_visitor_2 = [&] () {
522 366 : ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
523 366 : crate.get_referenced_crate () == "self"
524 6 : ? crate_mappings.get_current_crate_name ()
525 : : crate.get_referenced_crate (),
526 : std::move (sub_visitor_1));
527 732 : };
528 :
529 366 : if (crate.has_as_clause ())
530 108 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
531 162 : sub_visitor_2, crate.get_as_clause ());
532 : else
533 312 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
534 936 : sub_visitor_2, crate.get_referenced_crate ());
535 : }
536 :
537 : } // namespace Resolver2_0
538 : } // namespace Rust
|