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 % 241 239
Test Date: 2025-08-30 13:27:53 Functions: 100.0 % 52 52
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: - 0 0

             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 &param : 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 &param)
     398                 :             : {
     399                 :       54357 :   auto expr_vis = [this, &param] () { 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
        

Generated by: LCOV version 2.1-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.