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 32869 : 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 32869 : if (!visited_crates.insert (crate.get_node_id ()).second)
37 0 : return;
38 :
39 65738 : auto inner_fn = [this, &crate] () {
40 32869 : maybe_prelude_import ();
41 32869 : AST::DefaultASTVisitor::visit (crate);
42 65736 : };
43 :
44 32869 : auto &mappings = Analysis::Mappings::get ();
45 :
46 32869 : auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
47 32869 : rust_assert (crate_num.has_value ());
48 32869 : auto crate_name = mappings.get_crate_name (*crate_num);
49 32869 : rust_assert (crate_name.has_value ());
50 :
51 65738 : ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
52 : }
53 :
54 : void
55 1346564 : 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 1346564 : auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
61 :
62 1346564 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
63 1346559 : }
64 :
65 : void
66 27662 : DefaultResolver::visit (AST::Module &module)
67 : {
68 55324 : auto item_fn_1 = [this, &module] () {
69 27662 : maybe_prelude_import ();
70 27662 : AST::DefaultASTVisitor::visit (module);
71 55324 : };
72 :
73 55324 : auto item_fn_2 = [this, &module, &item_fn_1] () {
74 27662 : ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
75 : std::move (item_fn_1));
76 55324 : };
77 :
78 55324 : ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
79 55324 : module.get_name ());
80 27662 : }
81 :
82 : void
83 1008511 : DefaultResolver::visit (AST::Function &function)
84 : {
85 1008511 : auto def_fn_1
86 1008511 : = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
87 :
88 2017022 : auto def_fn_2 = [this, &function, &def_fn_1] () {
89 1008511 : ctx.canonical_ctx.scope (function.get_node_id (),
90 1008511 : function.get_function_name (),
91 : std::move (def_fn_1));
92 2017020 : };
93 :
94 1008511 : ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2);
95 1008509 : }
96 :
97 : void
98 5131 : DefaultResolver::visit (AST::LoopExpr &expr)
99 : {
100 5131 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
101 15392 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
102 5130 : }
103 :
104 : void
105 8051 : DefaultResolver::visit (AST::WhileLoopExpr &expr)
106 : {
107 8051 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
108 24153 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
109 8051 : }
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 7106 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
126 : {
127 7106 : visit (expr.get_pattern ());
128 7106 : }
129 :
130 : void
131 7106 : DefaultResolver::visit (AST::IfLetExpr &expr)
132 : {
133 14212 : auto inner_vis = [this, &expr] () {
134 7106 : visit_if_let_patterns (expr);
135 7106 : visit (expr.get_if_block ());
136 14212 : };
137 :
138 7106 : visit_outer_attrs (expr);
139 :
140 7106 : visit (expr.get_value_expr ());
141 :
142 7106 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
143 7106 : }
144 :
145 : void
146 2529 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
147 : {
148 2529 : DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
149 2529 : visit (expr.get_else_block ());
150 2529 : }
151 :
152 : void
153 38625 : DefaultResolver::visit (AST::Trait &trait)
154 : {
155 38625 : visit_outer_attrs (trait);
156 38625 : visit (trait.get_visibility ());
157 38625 : visit_inner_attrs (trait);
158 :
159 77250 : auto inner_fn_1 = [this, &trait] () {
160 93166 : for (auto &item : trait.get_trait_items ())
161 54541 : visit (item);
162 77250 : };
163 :
164 77250 : auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
165 38625 : visit (trait.get_implicit_self ());
166 48495 : for (auto &generic : trait.get_generic_params ())
167 9870 : visit (generic);
168 38625 : if (trait.has_where_clause ())
169 56 : visit (trait.get_where_clause ());
170 49003 : for (auto &bound : trait.get_type_param_bounds ())
171 10378 : visit (bound);
172 :
173 38625 : ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
174 77250 : };
175 :
176 77250 : auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
177 38625 : ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
178 : std::move (inner_fn_2));
179 77250 : };
180 :
181 77250 : ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
182 77250 : trait.get_identifier () /* FIXME: Is that valid?*/);
183 38625 : }
184 :
185 : static bool
186 29368 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
187 : {
188 33060 : for (auto &attr : outer_attrs)
189 6975 : if (attr.get_path ().as_string () == Values::Attributes::LANG)
190 29368 : return true;
191 :
192 : return false;
193 : }
194 :
195 : void
196 29368 : DefaultResolver::visit (AST::InherentImpl &impl)
197 : {
198 29368 : visit_outer_attrs (impl);
199 29368 : visit (impl.get_visibility ());
200 29368 : visit_inner_attrs (impl);
201 :
202 58736 : auto inner_fn_1 = [this, &impl] () {
203 212706 : for (auto &item : impl.get_impl_items ())
204 183338 : visit (item);
205 58736 : };
206 :
207 58736 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
208 29368 : maybe_insert_big_self (impl);
209 53956 : for (auto &generic : impl.get_generic_params ())
210 24588 : visit (generic);
211 29368 : if (impl.has_where_clause ())
212 221 : visit (impl.get_where_clause ());
213 29368 : visit_impl_type (impl.get_type ());
214 :
215 29368 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
216 58736 : };
217 :
218 58736 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
219 29368 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
220 58736 : };
221 :
222 29368 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
223 :
224 29368 : if (is_lang_impl (impl.get_outer_attrs ()))
225 : {
226 3283 : if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
227 : {
228 1491 : auto type = static_cast<AST::TypePath &> (impl.get_type ());
229 1491 : auto type_name = type.as_string ();
230 :
231 4473 : ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
232 1491 : }
233 : }
234 29368 : }
235 :
236 : void
237 502919 : DefaultResolver::visit (AST::TraitImpl &impl)
238 : {
239 502919 : visit_outer_attrs (impl);
240 502919 : visit (impl.get_visibility ());
241 502919 : visit_inner_attrs (impl);
242 :
243 1005838 : auto inner_fn_1 = [this, &impl] () {
244 1211946 : for (auto &item : impl.get_impl_items ())
245 709027 : visit (item);
246 1005838 : };
247 :
248 1005838 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
249 502919 : maybe_insert_big_self (impl);
250 973432 : for (auto &generic : impl.get_generic_params ())
251 470513 : visit (generic);
252 502919 : if (impl.has_where_clause ())
253 26418 : visit (impl.get_where_clause ());
254 502919 : visit_impl_type (impl.get_type ());
255 502919 : visit (impl.get_trait_path ());
256 :
257 502919 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
258 1005838 : };
259 :
260 1005838 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
261 502919 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
262 1005838 : };
263 :
264 502919 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
265 502919 : }
266 :
267 : void
268 54453 : DefaultResolver::visit (AST::StructStruct &type)
269 : {
270 54453 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
271 :
272 108906 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
273 54453 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
274 : std::move (inner_fn_1));
275 108906 : };
276 :
277 54453 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
278 163359 : inner_fn_2, type.get_struct_name ());
279 54453 : }
280 :
281 : void
282 13909 : DefaultResolver::visit (AST::TupleStruct &type)
283 : {
284 13909 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
285 :
286 27818 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
287 13909 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
288 : std::move (inner_fn_1));
289 27818 : };
290 :
291 13909 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
292 41727 : inner_fn_2, type.get_struct_name ());
293 13909 : }
294 :
295 : void
296 7693 : DefaultResolver::visit (AST::EnumItem &item)
297 : {
298 7693 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
299 :
300 7693 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
301 : inner_fn);
302 7693 : }
303 :
304 : void
305 5636 : DefaultResolver::visit (AST::EnumItemTuple &item)
306 : {
307 5636 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
308 :
309 5636 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
310 : inner_fn);
311 5636 : }
312 :
313 : void
314 655 : DefaultResolver::visit (AST::EnumItemStruct &item)
315 : {
316 655 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
317 :
318 655 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
319 : inner_fn);
320 655 : }
321 :
322 : void
323 2232 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
324 : {
325 2232 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
326 :
327 2232 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
328 : inner_fn);
329 2232 : }
330 :
331 : void
332 6468 : DefaultResolver::visit (AST::Enum &type)
333 : {
334 6468 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
335 :
336 12936 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
337 6468 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
338 : std::move (inner_fn_1));
339 12936 : };
340 :
341 12936 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
342 19404 : inner_fn_2, type.get_identifier ());
343 6468 : }
344 :
345 : void
346 843 : DefaultResolver::visit (AST::Union &type)
347 : {
348 843 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
349 :
350 1686 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
351 843 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
352 : std::move (inner_fn_1));
353 1686 : };
354 :
355 1686 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
356 2529 : inner_fn_2, type.get_identifier ());
357 843 : }
358 :
359 : void
360 189745 : DefaultResolver::visit (AST::TypeAlias &type)
361 : {
362 189745 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
363 :
364 379490 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
365 189745 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
366 : std::move (inner_fn_1));
367 379490 : };
368 :
369 379490 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
370 569235 : inner_fn_2, type.get_new_type_name ());
371 189745 : }
372 :
373 : void
374 23028 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
375 : {
376 50283 : for (auto ¶m : expr.get_params ())
377 27255 : visit (param);
378 23028 : }
379 :
380 : void
381 23028 : DefaultResolver::visit (AST::ClosureExpr &expr)
382 : {
383 46056 : auto expr_fn = [this, &expr] () {
384 23028 : visit_closure_params (expr);
385 23028 : visit (expr.get_definition_expr ());
386 46056 : };
387 :
388 23028 : visit_outer_attrs (expr);
389 :
390 23028 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
391 23028 : }
392 :
393 : void
394 22776 : DefaultResolver::visit (AST::ClosureExprInner &expr)
395 : {
396 22776 : if (expr.is_marked_for_strip ())
397 : return;
398 :
399 22776 : visit (static_cast<AST::ClosureExpr &> (expr));
400 : }
401 :
402 : void
403 252 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
404 : {
405 252 : if (expr.is_marked_for_strip ())
406 : return;
407 :
408 252 : visit (static_cast<AST::ClosureExpr &> (expr));
409 252 : visit (expr.get_return_type ());
410 : }
411 :
412 : void
413 320081 : DefaultResolver::visit (AST::MatchExpr &expr)
414 : {
415 320081 : if (expr.is_marked_for_strip ())
416 : return;
417 :
418 320081 : AST::DefaultASTVisitor::visit (expr);
419 : }
420 :
421 : void
422 3316841 : DefaultResolver::visit (AST::MatchCase &cas)
423 : {
424 3316841 : auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
425 :
426 3316841 : ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
427 3316840 : }
428 :
429 : void
430 54117 : DefaultResolver::visit (AST::ConstantItem &item)
431 : {
432 54117 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
433 :
434 108234 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
435 54117 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
436 : std::move (expr_vis_1));
437 108234 : };
438 :
439 : // FIXME: Why do we need a Rib here?
440 54117 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
441 54117 : }
442 :
443 : void
444 2933 : DefaultResolver::visit (AST::StaticItem &item)
445 : {
446 2933 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
447 :
448 5866 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
449 2933 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
450 : std::move (expr_vis_1));
451 5866 : };
452 :
453 : // FIXME: Why do we need a Rib here?
454 2933 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
455 2933 : }
456 :
457 : void
458 608645 : DefaultResolver::visit (AST::TypeParam ¶m)
459 : {
460 1217290 : auto param_ban_vis = [this, ¶m] () {
461 608645 : visit_outer_attrs (param);
462 608645 : if (param.has_type ())
463 4964 : visit (param.get_type ());
464 1217290 : };
465 :
466 608645 : ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (),
467 1217290 : param_ban_vis);
468 :
469 777940 : for (auto &bound : param.get_type_param_bounds ())
470 169295 : visit (bound);
471 608645 : }
472 :
473 : void
474 195 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
475 : AST::Crate &crate, CrateNum num)
476 : {
477 : // We do *NOT* visit the crate because loaded crates are resolved
478 : // independently.
479 195 : }
480 :
481 : void
482 375 : DefaultResolver::visit (AST::ExternCrate &crate)
483 : {
484 375 : auto &mappings = Analysis::Mappings::get ();
485 375 : tl::optional<CrateNum> num_opt;
486 375 : if (crate.get_referenced_crate () == "self")
487 6 : num_opt = mappings.get_current_crate ();
488 : else
489 369 : num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
490 :
491 375 : if (!num_opt)
492 : {
493 9 : rust_error_at (crate.get_locus (), "unknown crate %qs",
494 9 : crate.get_referenced_crate ().c_str ());
495 9 : return;
496 : }
497 :
498 366 : CrateNum num = *num_opt;
499 :
500 366 : AST::Crate &referenced_crate = mappings.get_ast_crate (num);
501 :
502 366 : auto sub_visitor_1
503 366 : = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
504 :
505 732 : auto sub_visitor_2 = [&] () {
506 366 : ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
507 366 : crate.get_referenced_crate () == "self"
508 6 : ? mappings.get_current_crate_name ()
509 : : crate.get_referenced_crate (),
510 : std::move (sub_visitor_1));
511 732 : };
512 :
513 366 : if (crate.has_as_clause ())
514 108 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
515 162 : sub_visitor_2, crate.get_as_clause ());
516 : else
517 312 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
518 936 : sub_visitor_2, crate.get_referenced_crate ());
519 : }
520 :
521 : } // namespace Resolver2_0
522 : } // namespace Rust
|