LCOV - code coverage report
Current view: top level - gcc/rust/ast - rust-ast-pointer-visitor.cc (source / functions) Coverage Total Hit
Test: gcc.info Lines: 89.0 % 874 778
Test Date: 2026-02-28 14:20:25 Functions: 89.0 % 172 153
Legend: Lines:     hit not hit

            Line data    Source code
       1              : // Copyright (C) 2025-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-ast-pointer-visitor.h"
      20              : #include "rust-ast-visitor.h"
      21              : #include "rust-ast-full.h"
      22              : 
      23              : namespace Rust {
      24              : namespace AST {
      25              : 
      26              : void
      27         4398 : PointerVisitor::visit (AST::Crate &crate)
      28              : {
      29         4398 :   visit_inner_attrs (crate);
      30        23389 :   for (auto &item : crate.items)
      31        18991 :     reseat (item);
      32         4398 : }
      33              : 
      34              : void
      35            0 : PointerVisitor::visit (AST::AttrInputMetaItemContainer &input)
      36              : {
      37              :   // FIXME: I think we might actually have to reseat sub-items for macro
      38              :   // invocations within attributes correct?
      39              : 
      40            0 :   for (auto &item : input.get_items ())
      41            0 :     visit (item);
      42            0 : }
      43              : 
      44              : void
      45        24322 : PointerVisitor::visit (AST::IdentifierExpr &ident_expr)
      46              : {
      47        24322 :   visit_outer_attrs (ident_expr);
      48        24322 : }
      49              : 
      50              : void
      51          274 : PointerVisitor::visit (AST::LifetimeParam &lifetime_param)
      52              : {
      53          274 :   visit_outer_attrs (lifetime_param);
      54              : 
      55              :   // Nothing to do for lifetimes right?
      56          274 : }
      57              : 
      58              : void
      59           97 : PointerVisitor::visit (AST::ConstGenericParam &const_param)
      60              : {
      61           97 :   visit_outer_attrs (const_param);
      62           97 :   if (const_param.has_type ())
      63           97 :     reseat (const_param.get_type_ptr ());
      64              : 
      65           97 :   if (const_param.has_default_value ())
      66           18 :     visit (const_param.get_default_value_unchecked ());
      67           97 : }
      68              : 
      69              : void
      70        24391 : PointerVisitor::visit (AST::PathInExpression &path)
      71              : {
      72        24391 :   visit_outer_attrs (path);
      73              : 
      74        24391 :   if (!path.is_lang_item ())
      75        57679 :     for (auto &segment : path.get_segments ())
      76        33432 :       visit (segment);
      77        24391 : }
      78              : 
      79              : void
      80           73 : PointerVisitor::visit (GenericArgsBinding &binding)
      81              : {
      82           73 :   reseat (binding.get_type_ptr ());
      83           73 : }
      84              : 
      85              : void
      86         2889 : PointerVisitor::visit (AST::TypePathSegmentGeneric &segment)
      87              : {
      88         2889 :   if (segment.has_generic_args ())
      89         2888 :     visit (segment.get_generic_args ());
      90         2889 : }
      91              : 
      92              : void
      93           30 : PointerVisitor::visit (AST::TypePathFunction &tpf)
      94              : {
      95           62 :   for (auto &input : tpf.get_params ())
      96           32 :     reseat (input);
      97           30 :   if (tpf.has_return_type ())
      98           28 :     reseat (tpf.get_return_type_ptr ());
      99           30 : }
     100              : 
     101              : void
     102           30 : PointerVisitor::visit (AST::TypePathSegmentFunction &segment)
     103              : {
     104              :   // FIXME: No reseating here correct? No macros possible or desugar?
     105           30 :   visit (segment.get_type_path_function ());
     106           30 :   visit (segment.get_ident_segment ());
     107           30 : }
     108              : 
     109              : void
     110         3837 : PointerVisitor::visit (AST::GenericArgs &args)
     111              : {
     112              :   // Nothing to do for lifetimes?
     113              :   // for (auto &lifetime : args.get_lifetime_args ())
     114              :   //   reseat (lifetime);
     115              : 
     116              :   // FIXME: Actually this can probably be a macro invocation, so we need to
     117              :   // reseat them?
     118         7855 :   for (auto &generic : args.get_generic_args ())
     119         4018 :     visit (generic);
     120              : 
     121         3910 :   for (auto &binding : args.get_binding_args ())
     122           73 :     visit (binding);
     123         3837 : }
     124              : 
     125              : void
     126        42693 : PointerVisitor::visit (AST::PathExprSegment &segment)
     127              : {
     128        42693 :   visit (segment.get_ident_segment ());
     129        42693 :   if (segment.has_generic_args ())
     130          949 :     visit (segment.get_generic_args ());
     131        42693 : }
     132              : void
     133       179382 : PointerVisitor::visit (AST::TypePath &path)
     134              : {
     135       365372 :   for (auto &segment : path.get_segments ())
     136       185990 :     visit (segment);
     137       179382 : }
     138              : 
     139              : void
     140          114 : PointerVisitor::visit (AST::QualifiedPathInExpression &path)
     141              : {
     142          114 :   visit_outer_attrs (path);
     143          114 :   visit (path.get_qualified_path_type ());
     144              : 
     145          228 :   for (auto &segment : path.get_segments ())
     146          114 :     visit (segment);
     147          114 : }
     148              : 
     149              : void
     150          443 : PointerVisitor::visit (AST::QualifiedPathType &path)
     151              : {
     152          443 :   reseat (path.get_type_ptr ());
     153          443 :   if (path.has_as_clause ())
     154          408 :     visit (path.get_as_type_path ());
     155          443 : }
     156              : 
     157              : void
     158          329 : PointerVisitor::visit (AST::QualifiedPathInType &path)
     159              : {
     160          329 :   visit (path.get_qualified_path_type ());
     161          329 :   visit (path.get_associated_segment ());
     162              : 
     163          329 :   for (auto &segment : path.get_segments ())
     164            0 :     visit (segment);
     165          329 : }
     166              : 
     167              : void
     168        18588 : PointerVisitor::visit (AST::LiteralExpr &expr)
     169              : {
     170        18588 :   visit_outer_attrs (expr);
     171        18588 : }
     172              : 
     173              : void
     174            0 : PointerVisitor::visit (AST::AttrInputLiteral &attr_input)
     175              : {
     176            0 :   visit (attr_input.get_literal ());
     177            0 : }
     178              : 
     179              : void
     180            0 : PointerVisitor::visit (AST::AttrInputMacro &attr_input)
     181              : {
     182            0 :   visit (attr_input.get_macro ());
     183            0 : }
     184              : 
     185              : void
     186            0 : PointerVisitor::visit (AST::MetaItemLitExpr &meta_item)
     187              : {
     188            0 :   visit (meta_item.get_literal ());
     189            0 : }
     190              : 
     191              : void
     192          720 : PointerVisitor::visit (AST::SimplePath &path)
     193              : {
     194         2422 :   for (auto &segment : path.get_segments ())
     195         1702 :     visit (segment);
     196          720 : }
     197              : 
     198              : void
     199            0 : PointerVisitor::visit (AST::MetaItemPathExpr &meta_item)
     200              : {
     201            0 :   visit (meta_item.get_path ());
     202            0 :   reseat (meta_item.get_expr_ptr ());
     203            0 : }
     204              : 
     205              : void
     206         6739 : PointerVisitor::visit (AST::BorrowExpr &expr)
     207              : {
     208         6739 :   visit_outer_attrs (expr);
     209         6739 :   reseat (expr.get_borrowed_expr_ptr ());
     210         6739 : }
     211              : 
     212              : void
     213        13913 : PointerVisitor::visit (AST::DereferenceExpr &expr)
     214              : {
     215        13913 :   visit_outer_attrs (expr);
     216        13913 :   reseat (expr.get_dereferenced_expr_ptr ());
     217        13913 : }
     218              : 
     219              : void
     220            2 : PointerVisitor::visit (AST::ErrorPropagationExpr &expr)
     221              : {
     222            2 :   visit_outer_attrs (expr);
     223            2 :   reseat (expr.get_propagating_expr_ptr ());
     224            2 : }
     225              : 
     226              : void
     227         1710 : PointerVisitor::visit (AST::NegationExpr &expr)
     228              : {
     229         1710 :   visit_outer_attrs (expr);
     230         1710 :   reseat (expr.get_negated_expr_ptr ());
     231         1710 : }
     232              : 
     233              : void
     234         3383 : PointerVisitor::visit (AST::ArithmeticOrLogicalExpr &expr)
     235              : {
     236         3383 :   visit_outer_attrs (expr);
     237         3383 :   reseat (expr.get_left_expr_ptr ());
     238         3383 :   reseat (expr.get_right_expr_ptr ());
     239         3383 : }
     240              : 
     241              : void
     242         2719 : PointerVisitor::visit (AST::ComparisonExpr &expr)
     243              : {
     244         2719 :   visit_outer_attrs (expr);
     245         2719 :   reseat (expr.get_left_expr_ptr ());
     246         2719 :   reseat (expr.get_right_expr_ptr ());
     247         2719 : }
     248              : 
     249              : void
     250          385 : PointerVisitor::visit (AST::LazyBooleanExpr &expr)
     251              : {
     252          385 :   visit_outer_attrs (expr);
     253          385 :   reseat (expr.get_left_expr_ptr ());
     254          385 :   reseat (expr.get_right_expr_ptr ());
     255          385 : }
     256              : 
     257              : void
     258         5114 : PointerVisitor::visit (AST::TypeCastExpr &expr)
     259              : {
     260         5114 :   visit_outer_attrs (expr);
     261         5114 :   reseat (expr.get_casted_expr_ptr ());
     262         5114 :   reseat (expr.get_type_to_cast_to_ptr ());
     263         5114 : }
     264              : 
     265              : void
     266         2497 : PointerVisitor::visit (AST::AssignmentExpr &expr)
     267              : {
     268         2497 :   visit_outer_attrs (expr);
     269         2497 :   reseat (expr.get_left_expr_ptr ());
     270         2497 :   reseat (expr.get_right_expr_ptr ());
     271         2497 : }
     272              : 
     273              : void
     274          682 : PointerVisitor::visit (AST::CompoundAssignmentExpr &expr)
     275              : {
     276          682 :   visit_outer_attrs (expr);
     277          682 :   reseat (expr.get_left_expr_ptr ());
     278          682 :   reseat (expr.get_right_expr_ptr ());
     279          682 : }
     280              : 
     281              : void
     282          311 : PointerVisitor::visit (AST::GroupedExpr &expr)
     283              : {
     284          311 :   visit_outer_attrs (expr);
     285          311 :   visit_inner_attrs (expr);
     286          311 :   reseat (expr.get_expr_in_parens_ptr ());
     287          311 : }
     288              : 
     289              : void
     290          895 : PointerVisitor::visit (AST::ArrayElemsValues &elems)
     291              : {
     292         5055 :   for (auto &value : elems.get_values ())
     293         4160 :     reseat (value);
     294          895 : }
     295              : 
     296              : void
     297          366 : PointerVisitor::visit (AST::ArrayElemsCopied &elems)
     298              : {
     299          366 :   reseat (elems.get_elem_to_copy_ptr ());
     300          366 :   reseat (elems.get_num_copies_ptr ());
     301          366 : }
     302              : 
     303              : void
     304         1261 : PointerVisitor::visit (AST::ArrayExpr &expr)
     305              : {
     306         1261 :   visit_outer_attrs (expr);
     307         1261 :   visit_inner_attrs (expr);
     308         1261 :   visit (expr.get_array_elems ());
     309         1261 : }
     310              : 
     311              : void
     312          765 : PointerVisitor::visit (AST::ArrayIndexExpr &expr)
     313              : {
     314          765 :   visit_outer_attrs (expr);
     315          765 :   reseat (expr.get_array_expr_ptr ());
     316          765 :   reseat (expr.get_index_expr_ptr ());
     317          765 : }
     318              : 
     319              : void
     320          565 : PointerVisitor::visit (AST::TupleExpr &expr)
     321              : {
     322          565 :   visit_outer_attrs (expr);
     323          565 :   visit_inner_attrs (expr);
     324         1548 :   for (auto &elem : expr.get_tuple_elems ())
     325          983 :     reseat (elem);
     326          565 : }
     327              : 
     328              : void
     329         2801 : PointerVisitor::visit (AST::TupleIndexExpr &expr)
     330              : {
     331         2801 :   visit_outer_attrs (expr);
     332         2801 :   reseat (expr.get_tuple_expr_ptr ());
     333         2801 : }
     334              : 
     335              : void
     336           81 : PointerVisitor::visit (AST::StructExprStruct &expr)
     337              : {
     338           81 :   visit_outer_attrs (expr);
     339           81 :   visit_inner_attrs (expr);
     340           81 :   visit (expr.get_struct_name ());
     341           81 : }
     342              : 
     343              : void
     344          648 : PointerVisitor::visit (AST::StructExprFieldIdentifier &field)
     345          648 : {}
     346              : 
     347              : void
     348         6535 : PointerVisitor::visit (AST::StructExprFieldIdentifierValue &field)
     349              : {
     350         6535 :   reseat (field.get_value_ptr ());
     351         6535 : }
     352              : 
     353              : void
     354          132 : PointerVisitor::visit (AST::StructExprFieldIndexValue &field)
     355              : {
     356          132 :   reseat (field.get_value_ptr ());
     357          132 : }
     358              : 
     359              : void
     360          189 : PointerVisitor::visit (AST::StructBase &base)
     361              : {
     362          189 :   reseat (base.get_base_struct_ptr ());
     363          189 : }
     364              : 
     365              : void
     366         4235 : PointerVisitor::visit (AST::StructExprStructFields &expr)
     367              : {
     368         4235 :   visit_outer_attrs (expr);
     369         4235 :   visit_inner_attrs (expr);
     370         4235 :   visit (expr.get_struct_name ());
     371         4235 :   if (expr.has_struct_base ())
     372          189 :     visit (expr.get_struct_base ());
     373        11550 :   for (auto &field : expr.get_fields ())
     374         7315 :     visit (field);
     375         4235 : }
     376              : 
     377              : void
     378            0 : PointerVisitor::visit (AST::StructExprStructBase &expr)
     379              : {
     380            0 :   visit_outer_attrs (expr);
     381            0 :   visit_inner_attrs (expr);
     382            0 :   visit (expr.get_struct_name ());
     383            0 :   visit (expr.get_struct_base ());
     384            0 : }
     385              : 
     386              : void
     387        11118 : PointerVisitor::visit (AST::CallExpr &expr)
     388              : {
     389        11118 :   visit_outer_attrs (expr);
     390        11118 :   reseat (expr.get_function_expr_ptr ());
     391        24320 :   for (auto &param : expr.get_params ())
     392        13202 :     reseat (param);
     393        11118 : }
     394              : 
     395              : void
     396         9147 : PointerVisitor::visit (AST::MethodCallExpr &expr)
     397              : {
     398         9147 :   visit_outer_attrs (expr);
     399         9147 :   reseat (expr.get_receiver_expr_ptr ());
     400         9147 :   visit (expr.get_method_name ());
     401        15264 :   for (auto &param : expr.get_params ())
     402         6117 :     reseat (param);
     403         9147 : }
     404              : 
     405              : void
     406        13613 : PointerVisitor::visit (AST::FieldAccessExpr &expr)
     407              : {
     408        13613 :   visit_outer_attrs (expr);
     409        13613 :   reseat (expr.get_receiver_expr_ptr ());
     410        13613 : }
     411              : 
     412              : void
     413           37 : PointerVisitor::visit (AST::ClosureExprInner &expr)
     414              : {
     415           37 :   visit_outer_attrs (expr);
     416              : 
     417              :   // TODO: Actually we need to handle macro invocations as closure parameters so
     418              :   // this needs to be a reseat
     419           63 :   for (auto &param : expr.get_params ())
     420           26 :     visit (param);
     421              : 
     422           37 :   reseat (expr.get_definition_expr_ptr ());
     423           37 : }
     424              : 
     425              : void
     426        22122 : PointerVisitor::visit (AST::BlockExpr &expr)
     427              : {
     428        22122 :   visit_outer_attrs (expr);
     429        22122 :   visit_inner_attrs (expr);
     430              : 
     431        22122 :   if (expr.has_label ())
     432            0 :     visit (expr.get_label ());
     433              : 
     434        44603 :   for (auto &stmt : expr.get_statements ())
     435        22481 :     reseat (stmt);
     436              : 
     437        22122 :   if (expr.has_tail_expr ())
     438        16052 :     reseat (expr.get_tail_expr_ptr ());
     439        22122 : }
     440              : 
     441              : void
     442           38 : PointerVisitor::visit (AST::ConstBlock &expr)
     443              : {
     444           38 :   visit (expr.get_const_expr ());
     445           38 : }
     446              : 
     447              : void
     448         2278 : PointerVisitor::visit (AST::AnonConst &expr)
     449              : {
     450         2278 :   if (!expr.is_deferred ())
     451         2252 :     reseat (expr.get_inner_expr_ptr ());
     452         2278 : }
     453              : 
     454              : void
     455           30 : PointerVisitor::visit (AST::ClosureExprInnerTyped &expr)
     456              : {
     457           30 :   visit_outer_attrs (expr);
     458              : 
     459              :   // TODO: Same as ClosureExprInner
     460           67 :   for (auto &param : expr.get_params ())
     461           37 :     visit (param);
     462              : 
     463           30 :   reseat (expr.get_return_type_ptr ());
     464              : 
     465           30 :   reseat (expr.get_definition_expr_ptr ());
     466           30 : }
     467              : 
     468              : void
     469           63 : PointerVisitor::visit (AST::ClosureParam &param)
     470              : {
     471           63 :   visit_outer_attrs (param);
     472           63 :   reseat (param.get_pattern_ptr ());
     473           63 :   if (param.has_type_given ())
     474           58 :     reseat (param.get_type_ptr ());
     475           63 : }
     476              : 
     477              : void
     478           17 : PointerVisitor::visit (AST::ContinueExpr &expr)
     479              : {
     480           17 :   visit_outer_attrs (expr);
     481           17 :   if (expr.has_label ())
     482            3 :     visit (expr.get_label_unchecked ());
     483           17 : }
     484              : 
     485              : void
     486          265 : PointerVisitor::visit (AST::BreakExpr &expr)
     487              : {
     488          265 :   visit_outer_attrs (expr);
     489          265 :   if (expr.has_label ())
     490           69 :     visit (expr.get_label_unchecked ());
     491              : 
     492          265 :   if (expr.has_break_expr ())
     493           66 :     reseat (expr.get_break_expr_ptr_unchecked ());
     494          265 : }
     495              : 
     496              : void
     497          246 : PointerVisitor::visit (AST::RangeFromToExpr &expr)
     498              : {
     499          246 :   reseat (expr.get_from_expr_ptr ());
     500          246 :   reseat (expr.get_to_expr_ptr ());
     501          246 : }
     502              : 
     503              : void
     504           21 : PointerVisitor::visit (AST::RangeFromExpr &expr)
     505              : {
     506           21 :   reseat (expr.get_from_expr_ptr ());
     507           21 : }
     508              : 
     509              : void
     510           21 : PointerVisitor::visit (AST::RangeToExpr &expr)
     511              : {
     512           21 :   reseat (expr.get_to_expr_ptr ());
     513           21 : }
     514              : 
     515              : void
     516            0 : PointerVisitor::visit (AST::RangeFullExpr &expr)
     517            0 : {}
     518              : 
     519              : void
     520           21 : PointerVisitor::visit (AST::RangeFromToInclExpr &expr)
     521              : {
     522           21 :   reseat (expr.get_from_expr_ptr ());
     523           21 :   reseat (expr.get_to_expr_ptr ());
     524           21 : }
     525              : 
     526              : void
     527            0 : PointerVisitor::visit (AST::RangeToInclExpr &expr)
     528              : {
     529            0 :   reseat (expr.get_to_expr_ptr ());
     530            0 : }
     531              : 
     532              : void
     533         1626 : PointerVisitor::visit (AST::ReturnExpr &expr)
     534              : {
     535         1626 :   visit_outer_attrs (expr);
     536         1626 :   if (expr.has_returned_expr ())
     537         1523 :     reseat (expr.get_returned_expr_ptr ());
     538         1626 : }
     539              : 
     540              : void
     541            2 : PointerVisitor::visit (AST::TryExpr &expr)
     542              : {
     543            2 :   visit_outer_attrs (expr);
     544            2 :   reseat (expr.get_block_expr_ptr ());
     545            2 : }
     546              : 
     547              : void
     548            3 : PointerVisitor::visit (AST::BoxExpr &expr)
     549              : {
     550            3 :   visit_outer_attrs (expr);
     551            3 :   reseat (expr.get_boxed_expr_ptr ());
     552            3 : }
     553              : 
     554              : void
     555        11553 : PointerVisitor::visit (AST::UnsafeBlockExpr &expr)
     556              : {
     557        11553 :   visit_outer_attrs (expr);
     558        11553 :   reseat (expr.get_block_expr_ptr ());
     559        11553 : }
     560              : 
     561              : void
     562          189 : PointerVisitor::visit (AST::LoopLabel &label)
     563              : {
     564          189 :   visit (label.get_lifetime ());
     565          189 : }
     566              : 
     567              : void
     568          373 : PointerVisitor::visit (AST::LoopExpr &expr)
     569              : {
     570          373 :   visit_outer_attrs (expr);
     571          373 :   if (expr.has_loop_label ())
     572          114 :     visit (expr.get_loop_label ());
     573          373 :   reseat (expr.get_loop_block_ptr ());
     574          373 : }
     575              : 
     576              : void
     577          298 : PointerVisitor::visit (AST::WhileLoopExpr &expr)
     578              : {
     579          298 :   visit_outer_attrs (expr);
     580          298 :   if (expr.has_loop_label ())
     581            6 :     visit (expr.get_loop_label ());
     582          298 :   reseat (expr.get_predicate_expr_ptr ());
     583          298 :   reseat (expr.get_loop_block_ptr ());
     584          298 : }
     585              : 
     586              : void
     587            4 : PointerVisitor::visit (AST::WhileLetLoopExpr &expr)
     588              : {
     589            4 :   visit_outer_attrs (expr);
     590            4 :   reseat (expr.get_pattern ());
     591              : 
     592            4 :   if (expr.has_loop_label ())
     593            0 :     visit (expr.get_loop_label ());
     594              : 
     595            4 :   reseat (expr.get_scrutinee_expr_ptr ());
     596            4 :   reseat (expr.get_loop_block_ptr ());
     597            4 : }
     598              : 
     599              : void
     600           64 : PointerVisitor::visit (AST::ForLoopExpr &expr)
     601              : {
     602           64 :   visit_outer_attrs (expr);
     603           64 :   reseat (expr.get_pattern_ptr ());
     604           64 :   reseat (expr.get_iterator_expr_ptr ());
     605           64 :   if (expr.has_loop_label ())
     606            0 :     visit (expr.get_loop_label ());
     607           64 :   reseat (expr.get_loop_block_ptr ());
     608           64 : }
     609              : 
     610              : void
     611         1687 : PointerVisitor::visit (AST::IfExpr &expr)
     612              : {
     613         1687 :   visit_outer_attrs (expr);
     614         1687 :   reseat (expr.get_condition_expr_ptr ());
     615         1687 :   visit (expr.get_if_block ());
     616         1687 : }
     617              : 
     618              : void
     619         1207 : PointerVisitor::visit (AST::IfExprConseqElse &expr)
     620              : {
     621         1207 :   visit (reinterpret_cast<AST::IfExpr &> (expr));
     622         1207 :   visit (expr.get_else_block ());
     623         1207 : }
     624              : 
     625              : void
     626           30 : PointerVisitor::visit (AST::IfLetExpr &expr)
     627              : {
     628           30 :   visit_outer_attrs (expr);
     629           30 :   reseat (expr.get_pattern ());
     630           30 :   reseat (expr.get_value_expr_ptr ());
     631           30 :   visit (expr.get_if_block ());
     632           30 : }
     633              : 
     634              : void
     635           12 : PointerVisitor::visit (AST::IfLetExprConseqElse &expr)
     636              : {
     637           12 :   visit (reinterpret_cast<AST::IfLetExpr &> (expr));
     638           12 :   visit (expr.get_else_block ());
     639           12 : }
     640              : 
     641              : void
     642         8384 : PointerVisitor::visit (AST::MatchArm &arm)
     643              : {
     644         8384 :   visit_outer_attrs (arm);
     645         8384 :   reseat (arm.get_pattern ());
     646         8384 :   if (arm.has_match_arm_guard ())
     647            3 :     reseat (arm.get_guard_expr_ptr ());
     648         8384 : }
     649              : 
     650              : void
     651         8384 : PointerVisitor::visit (AST::MatchCase &arm)
     652              : {
     653         8384 :   visit (arm.get_arm ());
     654         8384 :   reseat (arm.get_expr_ptr ());
     655         8384 : }
     656              : 
     657              : void
     658         3609 : PointerVisitor::visit (AST::MatchExpr &expr)
     659              : {
     660         3609 :   visit_outer_attrs (expr);
     661         3609 :   visit_inner_attrs (expr);
     662         3609 :   reseat (expr.get_scrutinee_expr_ptr ());
     663        11993 :   for (auto &arm : expr.get_match_cases ())
     664         8384 :     visit (arm);
     665         3609 : }
     666              : 
     667              : void
     668            0 : PointerVisitor::visit (AST::AwaitExpr &expr)
     669              : {
     670            0 :   visit_outer_attrs (expr);
     671            0 :   reseat (expr.get_awaited_expr ());
     672            0 : }
     673              : 
     674              : void
     675            0 : PointerVisitor::visit (AST::AsyncBlockExpr &expr)
     676              : {
     677            0 :   visit_outer_attrs (expr);
     678            0 :   reseat (expr.get_block_expr ());
     679            0 : }
     680              : 
     681              : void
     682           54 : PointerVisitor::visit (AST::InlineAsm &expr)
     683              : {
     684           54 :   visit_outer_attrs (expr);
     685           54 :   using RegisterType = AST::InlineAsmOperand::RegisterType;
     686          112 :   for (auto &operand : expr.get_operands ())
     687              :     {
     688           58 :       switch (operand.get_register_type ())
     689              :         {
     690           20 :         case RegisterType::In:
     691           20 :           {
     692           20 :             reseat (operand.get_in ().expr);
     693           20 :             break;
     694              :           }
     695           34 :         case RegisterType::Out:
     696           34 :           {
     697           34 :             reseat (operand.get_out ().expr);
     698           34 :             break;
     699              :           }
     700            0 :         case RegisterType::InOut:
     701            0 :           {
     702            0 :             reseat (operand.get_in_out ().expr);
     703            0 :             break;
     704              :           }
     705            4 :         case RegisterType::SplitInOut:
     706            4 :           {
     707            4 :             auto split = operand.get_split_in_out ();
     708            4 :             reseat (split.in_expr);
     709            4 :             reseat (split.out_expr);
     710            4 :             break;
     711            4 :           }
     712            0 :         case RegisterType::Const:
     713            0 :           {
     714            0 :             reseat (operand.get_const ().anon_const.get_inner_expr_ptr ());
     715            0 :             break;
     716              :           }
     717            0 :         case RegisterType::Sym:
     718            0 :           {
     719            0 :             reseat (operand.get_sym ().expr);
     720            0 :             break;
     721              :           }
     722            0 :         case RegisterType::Label:
     723            0 :           {
     724            0 :             reseat (operand.get_label ().expr);
     725            0 :             break;
     726              :           }
     727              :         }
     728           54 :     }
     729           54 : }
     730              : 
     731              : void
     732            4 : PointerVisitor::visit (AST::LlvmInlineAsm &expr)
     733              : {
     734            4 :   for (auto &output : expr.get_outputs ())
     735            0 :     reseat (output.expr);
     736              : 
     737            8 :   for (auto &input : expr.get_inputs ())
     738            4 :     reseat (input.expr);
     739            4 : }
     740              : 
     741              : void
     742         8001 : PointerVisitor::visit (AST::TypeParam &param)
     743              : {
     744         8001 :   visit_outer_attrs (param);
     745              :   // FIXME: Can we do macro expansion here?
     746         8751 :   for (auto &bound : param.get_type_param_bounds ())
     747          750 :     visit (bound);
     748         8001 :   if (param.has_type ())
     749          354 :     reseat (param.get_type_ptr ());
     750         8001 : }
     751              : 
     752              : void
     753            2 : PointerVisitor::visit (AST::LifetimeWhereClauseItem &item)
     754              : {
     755            2 :   visit (item.get_lifetime ());
     756            4 :   for (auto &bound : item.get_lifetime_bounds ())
     757            2 :     visit (bound);
     758            2 : }
     759              : 
     760              : void
     761          296 : PointerVisitor::visit (AST::TypeBoundWhereClauseItem &item)
     762              : {
     763          305 :   for (auto &lifetime : item.get_for_lifetimes ())
     764            9 :     visit (lifetime);
     765          296 :   reseat (item.get_type_ptr ());
     766              :   // FIXME: Likewise?
     767          592 :   for (auto &param : item.get_type_param_bounds ())
     768          296 :     visit (param);
     769          296 : }
     770              : 
     771              : void
     772        46050 : PointerVisitor::visit (AST::Visibility &vis)
     773              : {
     774        46050 :   if (vis.has_path ())
     775           65 :     visit (vis.get_path ());
     776        46050 : }
     777              : 
     778              : void
     779          288 : PointerVisitor::visit (AST::WhereClause &where)
     780              : {
     781          586 :   for (auto &item : where.get_items ())
     782          298 :     visit (item);
     783          288 : }
     784              : 
     785              : void
     786        10733 : PointerVisitor::visit (AST::FunctionParam &param)
     787              : {
     788        10733 :   visit_outer_attrs (param);
     789        10733 :   if (param.has_name ())
     790        10733 :     reseat (param.get_pattern_ptr ());
     791              : 
     792        10733 :   reseat (param.get_type_ptr ());
     793        10733 : }
     794              : 
     795              : void
     796         8031 : PointerVisitor::visit (AST::SelfParam &param)
     797              : {
     798         8031 :   visit_outer_attrs (param);
     799              : 
     800         8031 :   if (param.has_lifetime ())
     801         4625 :     visit (param.get_lifetime ());
     802              : 
     803         8031 :   if (param.has_type ())
     804            1 :     reseat (param.get_type_ptr ());
     805         8031 : }
     806              : 
     807              : void
     808         1216 : PointerVisitor::visit (AST::Module &module)
     809              : {
     810         1216 :   visit_outer_attrs (module);
     811         1216 :   visit (module.get_visibility ());
     812         1216 :   visit_inner_attrs (module);
     813         5614 :   for (auto &item : module.get_items ())
     814         4398 :     reseat (item);
     815         1216 : }
     816              : 
     817              : void
     818           24 : PointerVisitor::visit (AST::ExternCrate &crate)
     819              : {
     820           24 :   visit_outer_attrs (crate);
     821           24 :   visit (crate.get_visibility ());
     822           24 : }
     823              : 
     824              : void
     825            8 : PointerVisitor::visit (AST::UseTreeGlob &use_tree)
     826              : {
     827            8 :   visit (use_tree.get_path ());
     828            8 : }
     829              : 
     830              : void
     831          150 : PointerVisitor::visit (AST::UseTreeList &use_tree)
     832              : {
     833          150 :   visit (use_tree.get_path ());
     834          150 : }
     835              : 
     836              : void
     837          497 : PointerVisitor::visit (AST::UseTreeRebind &use_tree)
     838              : {
     839          497 :   visit (use_tree.get_path ());
     840          497 : }
     841              : 
     842              : void
     843          655 : PointerVisitor::visit (AST::UseDeclaration &use_decl)
     844              : {
     845          655 :   visit (use_decl.get_visibility ());
     846          655 :   visit (use_decl.get_tree ());
     847          655 : }
     848              : 
     849              : void
     850        18131 : PointerVisitor::visit_function_params (AST::Function &function)
     851              : {
     852        37732 :   for (auto &param : function.get_function_params ())
     853        19601 :     visit (param);
     854        18131 : }
     855              : 
     856              : void
     857        18131 : PointerVisitor::visit (AST::Function &function)
     858              : {
     859        18131 :   visit_outer_attrs (function);
     860        18131 :   visit (function.get_visibility ());
     861        18131 :   visit (function.get_qualifiers ());
     862        19711 :   for (auto &generic : function.get_generic_params ())
     863         1580 :     visit (generic);
     864              : 
     865        18131 :   visit_function_params (function);
     866              : 
     867        18131 :   if (function.has_return_type ())
     868        12744 :     reseat (function.get_return_type_ptr ());
     869        18131 :   if (function.has_where_clause ())
     870          195 :     visit (function.get_where_clause ());
     871        18131 :   if (function.has_body ())
     872        14216 :     reseat (*function.get_definition ());
     873        18131 : }
     874              : 
     875              : void
     876         4469 : PointerVisitor::visit (AST::TypeAlias &type_alias)
     877              : {
     878         4469 :   visit_outer_attrs (type_alias);
     879         4469 :   visit (type_alias.get_visibility ());
     880         4523 :   for (auto &generic : type_alias.get_generic_params ())
     881           54 :     visit (generic);
     882         4469 :   if (type_alias.has_where_clause ())
     883            0 :     visit (type_alias.get_where_clause ());
     884         4469 :   reseat (type_alias.get_type_aliased_ptr ());
     885         4469 : }
     886              : 
     887              : void
     888         2285 : PointerVisitor::visit (AST::StructField &field)
     889              : {
     890         2285 :   visit_outer_attrs (field);
     891         2285 :   visit (field.get_visibility ());
     892         2285 :   reseat (field.get_field_type_ptr ());
     893         2285 : }
     894              : 
     895              : void
     896         1535 : PointerVisitor::visit (AST::StructStruct &struct_item)
     897              : {
     898         1535 :   visit_outer_attrs (struct_item);
     899         1535 :   visit (struct_item.get_visibility ());
     900         2046 :   for (auto &generic : struct_item.get_generic_params ())
     901          511 :     visit (generic);
     902         1535 :   if (struct_item.has_where_clause ())
     903            2 :     visit (struct_item.get_where_clause ());
     904         3367 :   for (auto &field : struct_item.get_fields ())
     905         1832 :     visit (field);
     906         1535 : }
     907              : 
     908              : void
     909         2089 : PointerVisitor::visit (AST::TupleField &field)
     910              : {
     911         2089 :   visit_outer_attrs (field);
     912         2089 :   visit (field.get_visibility ());
     913         2089 :   reseat (field.get_field_type_ptr ());
     914         2089 : }
     915              : 
     916              : void
     917          963 : PointerVisitor::visit (AST::TupleStruct &tuple_struct)
     918              : {
     919          963 :   visit_outer_attrs (tuple_struct);
     920          963 :   visit (tuple_struct.get_visibility ());
     921         1332 :   for (auto &generic : tuple_struct.get_generic_params ())
     922          369 :     visit (generic);
     923          963 :   if (tuple_struct.has_where_clause ())
     924            0 :     visit (tuple_struct.get_where_clause ());
     925         2591 :   for (auto &field : tuple_struct.get_fields ())
     926         1628 :     visit (field);
     927          963 : }
     928              : 
     929              : void
     930         1244 : PointerVisitor::visit (AST::EnumItem &item)
     931              : {
     932         1244 :   visit_outer_attrs (item);
     933         1244 :   visit (item.get_visibility ());
     934         1244 : }
     935              : 
     936              : void
     937          436 : PointerVisitor::visit (AST::EnumItemTuple &item)
     938              : {
     939          436 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     940          897 :   for (auto &field : item.get_tuple_fields ())
     941          461 :     visit (field);
     942          436 : }
     943              : 
     944              : void
     945           91 : PointerVisitor::visit (AST::EnumItemStruct &item)
     946              : {
     947           91 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     948          240 :   for (auto &field : item.get_struct_fields ())
     949          149 :     visit (field);
     950           91 : }
     951              : 
     952              : void
     953          273 : PointerVisitor::visit (AST::EnumItemDiscriminant &item)
     954              : {
     955          273 :   PointerVisitor::visit (static_cast<EnumItem &> (item));
     956          273 :   reseat (item.get_expr_ptr ());
     957          273 : }
     958              : 
     959              : void
     960         1827 : PointerVisitor::visit (AST::Enum &enum_item)
     961              : {
     962         1827 :   visit_outer_attrs (enum_item);
     963         1827 :   visit (enum_item.get_visibility ());
     964         2847 :   for (auto &generic : enum_item.get_generic_params ())
     965         1020 :     visit (generic);
     966         1827 :   if (enum_item.has_where_clause ())
     967            0 :     visit (enum_item.get_where_clause ());
     968         6094 :   for (auto &item : enum_item.get_variants ())
     969         4267 :     visit (item);
     970         1827 : }
     971              : 
     972              : void
     973          104 : PointerVisitor::visit (AST::Union &union_item)
     974              : {
     975          104 :   visit_outer_attrs (union_item);
     976          104 :   visit (union_item.get_visibility ());
     977          179 :   for (auto &generic : union_item.get_generic_params ())
     978           75 :     visit (generic);
     979          104 :   if (union_item.has_where_clause ())
     980            0 :     visit (union_item.get_where_clause ());
     981          408 :   for (auto &variant : union_item.get_variants ())
     982          304 :     visit (variant);
     983          104 : }
     984              : 
     985              : void
     986          571 : PointerVisitor::visit (AST::ConstantItem &const_item)
     987              : {
     988          571 :   visit_outer_attrs (const_item);
     989          571 :   visit (const_item.get_visibility ());
     990          571 :   reseat (const_item.get_type_ptr ());
     991          571 :   if (const_item.has_expr ())
     992          540 :     reseat (const_item.get_expr_ptr ());
     993          571 : }
     994              : 
     995              : void
     996           54 : PointerVisitor::visit (AST::StaticItem &static_item)
     997              : {
     998           54 :   visit_outer_attrs (static_item);
     999           54 :   visit (static_item.get_visibility ());
    1000           54 :   reseat (static_item.get_type_ptr ());
    1001           54 :   reseat (static_item.get_expr_ptr ());
    1002           54 : }
    1003              : 
    1004              : void
    1005         2573 : PointerVisitor::visit (AST::TraitItemType &item)
    1006              : {
    1007         2573 :   visit_outer_attrs (item);
    1008         2754 :   for (auto &bound : item.get_type_param_bounds ())
    1009          181 :     visit (bound);
    1010         2573 : }
    1011              : 
    1012              : void
    1013         3722 : PointerVisitor::visit (AST::Trait &trait)
    1014              : {
    1015         3722 :   visit_outer_attrs (trait);
    1016         3722 :   visit (trait.get_visibility ());
    1017              : 
    1018         3722 :   visit_inner_attrs (trait);
    1019              : 
    1020         3722 :   visit (trait.get_implicit_self ());
    1021              : 
    1022         4381 :   for (auto &generic : trait.get_generic_params ())
    1023          659 :     visit (generic);
    1024              : 
    1025         3722 :   if (trait.has_where_clause ())
    1026            7 :     visit (trait.get_where_clause ());
    1027              : 
    1028         4331 :   for (auto &bound : trait.get_type_param_bounds ())
    1029          609 :     visit (bound);
    1030              : 
    1031         7058 :   for (auto &item : trait.get_trait_items ())
    1032         3336 :     reseat (item);
    1033         3722 : }
    1034              : 
    1035              : void
    1036          955 : PointerVisitor::visit (AST::InherentImpl &impl)
    1037              : {
    1038          955 :   visit_outer_attrs (impl);
    1039          955 :   visit (impl.get_visibility ());
    1040              : 
    1041         1276 :   for (auto &generic : impl.get_generic_params ())
    1042          321 :     visit (generic);
    1043          955 :   if (impl.has_where_clause ())
    1044            1 :     visit (impl.get_where_clause ());
    1045          955 :   reseat (impl.get_type_ptr ());
    1046          955 :   visit_inner_attrs (impl);
    1047         3696 :   for (auto &item : impl.get_impl_items ())
    1048         2741 :     reseat (item);
    1049          955 : }
    1050              : 
    1051              : void
    1052         4736 : PointerVisitor::visit (AST::TraitImpl &impl)
    1053              : {
    1054         4736 :   visit_outer_attrs (impl);
    1055         4736 :   visit (impl.get_visibility ());
    1056              : 
    1057         5556 :   for (auto &generic : impl.get_generic_params ())
    1058          820 :     visit (generic);
    1059         4736 :   if (impl.has_where_clause ())
    1060           83 :     visit (impl.get_where_clause ());
    1061         4736 :   reseat (impl.get_type_ptr ());
    1062         4736 :   visit (impl.get_trait_path ());
    1063         4736 :   visit_inner_attrs (impl);
    1064        10224 :   for (auto &item : impl.get_impl_items ())
    1065         5488 :     reseat (item);
    1066         4736 : }
    1067              : 
    1068              : void
    1069            1 : PointerVisitor::visit (AST::ExternalTypeItem &item)
    1070              : {
    1071            1 :   visit_outer_attrs (item);
    1072            1 :   visit (item.get_visibility ());
    1073            1 : }
    1074              : 
    1075              : void
    1076            1 : PointerVisitor::visit (AST::ExternalStaticItem &item)
    1077              : {
    1078            1 :   visit_outer_attrs (item);
    1079            1 :   visit (item.get_visibility ());
    1080            1 :   reseat (item.get_type_ptr ());
    1081            1 : }
    1082              : 
    1083              : void
    1084         1468 : PointerVisitor::visit (AST::ExternBlock &block)
    1085              : {
    1086         1468 :   visit_outer_attrs (block);
    1087         1468 :   visit (block.get_visibility ());
    1088         1468 :   visit_inner_attrs (block);
    1089         3682 :   for (auto &item : block.get_extern_items ())
    1090         2214 :     reseat (item);
    1091         1468 : }
    1092              : 
    1093              : void
    1094          924 : PointerVisitor::visit (AST::MacroMatchFragment &match)
    1095          924 : {}
    1096              : 
    1097              : void
    1098          493 : PointerVisitor::visit (AST::MacroMatchRepetition &match)
    1099              : {
    1100         1122 :   for (auto &m : match.get_matches ())
    1101          629 :     visit (m);
    1102          493 : }
    1103              : 
    1104              : void
    1105         1113 : PointerVisitor::visit (AST::MacroMatcher &matcher)
    1106              : {
    1107         2460 :   for (auto &m : matcher.get_matches ())
    1108         1347 :     visit (m);
    1109         1113 : }
    1110              : 
    1111              : void
    1112         1050 : PointerVisitor::visit (AST::MacroTranscriber &transcriber)
    1113              : {
    1114         1050 :   visit (transcriber.get_token_tree ());
    1115         1050 : }
    1116              : 
    1117              : void
    1118         1050 : PointerVisitor::visit (AST::MacroRule &rule)
    1119              : {
    1120         1050 :   visit (rule.get_matcher ());
    1121         1050 :   visit (rule.get_transcriber ());
    1122         1050 : }
    1123              : 
    1124              : void
    1125          913 : PointerVisitor::visit (AST::MacroRulesDefinition &rules_def)
    1126              : {
    1127          913 :   visit_outer_attrs (rules_def);
    1128         1963 :   for (auto &rule : rules_def.get_macro_rules ())
    1129         1050 :     visit (rule);
    1130          913 : }
    1131              : 
    1132              : void
    1133            0 : PointerVisitor::visit (AST::MacroInvocData &data)
    1134              : {
    1135            0 :   visit (data.get_path ());
    1136            0 :   visit (data.get_delim_tok_tree ());
    1137            0 : }
    1138              : 
    1139              : void
    1140            0 : PointerVisitor::visit (AST::MacroInvocation &macro_invoc)
    1141              : {
    1142            0 :   visit_outer_attrs (macro_invoc);
    1143            0 :   visit (macro_invoc.get_invoc_data ());
    1144            0 : }
    1145              : 
    1146              : void
    1147            0 : PointerVisitor::visit (AST::MetaItemPath &meta_item)
    1148              : {
    1149            0 :   visit (meta_item.get_path ());
    1150            0 : }
    1151              : 
    1152              : void
    1153            0 : PointerVisitor::visit (AST::MetaItemSeq &meta_item)
    1154              : {
    1155            0 :   visit (meta_item.get_path ());
    1156            0 :   for (auto &inner : meta_item.get_seq ())
    1157            0 :     visit (inner);
    1158            0 : }
    1159              : 
    1160              : void
    1161            0 : PointerVisitor::visit (AST::MetaListPaths &meta_item)
    1162              : {
    1163            0 :   for (auto &path : meta_item.get_paths ())
    1164            0 :     visit (path);
    1165            0 : }
    1166              : 
    1167              : void
    1168            0 : PointerVisitor::visit (AST::MetaListNameValueStr &meta_item)
    1169              : {
    1170            0 :   for (auto &str : meta_item.get_values ())
    1171            0 :     visit (str);
    1172            0 : }
    1173              : 
    1174              : void
    1175        80959 : PointerVisitor::visit (AST::IdentifierPattern &pattern)
    1176              : {
    1177        80959 :   if (pattern.has_subpattern ())
    1178           54 :     reseat (pattern.get_subpattern_ptr ());
    1179        80959 : }
    1180              : 
    1181              : void
    1182           63 : PointerVisitor::visit (AST::RangePatternBoundPath &bound)
    1183              : {
    1184           63 :   visit (bound.get_path ());
    1185           63 : }
    1186              : 
    1187              : void
    1188            0 : PointerVisitor::visit (AST::RangePatternBoundQualPath &bound)
    1189              : {
    1190            0 :   visit (bound.get_qualified_path ());
    1191            0 : }
    1192              : 
    1193              : void
    1194          163 : PointerVisitor::visit (AST::RangePattern &pattern)
    1195              : {
    1196              :   // FIXME: So should this be reseat() instead? Can we have macro invocations as
    1197              :   // patterns in range patterns?
    1198          163 :   if (pattern.get_has_lower_bound ())
    1199          163 :     visit (pattern.get_lower_bound ());
    1200          163 :   if (pattern.get_has_upper_bound ())
    1201          163 :     visit (pattern.get_upper_bound ());
    1202          163 : }
    1203              : 
    1204              : void
    1205          736 : PointerVisitor::visit (AST::ReferencePattern &pattern)
    1206              : {
    1207          736 :   reseat (pattern.get_referenced_pattern_ptr ());
    1208          736 : }
    1209              : 
    1210              : void
    1211           72 : PointerVisitor::visit (AST::StructPatternFieldTuplePat &field)
    1212              : {
    1213           72 :   visit_outer_attrs (field);
    1214           72 :   reseat (field.get_index_pattern_ptr ());
    1215           72 : }
    1216              : 
    1217              : void
    1218          545 : PointerVisitor::visit (AST::StructPatternFieldIdentPat &field)
    1219              : {
    1220          545 :   visit_outer_attrs (field);
    1221          545 :   reseat (field.get_ident_pattern_ptr ());
    1222          545 : }
    1223              : 
    1224              : void
    1225          100 : PointerVisitor::visit (AST::StructPatternFieldIdent &field)
    1226              : {
    1227          100 :   visit_outer_attrs (field);
    1228          100 : }
    1229              : 
    1230              : void
    1231          558 : PointerVisitor::visit (AST::StructPatternElements &spe)
    1232              : {
    1233         1494 :   for (auto &field : spe.get_struct_pattern_fields ())
    1234          936 :     visit (field);
    1235          558 :   for (auto &attribute : spe.get_etc_outer_attrs ())
    1236              :     visit (attribute);
    1237          558 : }
    1238              : 
    1239              : void
    1240          558 : PointerVisitor::visit (AST::StructPattern &pattern)
    1241              : {
    1242          558 :   visit (pattern.get_path ());
    1243          558 :   visit (pattern.get_struct_pattern_elems ());
    1244          558 : }
    1245              : 
    1246              : void
    1247         1052 : PointerVisitor::visit (AST::TupleStructItemsNoRest &tuple_items)
    1248              : {
    1249         2224 :   for (auto &pattern : tuple_items.get_patterns ())
    1250         1172 :     reseat (pattern);
    1251         1052 : }
    1252              : 
    1253              : void
    1254           39 : PointerVisitor::visit (AST::TupleStructItemsHasRest &tuple_items)
    1255              : {
    1256           70 :   for (auto &lower : tuple_items.get_lower_patterns ())
    1257           31 :     reseat (lower);
    1258           58 :   for (auto &upper : tuple_items.get_upper_patterns ())
    1259           19 :     reseat (upper);
    1260           39 : }
    1261              : 
    1262              : void
    1263         3725 : PointerVisitor::visit (AST::TupleStructPattern &pattern)
    1264              : {
    1265         3725 :   visit (pattern.get_path ());
    1266         3725 :   visit (pattern.get_items ());
    1267         3725 : }
    1268              : 
    1269              : void
    1270          427 : PointerVisitor::visit (AST::TuplePatternItemsNoRest &tuple_items)
    1271              : {
    1272         1301 :   for (auto &pattern : tuple_items.get_patterns ())
    1273          874 :     reseat (pattern);
    1274          427 : }
    1275              : 
    1276              : void
    1277           27 : PointerVisitor::visit (AST::TuplePatternItemsHasRest &tuple_items)
    1278              : {
    1279           55 :   for (auto &lower : tuple_items.get_lower_patterns ())
    1280           28 :     reseat (lower);
    1281           59 :   for (auto &upper : tuple_items.get_upper_patterns ())
    1282           32 :     reseat (upper);
    1283           27 : }
    1284              : 
    1285              : void
    1286         1680 : PointerVisitor::visit (AST::TuplePattern &pattern)
    1287              : {
    1288         1680 :   visit (pattern.get_items ());
    1289         1680 : }
    1290              : 
    1291              : void
    1292           44 : PointerVisitor::visit (AST::GroupedPattern &pattern)
    1293              : {
    1294           44 :   reseat (pattern.get_pattern_in_parens_ptr ());
    1295           44 : }
    1296              : 
    1297              : void
    1298           32 : PointerVisitor::visit (AST::SlicePatternItemsNoRest &items)
    1299              : {
    1300           96 :   for (auto &item : items.get_patterns ())
    1301           64 :     reseat (item);
    1302           32 : }
    1303              : 
    1304              : void
    1305           44 : PointerVisitor::visit (AST::SlicePatternItemsHasRest &items)
    1306              : {
    1307           87 :   for (auto &item : items.get_lower_patterns ())
    1308           43 :     reseat (item);
    1309           87 :   for (auto &item : items.get_upper_patterns ())
    1310           43 :     reseat (item);
    1311           44 : }
    1312              : 
    1313              : void
    1314          228 : PointerVisitor::visit (AST::SlicePattern &pattern)
    1315              : {
    1316          228 :   visit (pattern.get_items ());
    1317          228 : }
    1318              : 
    1319              : void
    1320          191 : PointerVisitor::visit (AST::AltPattern &pattern)
    1321              : {
    1322          591 :   for (auto &alt : pattern.get_alts ())
    1323          400 :     reseat (alt);
    1324          191 : }
    1325              : 
    1326              : void
    1327          208 : PointerVisitor::visit (AST::EmptyStmt &stmt)
    1328          208 : {}
    1329              : 
    1330              : void
    1331        12686 : PointerVisitor::visit (AST::LetStmt &stmt)
    1332              : {
    1333        12686 :   visit_outer_attrs (stmt);
    1334        12686 :   reseat (stmt.get_pattern_ptr ());
    1335        12686 :   if (stmt.has_type ())
    1336         2096 :     reseat (stmt.get_type_ptr ());
    1337        12686 :   if (stmt.has_init_expr ())
    1338        11540 :     reseat (stmt.get_init_expr_ptr ());
    1339        12686 : }
    1340              : 
    1341              : void
    1342         9305 : PointerVisitor::visit (AST::ExprStmt &stmt)
    1343              : {
    1344         9305 :   reseat (stmt.get_expr_ptr ());
    1345         9305 : }
    1346              : 
    1347              : void
    1348         7187 : PointerVisitor::visit (AST::TraitBound &bound)
    1349              : {
    1350         7229 :   for (auto &lifetime : bound.get_for_lifetimes ())
    1351           42 :     visit (lifetime);
    1352         7187 :   visit (bound.get_type_path ());
    1353         7187 : }
    1354              : 
    1355              : void
    1356            0 : PointerVisitor::visit (AST::ImplTraitType &type)
    1357              : {
    1358            0 :   for (auto &bound : type.get_type_param_bounds ())
    1359            0 :     visit (bound);
    1360            0 : }
    1361              : 
    1362              : void
    1363           39 : PointerVisitor::visit (AST::TraitObjectType &type)
    1364              : {
    1365          138 :   for (auto &bound : type.get_type_param_bounds ())
    1366           99 :     visit (bound);
    1367           39 : }
    1368              : 
    1369              : void
    1370           23 : PointerVisitor::visit (AST::ParenthesisedType &type)
    1371              : {
    1372           23 :   reseat (type.get_type_in_parens ());
    1373           23 : }
    1374              : 
    1375              : void
    1376          393 : PointerVisitor::visit (AST::ImplTraitTypeOneBound &type)
    1377              : {
    1378              :   // FIXME: Do we need to reseat here?
    1379          393 :   visit (type.get_trait_bound ());
    1380          393 : }
    1381              : 
    1382              : void
    1383          468 : PointerVisitor::visit (AST::TraitObjectTypeOneBound &type)
    1384              : {
    1385              :   // FIXME: Do we need to reseat here?
    1386          468 :   visit (type.get_trait_bound ());
    1387          468 : }
    1388              : 
    1389              : void
    1390         1409 : PointerVisitor::visit (AST::TupleType &type)
    1391              : {
    1392         3640 :   for (auto &elem : type.get_elems ())
    1393         2231 :     reseat (elem);
    1394         1409 : }
    1395              : 
    1396              : void
    1397          190 : PointerVisitor::visit (AST::NeverType &type)
    1398          190 : {}
    1399              : 
    1400              : void
    1401        21298 : PointerVisitor::visit (AST::RawPointerType &type)
    1402              : {
    1403        21298 :   reseat (type.get_type_pointed_to_ptr ());
    1404        21298 : }
    1405              : 
    1406              : void
    1407        15216 : PointerVisitor::visit (AST::ReferenceType &type)
    1408              : {
    1409        15216 :   visit (type.get_lifetime ());
    1410        15216 :   reseat (type.get_type_ptr ());
    1411        15216 : }
    1412              : 
    1413              : void
    1414         2240 : PointerVisitor::visit (AST::ArrayType &type)
    1415              : {
    1416         2240 :   reseat (type.get_elem_type_ptr ());
    1417         2240 :   visit (type.get_size_expr ());
    1418         2240 : }
    1419              : 
    1420              : void
    1421         2593 : PointerVisitor::visit (AST::SliceType &type)
    1422              : {
    1423         2593 :   reseat (type.get_elem_type_ptr ());
    1424         2593 : }
    1425              : 
    1426              : void
    1427          726 : PointerVisitor::visit (AST::InferredType &type)
    1428          726 : {}
    1429              : 
    1430              : void
    1431           48 : PointerVisitor::visit (AST::MaybeNamedParam &param)
    1432              : {
    1433           48 :   visit_outer_attrs (param);
    1434           48 :   reseat (param.get_type_ptr ());
    1435           48 : }
    1436              : 
    1437              : void
    1438           63 : PointerVisitor::visit (AST::BareFunctionType &type)
    1439              : {
    1440           66 :   for (auto &lifetime : type.get_for_lifetimes ())
    1441            3 :     visit (lifetime);
    1442           63 :   visit (type.get_function_qualifiers ());
    1443          111 :   for (auto &param : type.get_function_params ())
    1444           48 :     visit (param);
    1445           63 :   if (type.is_variadic ())
    1446            0 :     for (auto attr : type.get_variadic_attr ())
    1447            0 :       visit (attr);
    1448           63 :   if (type.has_return_type ())
    1449           48 :     reseat (type.get_return_type_ptr ());
    1450           63 : }
    1451              : 
    1452              : void
    1453            0 : PointerVisitor::visit (AST::FormatArgs &)
    1454              : {
    1455              :   // FIXME: Do we have anything to do? any subnodes to visit? Probably, right?
    1456            0 : }
    1457              : 
    1458              : void
    1459           30 : PointerVisitor::visit (AST::OffsetOf &offset_of)
    1460              : {
    1461           30 :   reseat (offset_of.get_type_ptr ());
    1462           30 : }
    1463              : 
    1464              : void
    1465          837 : PointerVisitor::visit (AST::VariadicParam &param)
    1466              : {
    1467          837 :   if (param.has_pattern ())
    1468           11 :     reseat (param.get_pattern_ptr ());
    1469          837 : }
    1470              : 
    1471              : } // namespace AST
    1472              : } // 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.