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 29870 : DefaultResolver::visit (AST::Crate &crate)
33 : {
34 29870 : auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
35 :
36 29870 : auto &mappings = Analysis::Mappings::get ();
37 :
38 29870 : auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
39 29870 : rust_assert (crate_num.has_value ());
40 29870 : auto crate_name = mappings.get_crate_name (*crate_num);
41 29870 : rust_assert (crate_name.has_value ());
42 :
43 59740 : ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
44 29869 : }
45 :
46 : void
47 149731 : DefaultResolver::visit (AST::BlockExpr &expr)
48 : {
49 : // extracting the lambda from the `scoped` call otherwise the code looks like
50 : // a hot turd thanks to our .clang-format
51 :
52 149731 : auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
53 :
54 149731 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
55 149730 : }
56 :
57 : void
58 9037 : DefaultResolver::visit (AST::Module &module)
59 : {
60 9037 : auto item_fn_1
61 9037 : = [this, &module] () { AST::DefaultASTVisitor::visit (module); };
62 :
63 18074 : auto item_fn_2 = [this, &module, &item_fn_1] () {
64 9037 : ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
65 : std::move (item_fn_1));
66 18074 : };
67 :
68 18074 : ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
69 18074 : module.get_name ());
70 9037 : }
71 :
72 : void
73 124142 : DefaultResolver::visit (AST::Function &function)
74 : {
75 124142 : auto def_fn_1
76 124142 : = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
77 :
78 248284 : auto def_fn_2 = [this, &function, &def_fn_1] () {
79 124142 : ctx.canonical_ctx.scope (function.get_node_id (),
80 124142 : function.get_function_name (),
81 : std::move (def_fn_1));
82 248283 : };
83 :
84 248284 : ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2,
85 248283 : function.get_function_name ());
86 124141 : }
87 :
88 : void
89 128 : DefaultResolver::visit (AST::ForLoopExpr &expr)
90 : {
91 128 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
92 384 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
93 128 : }
94 :
95 : void
96 180 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
97 : {
98 180 : visit (expr.get_pattern ());
99 180 : }
100 :
101 : void
102 180 : DefaultResolver::visit (AST::IfLetExpr &expr)
103 : {
104 360 : auto inner_vis = [this, &expr] () {
105 180 : visit_if_let_patterns (expr);
106 180 : visit (expr.get_if_block ());
107 360 : };
108 :
109 180 : visit_outer_attrs (expr);
110 :
111 180 : visit (expr.get_value_expr ());
112 :
113 180 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
114 180 : }
115 :
116 : void
117 72 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
118 : {
119 72 : DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
120 72 : visit (expr.get_else_block ());
121 72 : }
122 :
123 : void
124 24919 : DefaultResolver::visit (AST::Trait &trait)
125 : {
126 24919 : visit_outer_attrs (trait);
127 24919 : visit (trait.get_visibility ());
128 24919 : visit_inner_attrs (trait);
129 :
130 49838 : auto inner_fn_1 = [this, &trait] () {
131 48602 : for (auto &item : trait.get_trait_items ())
132 23683 : visit (item);
133 49838 : };
134 :
135 49838 : auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
136 24919 : visit (trait.get_implicit_self ());
137 29565 : for (auto &generic : trait.get_generic_params ())
138 4646 : visit (generic);
139 24919 : if (trait.has_where_clause ())
140 56 : visit (trait.get_where_clause ());
141 29485 : for (auto &bound : trait.get_type_param_bounds ())
142 4566 : visit (bound);
143 :
144 24919 : ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
145 49838 : };
146 :
147 49838 : auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
148 24919 : ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
149 : std::move (inner_fn_2));
150 49838 : };
151 :
152 49838 : ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
153 49838 : trait.get_identifier () /* FIXME: Is that valid?*/);
154 24919 : }
155 :
156 : static bool
157 6320 : is_lang_impl (std::vector<AST::Attribute> &outer_attrs)
158 : {
159 6329 : for (auto &attr : outer_attrs)
160 1309 : if (attr.get_path ().as_string () == Values::Attributes::LANG)
161 6320 : return true;
162 :
163 : return false;
164 : }
165 :
166 : void
167 6320 : DefaultResolver::visit (AST::InherentImpl &impl)
168 : {
169 6320 : visit_outer_attrs (impl);
170 6320 : visit (impl.get_visibility ());
171 6320 : visit_inner_attrs (impl);
172 :
173 12640 : auto inner_fn_1 = [this, &impl] () {
174 25632 : for (auto &item : impl.get_impl_items ())
175 19312 : visit (item);
176 12640 : };
177 :
178 12640 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
179 6320 : maybe_insert_big_self (impl);
180 8503 : for (auto &generic : impl.get_generic_params ())
181 2183 : visit (generic);
182 6320 : if (impl.has_where_clause ())
183 5 : visit (impl.get_where_clause ());
184 6320 : visit_impl_type (impl.get_type ());
185 :
186 6320 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
187 12640 : };
188 :
189 12640 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
190 6320 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
191 12640 : };
192 :
193 6320 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
194 :
195 6320 : if (is_lang_impl (impl.get_outer_attrs ()))
196 : {
197 1300 : if (impl.get_type ().get_type_kind () == AST::Type::Kind::TypePath)
198 : {
199 258 : auto type = static_cast<AST::TypePath &> (impl.get_type ());
200 258 : auto type_name = type.as_string ();
201 :
202 774 : ctx.types.insert_lang_prelude (type_name, impl.get_node_id ());
203 258 : }
204 : }
205 6320 : }
206 :
207 : void
208 31711 : DefaultResolver::visit (AST::TraitImpl &impl)
209 : {
210 31711 : visit_outer_attrs (impl);
211 31711 : visit (impl.get_visibility ());
212 31711 : visit_inner_attrs (impl);
213 :
214 63422 : auto inner_fn_1 = [this, &impl] () {
215 69095 : for (auto &item : impl.get_impl_items ())
216 37384 : visit (item);
217 63422 : };
218 :
219 63422 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
220 31711 : maybe_insert_big_self (impl);
221 37087 : for (auto &generic : impl.get_generic_params ())
222 5376 : visit (generic);
223 31711 : if (impl.has_where_clause ())
224 594 : visit (impl.get_where_clause ());
225 31711 : visit_impl_type (impl.get_type ());
226 31711 : visit (impl.get_trait_path ());
227 :
228 31711 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
229 63422 : };
230 :
231 63422 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
232 31711 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
233 63422 : };
234 :
235 31711 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
236 31711 : }
237 :
238 : void
239 10122 : DefaultResolver::visit (AST::StructStruct &type)
240 : {
241 10122 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
242 :
243 20244 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
244 10122 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
245 : std::move (inner_fn_1));
246 20244 : };
247 :
248 10122 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
249 30366 : inner_fn_2, type.get_struct_name ());
250 10122 : }
251 :
252 : void
253 6109 : DefaultResolver::visit (AST::TupleStruct &type)
254 : {
255 6109 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
256 :
257 12218 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
258 6109 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
259 : std::move (inner_fn_1));
260 12218 : };
261 :
262 6109 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
263 18327 : inner_fn_2, type.get_struct_name ());
264 6109 : }
265 :
266 : void
267 2970 : DefaultResolver::visit (AST::EnumItem &item)
268 : {
269 2970 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
270 :
271 2970 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
272 : inner_fn);
273 2970 : }
274 :
275 : void
276 3105 : DefaultResolver::visit (AST::EnumItemTuple &item)
277 : {
278 3105 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
279 :
280 3105 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
281 : inner_fn);
282 3105 : }
283 :
284 : void
285 610 : DefaultResolver::visit (AST::EnumItemStruct &item)
286 : {
287 610 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
288 :
289 610 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
290 : inner_fn);
291 610 : }
292 :
293 : void
294 1911 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
295 : {
296 1911 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
297 :
298 1911 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
299 : inner_fn);
300 1911 : }
301 :
302 : void
303 3685 : DefaultResolver::visit (AST::Enum &type)
304 : {
305 3685 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
306 :
307 7370 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
308 3685 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
309 : std::move (inner_fn_1));
310 7370 : };
311 :
312 7370 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
313 11055 : inner_fn_2, type.get_identifier ());
314 3685 : }
315 :
316 : void
317 651 : DefaultResolver::visit (AST::Union &type)
318 : {
319 651 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
320 :
321 1302 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
322 651 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
323 : std::move (inner_fn_1));
324 1302 : };
325 :
326 1302 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
327 1953 : inner_fn_2, type.get_identifier ());
328 651 : }
329 :
330 : void
331 8890 : DefaultResolver::visit (AST::TypeAlias &type)
332 : {
333 8890 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
334 :
335 17780 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
336 8890 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
337 : std::move (inner_fn_1));
338 17780 : };
339 :
340 17780 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
341 26670 : inner_fn_2, type.get_new_type_name ());
342 8890 : }
343 :
344 : void
345 402 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
346 : {
347 780 : for (auto ¶m : expr.get_params ())
348 378 : visit (param);
349 402 : }
350 :
351 : void
352 402 : DefaultResolver::visit (AST::ClosureExpr &expr)
353 : {
354 804 : auto expr_fn = [this, &expr] () {
355 402 : visit_closure_params (expr);
356 402 : visit (expr.get_definition_expr ());
357 804 : };
358 :
359 402 : visit_outer_attrs (expr);
360 :
361 402 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
362 402 : }
363 :
364 : void
365 222 : DefaultResolver::visit (AST::ClosureExprInner &expr)
366 : {
367 222 : if (expr.is_marked_for_strip ())
368 : return;
369 :
370 222 : visit (static_cast<AST::ClosureExpr &> (expr));
371 : }
372 :
373 : void
374 180 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
375 : {
376 180 : if (expr.is_marked_for_strip ())
377 : return;
378 :
379 180 : visit (static_cast<AST::ClosureExpr &> (expr));
380 180 : visit (expr.get_return_type ());
381 : }
382 :
383 : void
384 6938 : DefaultResolver::visit (AST::MatchExpr &expr)
385 : {
386 6938 : if (expr.is_marked_for_strip ())
387 : return;
388 :
389 6938 : AST::DefaultASTVisitor::visit (expr);
390 : }
391 :
392 : void
393 3465 : DefaultResolver::visit (AST::ConstantItem &item)
394 : {
395 3465 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
396 :
397 6930 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
398 3465 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
399 : std::move (expr_vis_1));
400 6930 : };
401 :
402 : // FIXME: Why do we need a Rib here?
403 3465 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
404 3465 : }
405 :
406 : void
407 356 : DefaultResolver::visit (AST::StaticItem &item)
408 : {
409 356 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
410 :
411 712 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
412 356 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
413 : std::move (expr_vis_1));
414 712 : };
415 :
416 : // FIXME: Why do we need a Rib here?
417 356 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
418 356 : }
419 :
420 : void
421 55359 : DefaultResolver::visit (AST::TypeParam ¶m)
422 : {
423 55359 : auto expr_vis = [this, ¶m] () { AST::DefaultASTVisitor::visit (param); };
424 :
425 55359 : ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
426 55359 : }
427 :
428 : void
429 72 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
430 : AST::Crate &crate, CrateNum num)
431 : {
432 72 : visit (crate);
433 72 : }
434 :
435 : void
436 153 : DefaultResolver::visit (AST::ExternCrate &crate)
437 : {
438 153 : auto &mappings = Analysis::Mappings::get ();
439 153 : auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
440 :
441 153 : if (!num_opt)
442 : {
443 9 : rust_error_at (crate.get_locus (), "unknown crate %qs",
444 9 : crate.get_referenced_crate ().c_str ());
445 9 : return;
446 : }
447 :
448 144 : CrateNum num = *num_opt;
449 :
450 144 : AST::Crate &referenced_crate = mappings.get_ast_crate (num);
451 :
452 144 : auto sub_visitor_1
453 144 : = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
454 :
455 288 : auto sub_visitor_2 = [&] () {
456 144 : ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
457 144 : crate.get_referenced_crate (),
458 : std::move (sub_visitor_1));
459 288 : };
460 :
461 144 : if (crate.has_as_clause ())
462 0 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
463 0 : sub_visitor_2, crate.get_as_clause ());
464 : else
465 144 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
466 432 : sub_visitor_2, crate.get_referenced_crate ());
467 : }
468 :
469 : } // namespace Resolver2_0
470 : } // namespace Rust
|