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 % 254 252
Test Date: 2026-03-28 14:25:54 Functions: 100.0 % 54 54
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        29930 : DefaultResolver::visit (AST::Crate &crate)
      33              : {
      34        29930 :   auto inner_fn = [this, &crate] () { AST::DefaultASTVisitor::visit (crate); };
      35              : 
      36        29930 :   auto &mappings = Analysis::Mappings::get ();
      37              : 
      38        29930 :   auto crate_num = mappings.lookup_crate_num (crate.get_node_id ());
      39        29930 :   rust_assert (crate_num.has_value ());
      40        29930 :   auto crate_name = mappings.get_crate_name (*crate_num);
      41        29930 :   rust_assert (crate_name.has_value ());
      42              : 
      43        59860 :   ctx.canonical_ctx.scope_crate (crate.get_node_id (), *crate_name, inner_fn);
      44        29929 : }
      45              : 
      46              : void
      47       150161 : 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       150161 :   auto inner_fn = [this, &expr] () { AST::DefaultASTVisitor::visit (expr); };
      53              : 
      54       150161 :   ctx.scoped (Rib::Kind::Normal, expr.get_node_id (), inner_fn);
      55       150160 : }
      56              : 
      57              : void
      58         9046 : DefaultResolver::visit (AST::Module &module)
      59              : {
      60         9046 :   auto item_fn_1
      61         9046 :     = [this, &module] () { AST::DefaultASTVisitor::visit (module); };
      62              : 
      63        18092 :   auto item_fn_2 = [this, &module, &item_fn_1] () {
      64         9046 :     ctx.canonical_ctx.scope (module.get_node_id (), module.get_name (),
      65              :                              std::move (item_fn_1));
      66        18092 :   };
      67              : 
      68        18092 :   ctx.scoped (Rib::Kind::Module, module.get_node_id (), item_fn_2,
      69        18092 :               module.get_name ());
      70         9046 : }
      71              : 
      72              : void
      73       124232 : DefaultResolver::visit (AST::Function &function)
      74              : {
      75       124232 :   auto def_fn_1
      76       124232 :     = [this, &function] () { AST::DefaultASTVisitor::visit (function); };
      77              : 
      78       248464 :   auto def_fn_2 = [this, &function, &def_fn_1] () {
      79       124232 :     ctx.canonical_ctx.scope (function.get_node_id (),
      80       124232 :                              function.get_function_name (),
      81              :                              std::move (def_fn_1));
      82       248463 :   };
      83              : 
      84       248464 :   ctx.scoped (Rib::Kind::Function, function.get_node_id (), def_fn_2,
      85       248463 :               function.get_function_name ());
      86       124231 : }
      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        24955 : DefaultResolver::visit (AST::Trait &trait)
     125              : {
     126        24955 :   visit_outer_attrs (trait);
     127        24955 :   visit (trait.get_visibility ());
     128        24955 :   visit_inner_attrs (trait);
     129              : 
     130        49910 :   auto inner_fn_1 = [this, &trait] () {
     131        48638 :     for (auto &item : trait.get_trait_items ())
     132        23683 :       visit (item);
     133        49910 :   };
     134              : 
     135        49910 :   auto inner_fn_2 = [this, &trait, &inner_fn_1] () {
     136        24955 :     visit (trait.get_implicit_self ());
     137        29601 :     for (auto &generic : trait.get_generic_params ())
     138         4646 :       visit (generic);
     139        24955 :     if (trait.has_where_clause ())
     140           56 :       visit (trait.get_where_clause ());
     141        29521 :     for (auto &bound : trait.get_type_param_bounds ())
     142         4566 :       visit (bound);
     143              : 
     144        24955 :     ctx.scoped (Rib::Kind::TraitOrImpl, trait.get_node_id (), inner_fn_1);
     145        49910 :   };
     146              : 
     147        49910 :   auto inner_fn_3 = [this, &trait, &inner_fn_2] () {
     148        24955 :     ctx.canonical_ctx.scope (trait.get_node_id (), trait.get_identifier (),
     149              :                              std::move (inner_fn_2));
     150        49910 :   };
     151              : 
     152        49910 :   ctx.scoped (Rib::Kind::Generics, trait.get_node_id (), inner_fn_3,
     153        49910 :               trait.get_identifier () /* FIXME: Is that valid?*/);
     154        24955 : }
     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        10143 : DefaultResolver::visit (AST::StructStruct &type)
     240              : {
     241        10143 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     242              : 
     243        20286 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     244        10143 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_struct_name (),
     245              :                              std::move (inner_fn_1));
     246        20286 :   };
     247              : 
     248        10143 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     249        30429 :               inner_fn_2, type.get_struct_name ());
     250        10143 : }
     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          675 : DefaultResolver::visit (AST::Union &type)
     318              : {
     319          675 :   auto inner_fn_1 = [this, &type] () { AST::DefaultASTVisitor::visit (type); };
     320              : 
     321         1350 :   auto inner_fn_2 = [this, &type, &inner_fn_1] () {
     322          675 :     ctx.canonical_ctx.scope (type.get_node_id (), type.get_identifier (),
     323              :                              std::move (inner_fn_1));
     324         1350 :   };
     325              : 
     326         1350 :   ctx.scoped (Rib::Kind::Item /* FIXME: Correct? */, type.get_node_id (),
     327         2025 :               inner_fn_2, type.get_identifier ());
     328          675 : }
     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         6944 : DefaultResolver::visit (AST::MatchExpr &expr)
     385              : {
     386         6944 :   if (expr.is_marked_for_strip ())
     387              :     return;
     388              : 
     389         6944 :   AST::DefaultASTVisitor::visit (expr);
     390              : }
     391              : 
     392              : void
     393        16150 : DefaultResolver::visit (AST::MatchCase &cas)
     394              : {
     395        16150 :   auto vis = [this, &cas] () { AST::DefaultASTVisitor::visit (cas); };
     396              : 
     397        16150 :   ctx.scoped (Rib::Kind::Normal, cas.get_node_id (), vis);
     398        16150 : }
     399              : 
     400              : void
     401         3477 : DefaultResolver::visit (AST::ConstantItem &item)
     402              : {
     403         3477 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     404              : 
     405         6954 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     406         3477 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     407              :                              std::move (expr_vis_1));
     408         6954 :   };
     409              : 
     410              :   // FIXME: Why do we need a Rib here?
     411         3477 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     412         3477 : }
     413              : 
     414              : void
     415          356 : DefaultResolver::visit (AST::StaticItem &item)
     416              : {
     417          356 :   auto expr_vis_1 = [this, &item] () { AST::DefaultASTVisitor::visit (item); };
     418              : 
     419          712 :   auto expr_vis_2 = [this, &item, &expr_vis_1] () {
     420          356 :     ctx.canonical_ctx.scope (item.get_node_id (), item.get_identifier (),
     421              :                              std::move (expr_vis_1));
     422          712 :   };
     423              : 
     424              :   // FIXME: Why do we need a Rib here?
     425          356 :   ctx.scoped (Rib::Kind::ConstantItem, item.get_node_id (), expr_vis_2);
     426          356 : }
     427              : 
     428              : void
     429        55407 : DefaultResolver::visit (AST::TypeParam &param)
     430              : {
     431        55407 :   auto expr_vis = [this, &param] () { AST::DefaultASTVisitor::visit (param); };
     432              : 
     433        55407 :   ctx.scoped (Rib::Kind::ForwardTypeParamBan, param.get_node_id (), expr_vis);
     434        55407 : }
     435              : 
     436              : void
     437           72 : DefaultResolver::visit_extern_crate (AST::ExternCrate &extern_crate,
     438              :                                      AST::Crate &crate, CrateNum num)
     439              : {
     440           72 :   visit (crate);
     441           72 : }
     442              : 
     443              : void
     444          153 : DefaultResolver::visit (AST::ExternCrate &crate)
     445              : {
     446          153 :   auto &mappings = Analysis::Mappings::get ();
     447          153 :   auto num_opt = mappings.lookup_crate_name (crate.get_referenced_crate ());
     448              : 
     449          153 :   if (!num_opt)
     450              :     {
     451            9 :       rust_error_at (crate.get_locus (), "unknown crate %qs",
     452            9 :                      crate.get_referenced_crate ().c_str ());
     453            9 :       return;
     454              :     }
     455              : 
     456          144 :   CrateNum num = *num_opt;
     457              : 
     458          144 :   AST::Crate &referenced_crate = mappings.get_ast_crate (num);
     459              : 
     460          144 :   auto sub_visitor_1
     461          144 :     = [&, this] () { visit_extern_crate (crate, referenced_crate, num); };
     462              : 
     463          288 :   auto sub_visitor_2 = [&] () {
     464          144 :     ctx.canonical_ctx.scope_crate (referenced_crate.get_node_id (),
     465          144 :                                    crate.get_referenced_crate (),
     466              :                                    std::move (sub_visitor_1));
     467          288 :   };
     468              : 
     469          144 :   if (crate.has_as_clause ())
     470            0 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     471            0 :                 sub_visitor_2, crate.get_as_clause ());
     472              :   else
     473          144 :     ctx.scoped (Rib::Kind::Module, referenced_crate.get_node_id (),
     474          432 :                 sub_visitor_2, crate.get_referenced_crate ());
     475              : }
     476              : 
     477              : } // namespace Resolver2_0
     478              : } // 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.