Branch data Line data Source code
1 : : // Copyright (C) 2020-2025 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 : 28630 : DefaultResolver::visit (AST::Crate &crate)
29 : : {
30 : 28630 : auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
31 : :
32 : 28630 : auto &mappings = Analysis::Mappings::get ();
33 : :
34 : 28630 : auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
35 : 28630 : rust_assert (crate_num.has_value ());
36 : 28630 : auto crate_name = mappings.get_crate_name (*crate_num);
37 : 28630 : rust_assert (crate_name.has_value ());
38 : :
39 : 57260 : ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
40 : 28629 : }
41 : :
42 : : void
43 : 146021 : DefaultResolver::visit (AST::BlockExpr &expr)
44 : : {
45 : : // extracting the lambda from the `scoped` call otherwise the code looks like
46 : : // a hot turd thanks to our .clang-format
47 : :
48 : 146021 : auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
49 : :
50 : 146021 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
51 : 146020 : }
52 : :
53 : : void
54 : 8849 : DefaultResolver::visit (AST::Module &module)
55 : : {
56 : 8849 : auto item_fn_1
57 : 8849 : = [this, &module] () { AST::DefaultASTVisitor::visit (module); };
58 : :
59 : 17698 : auto item_fn_2 = [this, &module, &item_fn_1] () {
60 : 8849 : ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
61 : : std::move (item_fn_1));
62 : 17698 : };
63 : :
64 : 17698 : ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
65 : 17698 : module.get_name ());
66 : 8849 : }
67 : :
68 : : void
69 : 122228 : DefaultResolver::visit (AST::Function &function)
70 : : {
71 : 122228 : auto def_fn_1
72 : 122228 : = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
73 : :
74 : 244456 : auto def_fn_2 = [this, &function, &def_fn_1] () {
75 : 122228 : ctx.canonical_ctx.scope (function.get_node_id (),
76 : 122228 : function.get_function_name (),
77 : : std::move (def_fn_1));
78 : 244455 : };
79 : :
80 : 244456 : ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2,
81 : 244455 : function.get_function_name ());
82 : 122227 : }
83 : :
84 : : void
85 : 128 : DefaultResolver::visit (AST::ForLoopExpr &expr)
86 : : {
87 : 128 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (),
88 : 384 : [this, &expr] () { AST::DefaultASTVisitor::visit (expr); });
89 : 128 : }
90 : :
91 : : void
92 : 180 : DefaultResolver::visit_if_let_patterns (AST::IfLetExpr &expr)
93 : : {
94 : 360 : for (auto &pattern : expr.get_patterns ())
95 : 180 : visit (pattern);
96 : 180 : }
97 : :
98 : : void
99 : 180 : DefaultResolver::visit (AST::IfLetExpr &expr)
100 : : {
101 : 360 : auto inner_vis = [this, &expr] () {
102 : 180 : visit_if_let_patterns (expr);
103 : 180 : visit (expr.get_if_block ());
104 : 360 : };
105 : :
106 : 180 : visit_outer_attrs (expr);
107 : :
108 : 180 : visit (expr.get_value_expr ());
109 : :
110 : 180 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_vis);
111 : 180 : }
112 : :
113 : : void
114 : 72 : DefaultResolver::visit (AST::IfLetExprConseqElse &expr)
115 : : {
116 : 72 : DefaultResolver::visit (static_cast<AST::IfLetExpr &> (expr));
117 : 72 : visit (expr.get_else_block ());
118 : 72 : }
119 : :
120 : : void
121 : 24317 : DefaultResolver::visit (AST::Trait &trait)
122 : : {
123 : 24317 : visit_outer_attrs (trait);
124 : 24317 : visit (trait.get_visibility ());
125 : 24317 : visit_inner_attrs (trait);
126 : :
127 : 48634 : auto inner_fn_1 = [this, &trait] () {
128 : 47776 : for (auto &item : trait.get_trait_items ())
129 : 23459 : visit (item);
130 : 48634 : };
131 : :
132 : 48634 : auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
133 : 24317 : visit (trait.get_implicit_self ());
134 : 28923 : for (auto &generic : trait.get_generic_params ())
135 : 4606 : visit (generic);
136 : 24317 : if (trait.has_where_clause ())
137 : 56 : visit (trait.get_where_clause ());
138 : 28861 : for (auto &bound : trait.get_type_param_bounds ())
139 : 4544 : visit (bound);
140 : :
141 : 24317 : ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
142 : 48634 : };
143 : :
144 : 48634 : auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
145 : 24317 : ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
146 : : std::move (inner_fn_2));
147 : 48634 : };
148 : :
149 : 48634 : ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
150 : 48634 : trait.get_identifier () /* FIXME: Is that valid?*/);
151 : 24317 : }
152 : :
153 : : void
154 : 6173 : DefaultResolver::visit (AST::InherentImpl &impl)
155 : : {
156 : 6173 : visit_outer_attrs (impl);
157 : 6173 : visit (impl.get_visibility ());
158 : 6173 : visit_inner_attrs (impl);
159 : :
160 : 12346 : auto inner_fn_1 = [this, &impl] () {
161 : 25296 : for (auto &item : impl.get_impl_items ())
162 : 19123 : visit (item);
163 : 12346 : };
164 : :
165 : 12346 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
166 : 6173 : maybe_insert_big_self (impl);
167 : 8204 : for (auto &generic : impl.get_generic_params ())
168 : 2031 : visit (generic);
169 : 6173 : if (impl.has_where_clause ())
170 : 5 : visit (impl.get_where_clause ());
171 : 6173 : visit_impl_type (impl.get_type ());
172 : :
173 : 6173 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
174 : 12346 : };
175 : :
176 : 12346 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
177 : 6173 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
178 : 12346 : };
179 : :
180 : 6173 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
181 : 6173 : }
182 : :
183 : : void
184 : 31493 : DefaultResolver::visit (AST::TraitImpl &impl)
185 : : {
186 : 31493 : visit_outer_attrs (impl);
187 : 31493 : visit (impl.get_visibility ());
188 : 31493 : visit_inner_attrs (impl);
189 : :
190 : 62986 : auto inner_fn_1 = [this, &impl] () {
191 : 68707 : for (auto &item : impl.get_impl_items ())
192 : 37214 : visit (item);
193 : 62986 : };
194 : :
195 : 62986 : auto inner_fn_2 = [this, &impl, &inner_fn_1] () {
196 : 31493 : maybe_insert_big_self (impl);
197 : 36761 : for (auto &generic : impl.get_generic_params ())
198 : 5268 : visit (generic);
199 : 31493 : if (impl.has_where_clause ())
200 : 594 : visit (impl.get_where_clause ());
201 : 31493 : visit_impl_type (impl.get_type ());
202 : 31493 : visit (impl.get_trait_path ());
203 : :
204 : 31493 : ctx.scoped (Rib::Kind::TraitOrImpl, impl.get_node_id (), inner_fn_1);
205 : 62986 : };
206 : :
207 : 62986 : auto inner_fn_3 = [this, &impl, &inner_fn_2] () {
208 : 31493 : ctx.canonical_ctx.scope_impl (impl, std::move (inner_fn_2));
209 : 62986 : };
210 : :
211 : 31493 : ctx.scoped (Rib::Kind::Generics, impl.get_node_id (), inner_fn_3);
212 : 31493 : }
213 : :
214 : : void
215 : 9760 : DefaultResolver::visit (AST::StructStruct &type)
216 : : {
217 : 9760 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
218 : :
219 : 19520 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
220 : 9760 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
221 : : std::move (inner_fn_1));
222 : 19520 : };
223 : :
224 : 9760 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
225 : 29280 : inner_fn_2, type.get_struct_name ());
226 : 9760 : }
227 : :
228 : : void
229 : 5932 : DefaultResolver::visit (AST::TupleStruct &type)
230 : : {
231 : 5932 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
232 : :
233 : 11864 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
234 : 5932 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
235 : : std::move (inner_fn_1));
236 : 11864 : };
237 : :
238 : 5932 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
239 : 17796 : inner_fn_2, type.get_struct_name ());
240 : 5932 : }
241 : :
242 : : void
243 : 2934 : DefaultResolver::visit (AST::EnumItem &item)
244 : : {
245 : 2934 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
246 : :
247 : 2934 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
248 : : inner_fn);
249 : 2934 : }
250 : :
251 : : void
252 : 3053 : DefaultResolver::visit (AST::EnumItemTuple &item)
253 : : {
254 : 3053 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
255 : :
256 : 3053 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
257 : : inner_fn);
258 : 3053 : }
259 : :
260 : : void
261 : 592 : DefaultResolver::visit (AST::EnumItemStruct &item)
262 : : {
263 : 592 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
264 : :
265 : 592 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
266 : : inner_fn);
267 : 592 : }
268 : :
269 : : void
270 : 1905 : DefaultResolver::visit (AST::EnumItemDiscriminant &item)
271 : : {
272 : 1905 : auto inner_fn = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
273 : :
274 : 1905 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
275 : : inner_fn);
276 : 1905 : }
277 : :
278 : : void
279 : 3614 : DefaultResolver::visit (AST::Enum &type)
280 : : {
281 : 3614 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
282 : :
283 : 7228 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
284 : 3614 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
285 : : std::move (inner_fn_1));
286 : 7228 : };
287 : :
288 : 7228 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
289 : 10842 : inner_fn_2, type.get_identifier ());
290 : 3614 : }
291 : :
292 : : void
293 : 651 : DefaultResolver::visit (AST::Union &type)
294 : : {
295 : 651 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
296 : :
297 : 1302 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
298 : 651 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
299 : : std::move (inner_fn_1));
300 : 1302 : };
301 : :
302 : 1302 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
303 : 1953 : inner_fn_2, type.get_identifier ());
304 : 651 : }
305 : :
306 : : void
307 : 8788 : DefaultResolver::visit (AST::TypeAlias &type)
308 : : {
309 : 8788 : auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
310 : :
311 : 17576 : auto inner_fn_2 = [this, &type, &inner_fn_1] () {
312 : 8788 : ctx.canonical_ctx.scope (type.get_node_id (), type.get_new_type_name (),
313 : : std::move (inner_fn_1));
314 : 17576 : };
315 : :
316 : 17576 : ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
317 : 26364 : inner_fn_2, type.get_new_type_name ());
318 : 8788 : }
319 : :
320 : : void
321 : 386 : DefaultResolver::visit_closure_params (AST::ClosureExpr &expr)
322 : : {
323 : 758 : for (auto ¶m : expr.get_params ())
324 : 372 : visit (param);
325 : 386 : }
326 : :
327 : : void
328 : 386 : DefaultResolver::visit (AST::ClosureExpr &expr)
329 : : {
330 : 772 : auto expr_fn = [this, &expr] () {
331 : 386 : visit_closure_params (expr);
332 : 386 : visit (expr.get_definition_expr ());
333 : 772 : };
334 : :
335 : 386 : visit_outer_attrs (expr);
336 : :
337 : 386 : ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), expr_fn);
338 : 386 : }
339 : :
340 : : void
341 : 206 : DefaultResolver::visit (AST::ClosureExprInner &expr)
342 : : {
343 : 206 : if (expr.is_marked_for_strip ())
344 : : return;
345 : :
346 : 206 : visit (static_cast<AST::ClosureExpr &> (expr));
347 : : }
348 : :
349 : : void
350 : 180 : DefaultResolver::visit (AST::ClosureExprInnerTyped &expr)
351 : : {
352 : 180 : if (expr.is_marked_for_strip ())
353 : : return;
354 : :
355 : 180 : visit (static_cast<AST::ClosureExpr &> (expr));
356 : 180 : visit (expr.get_return_type ());
357 : : }
358 : :
359 : : void
360 : 6458 : DefaultResolver::visit (AST::MatchExpr &expr)
361 : : {
362 : 6458 : if (expr.is_marked_for_strip ())
363 : : return;
364 : :
365 : 6458 : AST::DefaultASTVisitor::visit (expr);
366 : : }
367 : :
368 : : void
369 : 2967 : DefaultResolver::visit (AST::ConstantItem &item)
370 : : {
371 : 2967 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
372 : :
373 : 5934 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
374 : 2967 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
375 : : std::move (expr_vis_1));
376 : 5934 : };
377 : :
378 : : // FIXME: Why do we need a Rib here?
379 : 2967 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
380 : 2967 : }
381 : :
382 : : void
383 : 329 : DefaultResolver::visit (AST::StaticItem &item)
384 : : {
385 : 329 : auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
386 : :
387 : 658 : auto expr_vis_2 = [this, &item, &expr_vis_1] () {
388 : 329 : ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
389 : : std::move (expr_vis_1));
390 : 658 : };
391 : :
392 : : // FIXME: Why do we need a Rib here?
393 : 329 : ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
394 : 329 : }
395 : :
396 : : void
397 : 54357 : DefaultResolver::visit (AST::TypeParam ¶m)
398 : : {
399 : 54357 : auto expr_vis = [this, ¶m] () { AST::DefaultASTVisitor::visit (param); };
400 : :
401 : 54357 : ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
402 : 54357 : }
403 : :
404 : : void
405 : 72 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
406 : : AST::Crate &crate, CrateNum num)
407 : : {
408 : 72 : visit (crate);
409 : 72 : }
410 : :
411 : : void
412 : 153 : DefaultResolver::visit (AST::ExternCrate &crate)
413 : : {
414 : 153 : auto &mappings = Analysis::Mappings::get ();
415 : 153 : auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
416 : :
417 : 153 : if (!num_opt)
418 : : {
419 : 9 : rust_error_at (crate.get_locus (), "unknown crate %qs",
420 : 9 : crate.get_referenced_crate ().c_str ());
421 : 9 : return;
422 : : }
423 : :
424 : 144 : CrateNum num = *num_opt;
425 : :
426 : 144 : AST::Crate &referenced_crate = mappings.get_ast_crate (num);
427 : :
428 : 144 : auto sub_visitor_1
429 : 144 : = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
430 : :
431 : 288 : auto sub_visitor_2 = [&] () {
432 : 144 : ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
433 : 144 : crate.get_referenced_crate (),
434 : : std::move (sub_visitor_1));
435 : 288 : };
436 : :
437 : 144 : if (crate.has_as_clause ())
438 : 0 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
439 : 0 : sub_visitor_2, crate.get_as_clause ());
440 : : else
441 : 144 : ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
442 : 432 : sub_visitor_2, crate.get_referenced_crate ());
443 : : }
444 : :
445 : : } // namespace Resolver2_0
446 : : } // namespace Rust
|