LCOV - code coverage report
Current view: top level - gcc/rust/resolve - rust-default-resolver.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 99.2 % 250 248
Test Date: 2026-02-28 14:20:25 Functions: 100.0 % 53 53
Legend: Lines:     hit not hit

            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 &param : 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 &param)
     422              : {
     423        55359 :   auto expr_vis = [this, &param] () { 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
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.