(root)/
gcc-13.2.0/
gcc/
rust/
hir/
tree/
rust-hir-visitor.h
       1  // Copyright (C) 2020-2023 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  #ifndef RUST_HIR_VISITOR_H
      20  #define RUST_HIR_VISITOR_H
      21  
      22  #include "rust-hir-full-decls.h"
      23  
      24  namespace Rust {
      25  namespace HIR {
      26  
      27  class HIRFullVisitor
      28  {
      29  public:
      30    virtual void visit (Lifetime &lifetime) = 0;
      31    virtual void visit (LifetimeParam &lifetime_param) = 0;
      32    virtual void visit (PathInExpression &path) = 0;
      33    virtual void visit (TypePathSegment &segment) = 0;
      34    virtual void visit (TypePathSegmentGeneric &segment) = 0;
      35    virtual void visit (TypePathSegmentFunction &segment) = 0;
      36    virtual void visit (TypePath &path) = 0;
      37    virtual void visit (QualifiedPathInExpression &path) = 0;
      38    virtual void visit (QualifiedPathInType &path) = 0;
      39    virtual void visit (LiteralExpr &expr) = 0;
      40    virtual void visit (BorrowExpr &expr) = 0;
      41    virtual void visit (DereferenceExpr &expr) = 0;
      42    virtual void visit (ErrorPropagationExpr &expr) = 0;
      43    virtual void visit (NegationExpr &expr) = 0;
      44    virtual void visit (ArithmeticOrLogicalExpr &expr) = 0;
      45    virtual void visit (ComparisonExpr &expr) = 0;
      46    virtual void visit (LazyBooleanExpr &expr) = 0;
      47    virtual void visit (TypeCastExpr &expr) = 0;
      48    virtual void visit (AssignmentExpr &expr) = 0;
      49    virtual void visit (CompoundAssignmentExpr &expr) = 0;
      50    virtual void visit (GroupedExpr &expr) = 0;
      51    virtual void visit (ArrayElemsValues &elems) = 0;
      52    virtual void visit (ArrayElemsCopied &elems) = 0;
      53    virtual void visit (ArrayExpr &expr) = 0;
      54    virtual void visit (ArrayIndexExpr &expr) = 0;
      55    virtual void visit (TupleExpr &expr) = 0;
      56    virtual void visit (TupleIndexExpr &expr) = 0;
      57    virtual void visit (StructExprStruct &expr) = 0;
      58    virtual void visit (StructExprFieldIdentifier &field) = 0;
      59    virtual void visit (StructExprFieldIdentifierValue &field) = 0;
      60    virtual void visit (StructExprFieldIndexValue &field) = 0;
      61    virtual void visit (StructExprStructFields &expr) = 0;
      62    virtual void visit (StructExprStructBase &expr) = 0;
      63    virtual void visit (CallExpr &expr) = 0;
      64    virtual void visit (MethodCallExpr &expr) = 0;
      65    virtual void visit (FieldAccessExpr &expr) = 0;
      66    virtual void visit (BlockExpr &expr) = 0;
      67    virtual void visit (ClosureExpr &expr) = 0;
      68    virtual void visit (ContinueExpr &expr) = 0;
      69    virtual void visit (BreakExpr &expr) = 0;
      70    virtual void visit (RangeFromToExpr &expr) = 0;
      71    virtual void visit (RangeFromExpr &expr) = 0;
      72    virtual void visit (RangeToExpr &expr) = 0;
      73    virtual void visit (RangeFullExpr &expr) = 0;
      74    virtual void visit (RangeFromToInclExpr &expr) = 0;
      75    virtual void visit (RangeToInclExpr &expr) = 0;
      76    virtual void visit (ReturnExpr &expr) = 0;
      77    virtual void visit (UnsafeBlockExpr &expr) = 0;
      78    virtual void visit (LoopExpr &expr) = 0;
      79    virtual void visit (WhileLoopExpr &expr) = 0;
      80    virtual void visit (WhileLetLoopExpr &expr) = 0;
      81    virtual void visit (ForLoopExpr &expr) = 0;
      82    virtual void visit (IfExpr &expr) = 0;
      83    virtual void visit (IfExprConseqElse &expr) = 0;
      84    virtual void visit (IfExprConseqIf &expr) = 0;
      85    virtual void visit (IfExprConseqIfLet &expr) = 0;
      86    virtual void visit (IfLetExpr &expr) = 0;
      87    virtual void visit (IfLetExprConseqElse &expr) = 0;
      88    virtual void visit (IfLetExprConseqIf &expr) = 0;
      89    virtual void visit (IfLetExprConseqIfLet &expr) = 0;
      90    virtual void visit (MatchExpr &expr) = 0;
      91    virtual void visit (AwaitExpr &expr) = 0;
      92    virtual void visit (AsyncBlockExpr &expr) = 0;
      93    virtual void visit (TypeParam &param) = 0;
      94    virtual void visit (ConstGenericParam &param) = 0;
      95    virtual void visit (LifetimeWhereClauseItem &item) = 0;
      96    virtual void visit (TypeBoundWhereClauseItem &item) = 0;
      97    virtual void visit (Module &module) = 0;
      98    virtual void visit (ExternCrate &crate) = 0;
      99    virtual void visit (UseTreeGlob &use_tree) = 0;
     100    virtual void visit (UseTreeList &use_tree) = 0;
     101    virtual void visit (UseTreeRebind &use_tree) = 0;
     102    virtual void visit (UseDeclaration &use_decl) = 0;
     103    virtual void visit (Function &function) = 0;
     104    virtual void visit (TypeAlias &type_alias) = 0;
     105    virtual void visit (StructStruct &struct_item) = 0;
     106    virtual void visit (TupleStruct &tuple_struct) = 0;
     107    virtual void visit (EnumItem &item) = 0;
     108    virtual void visit (EnumItemTuple &item) = 0;
     109    virtual void visit (EnumItemStruct &item) = 0;
     110    virtual void visit (EnumItemDiscriminant &item) = 0;
     111    virtual void visit (Enum &enum_item) = 0;
     112    virtual void visit (Union &union_item) = 0;
     113    virtual void visit (ConstantItem &const_item) = 0;
     114    virtual void visit (StaticItem &static_item) = 0;
     115    virtual void visit (TraitItemFunc &item) = 0;
     116    virtual void visit (TraitItemConst &item) = 0;
     117    virtual void visit (TraitItemType &item) = 0;
     118    virtual void visit (Trait &trait) = 0;
     119    virtual void visit (ImplBlock &impl) = 0;
     120    virtual void visit (ExternalStaticItem &item) = 0;
     121    virtual void visit (ExternalFunctionItem &item) = 0;
     122    virtual void visit (ExternBlock &block) = 0;
     123    virtual void visit (LiteralPattern &pattern) = 0;
     124    virtual void visit (IdentifierPattern &pattern) = 0;
     125    virtual void visit (WildcardPattern &pattern) = 0;
     126    virtual void visit (RangePatternBoundLiteral &bound) = 0;
     127    virtual void visit (RangePatternBoundPath &bound) = 0;
     128    virtual void visit (RangePatternBoundQualPath &bound) = 0;
     129    virtual void visit (RangePattern &pattern) = 0;
     130    virtual void visit (ReferencePattern &pattern) = 0;
     131    virtual void visit (StructPatternFieldTuplePat &field) = 0;
     132    virtual void visit (StructPatternFieldIdentPat &field) = 0;
     133    virtual void visit (StructPatternFieldIdent &field) = 0;
     134    virtual void visit (StructPattern &pattern) = 0;
     135    virtual void visit (TupleStructItemsNoRange &tuple_items) = 0;
     136    virtual void visit (TupleStructItemsRange &tuple_items) = 0;
     137    virtual void visit (TupleStructPattern &pattern) = 0;
     138    virtual void visit (TuplePatternItemsMultiple &tuple_items) = 0;
     139    virtual void visit (TuplePatternItemsRanged &tuple_items) = 0;
     140    virtual void visit (TuplePattern &pattern) = 0;
     141    virtual void visit (SlicePattern &pattern) = 0;
     142    virtual void visit (EmptyStmt &stmt) = 0;
     143    virtual void visit (LetStmt &stmt) = 0;
     144    virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
     145    virtual void visit (ExprStmtWithBlock &stmt) = 0;
     146    virtual void visit (TraitBound &bound) = 0;
     147    virtual void visit (ImplTraitType &type) = 0;
     148    virtual void visit (TraitObjectType &type) = 0;
     149    virtual void visit (ParenthesisedType &type) = 0;
     150    virtual void visit (ImplTraitTypeOneBound &type) = 0;
     151    virtual void visit (TupleType &type) = 0;
     152    virtual void visit (NeverType &type) = 0;
     153    virtual void visit (RawPointerType &type) = 0;
     154    virtual void visit (ReferenceType &type) = 0;
     155    virtual void visit (ArrayType &type) = 0;
     156    virtual void visit (SliceType &type) = 0;
     157    virtual void visit (InferredType &type) = 0;
     158    virtual void visit (BareFunctionType &type) = 0;
     159  };
     160  
     161  class HIRFullVisitorBase : public HIRFullVisitor
     162  {
     163  public:
     164    virtual ~HIRFullVisitorBase () {}
     165  
     166    virtual void visit (Lifetime &) override {}
     167    virtual void visit (LifetimeParam &) override {}
     168    virtual void visit (PathInExpression &) override {}
     169    virtual void visit (TypePathSegment &) override {}
     170    virtual void visit (TypePathSegmentGeneric &) override {}
     171    virtual void visit (TypePathSegmentFunction &) override {}
     172    virtual void visit (TypePath &) override {}
     173    virtual void visit (QualifiedPathInExpression &) override {}
     174    virtual void visit (QualifiedPathInType &) override {}
     175  
     176    virtual void visit (LiteralExpr &) override {}
     177    virtual void visit (BorrowExpr &) override {}
     178    virtual void visit (DereferenceExpr &) override {}
     179    virtual void visit (ErrorPropagationExpr &) override {}
     180    virtual void visit (NegationExpr &) override {}
     181    virtual void visit (ArithmeticOrLogicalExpr &) override {}
     182    virtual void visit (ComparisonExpr &) override {}
     183    virtual void visit (LazyBooleanExpr &) override {}
     184    virtual void visit (TypeCastExpr &) override {}
     185    virtual void visit (AssignmentExpr &) override {}
     186    virtual void visit (CompoundAssignmentExpr &) override {}
     187    virtual void visit (GroupedExpr &) override {}
     188  
     189    virtual void visit (ArrayElemsValues &) override {}
     190    virtual void visit (ArrayElemsCopied &) override {}
     191    virtual void visit (ArrayExpr &) override {}
     192    virtual void visit (ArrayIndexExpr &) override {}
     193    virtual void visit (TupleExpr &) override {}
     194    virtual void visit (TupleIndexExpr &) override {}
     195    virtual void visit (StructExprStruct &) override {}
     196  
     197    virtual void visit (StructExprFieldIdentifier &) override {}
     198    virtual void visit (StructExprFieldIdentifierValue &) override {}
     199  
     200    virtual void visit (StructExprFieldIndexValue &) override {}
     201    virtual void visit (StructExprStructFields &) override {}
     202    virtual void visit (StructExprStructBase &) override {}
     203  
     204    virtual void visit (CallExpr &) override {}
     205    virtual void visit (MethodCallExpr &) override {}
     206    virtual void visit (FieldAccessExpr &) override {}
     207    virtual void visit (ClosureExpr &) override {}
     208    virtual void visit (BlockExpr &) override {}
     209    virtual void visit (ContinueExpr &) override {}
     210    virtual void visit (BreakExpr &) override {}
     211    virtual void visit (RangeFromToExpr &) override {}
     212    virtual void visit (RangeFromExpr &) override {}
     213    virtual void visit (RangeToExpr &) override {}
     214    virtual void visit (RangeFullExpr &) override {}
     215    virtual void visit (RangeFromToInclExpr &) override {}
     216    virtual void visit (RangeToInclExpr &) override {}
     217    virtual void visit (ReturnExpr &) override {}
     218    virtual void visit (UnsafeBlockExpr &) override {}
     219    virtual void visit (LoopExpr &) override {}
     220    virtual void visit (WhileLoopExpr &) override {}
     221    virtual void visit (WhileLetLoopExpr &) override {}
     222    virtual void visit (ForLoopExpr &) override {}
     223    virtual void visit (IfExpr &) override {}
     224    virtual void visit (IfExprConseqElse &) override {}
     225    virtual void visit (IfExprConseqIf &) override {}
     226    virtual void visit (IfExprConseqIfLet &) override {}
     227    virtual void visit (IfLetExpr &) override {}
     228    virtual void visit (IfLetExprConseqElse &) override {}
     229    virtual void visit (IfLetExprConseqIf &) override {}
     230    virtual void visit (IfLetExprConseqIfLet &) override {}
     231  
     232    virtual void visit (MatchExpr &) override {}
     233    virtual void visit (AwaitExpr &) override {}
     234    virtual void visit (AsyncBlockExpr &) override {}
     235  
     236    virtual void visit (TypeParam &) override {}
     237    virtual void visit (ConstGenericParam &) override {}
     238  
     239    virtual void visit (LifetimeWhereClauseItem &) override {}
     240    virtual void visit (TypeBoundWhereClauseItem &) override {}
     241    virtual void visit (Module &) override {}
     242    virtual void visit (ExternCrate &) override {}
     243  
     244    virtual void visit (UseTreeGlob &) override {}
     245    virtual void visit (UseTreeList &) override {}
     246    virtual void visit (UseTreeRebind &) override {}
     247    virtual void visit (UseDeclaration &) override {}
     248    virtual void visit (Function &) override {}
     249    virtual void visit (TypeAlias &) override {}
     250    virtual void visit (StructStruct &) override {}
     251    virtual void visit (TupleStruct &) override {}
     252    virtual void visit (EnumItem &) override {}
     253    virtual void visit (EnumItemTuple &) override {}
     254    virtual void visit (EnumItemStruct &) override {}
     255    virtual void visit (EnumItemDiscriminant &) override {}
     256    virtual void visit (Enum &) override {}
     257    virtual void visit (Union &) override {}
     258    virtual void visit (ConstantItem &) override {}
     259    virtual void visit (StaticItem &) override {}
     260    virtual void visit (TraitItemFunc &) override {}
     261    virtual void visit (TraitItemConst &) override {}
     262    virtual void visit (TraitItemType &) override {}
     263    virtual void visit (Trait &) override {}
     264    virtual void visit (ImplBlock &) override {}
     265  
     266    virtual void visit (ExternalStaticItem &) override {}
     267    virtual void visit (ExternalFunctionItem &) override {}
     268    virtual void visit (ExternBlock &) override {}
     269  
     270    virtual void visit (LiteralPattern &) override {}
     271    virtual void visit (IdentifierPattern &) override {}
     272    virtual void visit (WildcardPattern &) override {}
     273  
     274    virtual void visit (RangePatternBoundLiteral &) override {}
     275    virtual void visit (RangePatternBoundPath &) override {}
     276    virtual void visit (RangePatternBoundQualPath &) override {}
     277    virtual void visit (RangePattern &) override {}
     278    virtual void visit (ReferencePattern &) override {}
     279  
     280    virtual void visit (StructPatternFieldTuplePat &) override {}
     281    virtual void visit (StructPatternFieldIdentPat &) override {}
     282    virtual void visit (StructPatternFieldIdent &) override {}
     283    virtual void visit (StructPattern &) override {}
     284  
     285    virtual void visit (TupleStructItemsNoRange &) override {}
     286    virtual void visit (TupleStructItemsRange &) override {}
     287    virtual void visit (TupleStructPattern &) override {}
     288  
     289    virtual void visit (TuplePatternItemsMultiple &) override {}
     290    virtual void visit (TuplePatternItemsRanged &) override {}
     291    virtual void visit (TuplePattern &) override {}
     292    virtual void visit (SlicePattern &) override {}
     293  
     294    virtual void visit (EmptyStmt &) override {}
     295    virtual void visit (LetStmt &) override {}
     296    virtual void visit (ExprStmtWithoutBlock &) override {}
     297    virtual void visit (ExprStmtWithBlock &) override {}
     298  
     299    virtual void visit (TraitBound &) override {}
     300    virtual void visit (ImplTraitType &) override {}
     301    virtual void visit (TraitObjectType &) override {}
     302    virtual void visit (ParenthesisedType &) override {}
     303    virtual void visit (ImplTraitTypeOneBound &) override {}
     304    virtual void visit (TupleType &) override {}
     305    virtual void visit (NeverType &) override {}
     306    virtual void visit (RawPointerType &) override {}
     307    virtual void visit (ReferenceType &) override {}
     308    virtual void visit (ArrayType &) override {}
     309    virtual void visit (SliceType &) override {}
     310    virtual void visit (InferredType &) override {}
     311    virtual void visit (BareFunctionType &) override {}
     312  };
     313  
     314  class HIRExternalItemVisitor
     315  {
     316  public:
     317    virtual void visit (ExternalStaticItem &item) = 0;
     318    virtual void visit (ExternalFunctionItem &item) = 0;
     319  };
     320  
     321  class HIRTraitItemVisitor
     322  {
     323  public:
     324    virtual void visit (TraitItemFunc &item) = 0;
     325    virtual void visit (TraitItemConst &item) = 0;
     326    virtual void visit (TraitItemType &item) = 0;
     327  };
     328  
     329  class HIRVisItemVisitor
     330  {
     331  public:
     332    virtual void visit (Module &module) = 0;
     333    virtual void visit (ExternCrate &crate) = 0;
     334    virtual void visit (UseDeclaration &use_decl) = 0;
     335    virtual void visit (Function &function) = 0;
     336    virtual void visit (TypeAlias &type_alias) = 0;
     337    virtual void visit (StructStruct &struct_item) = 0;
     338    virtual void visit (TupleStruct &tuple_struct) = 0;
     339    virtual void visit (Enum &enum_item) = 0;
     340    virtual void visit (Union &union_item) = 0;
     341    virtual void visit (ConstantItem &const_item) = 0;
     342    virtual void visit (StaticItem &static_item) = 0;
     343    virtual void visit (Trait &trait) = 0;
     344    virtual void visit (ImplBlock &impl) = 0;
     345    virtual void visit (ExternBlock &block) = 0;
     346  };
     347  
     348  class HIRImplVisitor
     349  {
     350  public:
     351    virtual void visit (Function &function) = 0;
     352    virtual void visit (ConstantItem &const_item) = 0;
     353    virtual void visit (TypeAlias &type_alias) = 0;
     354  };
     355  
     356  class HIRTypeVisitor
     357  {
     358  public:
     359    virtual void visit (TypePathSegmentFunction &segment) = 0;
     360    virtual void visit (TypePath &path) = 0;
     361    virtual void visit (QualifiedPathInType &path) = 0;
     362    virtual void visit (TraitBound &bound) = 0;
     363    virtual void visit (ImplTraitType &type) = 0;
     364    virtual void visit (TraitObjectType &type) = 0;
     365    virtual void visit (ParenthesisedType &type) = 0;
     366    virtual void visit (ImplTraitTypeOneBound &type) = 0;
     367    virtual void visit (TupleType &type) = 0;
     368    virtual void visit (NeverType &type) = 0;
     369    virtual void visit (RawPointerType &type) = 0;
     370    virtual void visit (ReferenceType &type) = 0;
     371    virtual void visit (ArrayType &type) = 0;
     372    virtual void visit (SliceType &type) = 0;
     373    virtual void visit (InferredType &type) = 0;
     374    virtual void visit (BareFunctionType &type) = 0;
     375  };
     376  
     377  class HIRStmtVisitor
     378  {
     379  public:
     380    virtual void visit (EnumItemTuple &) = 0;
     381    virtual void visit (EnumItemStruct &) = 0;
     382    virtual void visit (EnumItem &item) = 0;
     383    virtual void visit (TupleStruct &tuple_struct) = 0;
     384    virtual void visit (EnumItemDiscriminant &) = 0;
     385    virtual void visit (TypePathSegmentFunction &segment) = 0;
     386    virtual void visit (TypePath &path) = 0;
     387    virtual void visit (QualifiedPathInType &path) = 0;
     388    virtual void visit (Module &module) = 0;
     389    virtual void visit (ExternCrate &crate) = 0;
     390    virtual void visit (UseDeclaration &use_decl) = 0;
     391    virtual void visit (Function &function) = 0;
     392    virtual void visit (TypeAlias &type_alias) = 0;
     393    virtual void visit (StructStruct &struct_item) = 0;
     394    virtual void visit (Enum &enum_item) = 0;
     395    virtual void visit (Union &union_item) = 0;
     396    virtual void visit (ConstantItem &const_item) = 0;
     397    virtual void visit (StaticItem &static_item) = 0;
     398    virtual void visit (Trait &trait) = 0;
     399    virtual void visit (ImplBlock &impl) = 0;
     400    virtual void visit (ExternBlock &block) = 0;
     401    virtual void visit (EmptyStmt &stmt) = 0;
     402    virtual void visit (LetStmt &stmt) = 0;
     403    virtual void visit (ExprStmtWithoutBlock &stmt) = 0;
     404    virtual void visit (ExprStmtWithBlock &stmt) = 0;
     405  };
     406  
     407  class HIRExpressionVisitor
     408  {
     409  public:
     410    // These are StructExprField
     411    // Added because of CompileStructExprField
     412    virtual void visit (StructExprFieldIdentifier &field) = 0;
     413    virtual void visit (StructExprFieldIdentifierValue &field) = 0;
     414    virtual void visit (StructExprFieldIndexValue &field) = 0;
     415  
     416    virtual void visit (HIR::QualifiedPathInExpression &expr) = 0;
     417    virtual void visit (HIR::PathInExpression &expr) = 0;
     418    virtual void visit (ClosureExpr &) = 0;
     419    virtual void visit (StructExprStructFields &) = 0;
     420    virtual void visit (StructExprStruct &) = 0;
     421    virtual void visit (LiteralExpr &expr) = 0;
     422    virtual void visit (BorrowExpr &expr) = 0;
     423    virtual void visit (DereferenceExpr &expr) = 0;
     424    virtual void visit (ErrorPropagationExpr &expr) = 0;
     425    virtual void visit (NegationExpr &expr) = 0;
     426    virtual void visit (ArithmeticOrLogicalExpr &expr) = 0;
     427    virtual void visit (ComparisonExpr &expr) = 0;
     428    virtual void visit (LazyBooleanExpr &expr) = 0;
     429    virtual void visit (TypeCastExpr &expr) = 0;
     430    virtual void visit (AssignmentExpr &expr) = 0;
     431    virtual void visit (CompoundAssignmentExpr &expr) = 0;
     432    virtual void visit (GroupedExpr &expr) = 0;
     433    virtual void visit (ArrayExpr &expr) = 0;
     434    virtual void visit (ArrayIndexExpr &expr) = 0;
     435    virtual void visit (TupleExpr &expr) = 0;
     436    virtual void visit (TupleIndexExpr &expr) = 0;
     437    virtual void visit (CallExpr &expr) = 0;
     438    virtual void visit (MethodCallExpr &expr) = 0;
     439    virtual void visit (FieldAccessExpr &expr) = 0;
     440    virtual void visit (BlockExpr &expr) = 0;
     441    virtual void visit (ContinueExpr &expr) = 0;
     442    virtual void visit (BreakExpr &expr) = 0;
     443    virtual void visit (RangeFromToExpr &expr) = 0;
     444    virtual void visit (RangeFromExpr &expr) = 0;
     445    virtual void visit (RangeToExpr &expr) = 0;
     446    virtual void visit (RangeFullExpr &expr) = 0;
     447    virtual void visit (RangeFromToInclExpr &expr) = 0;
     448    virtual void visit (RangeToInclExpr &expr) = 0;
     449    virtual void visit (ReturnExpr &expr) = 0;
     450    virtual void visit (UnsafeBlockExpr &expr) = 0;
     451    virtual void visit (LoopExpr &expr) = 0;
     452    virtual void visit (WhileLoopExpr &expr) = 0;
     453    virtual void visit (WhileLetLoopExpr &expr) = 0;
     454    virtual void visit (ForLoopExpr &expr) = 0;
     455    virtual void visit (IfExpr &expr) = 0;
     456    virtual void visit (IfExprConseqElse &expr) = 0;
     457    virtual void visit (IfExprConseqIf &expr) = 0;
     458    virtual void visit (IfExprConseqIfLet &expr) = 0;
     459    virtual void visit (IfLetExpr &expr) = 0;
     460    virtual void visit (IfLetExprConseqElse &expr) = 0;
     461    virtual void visit (IfLetExprConseqIf &expr) = 0;
     462    virtual void visit (IfLetExprConseqIfLet &expr) = 0;
     463    virtual void visit (MatchExpr &expr) = 0;
     464    virtual void visit (AwaitExpr &expr) = 0;
     465    virtual void visit (AsyncBlockExpr &expr) = 0;
     466  };
     467  
     468  class HIRPatternVisitor
     469  {
     470  public:
     471    virtual void visit (IdentifierPattern &) = 0;
     472    virtual void visit (LiteralPattern &) = 0;
     473    virtual void visit (PathInExpression &) = 0;
     474    virtual void visit (QualifiedPathInExpression &) = 0;
     475    virtual void visit (RangePattern &) = 0;
     476    virtual void visit (ReferencePattern &) = 0;
     477    virtual void visit (SlicePattern &) = 0;
     478    virtual void visit (StructPattern &) = 0;
     479    virtual void visit (TuplePattern &) = 0;
     480    virtual void visit (TupleStructPattern &) = 0;
     481    virtual void visit (WildcardPattern &) = 0;
     482  };
     483  
     484  } // namespace HIR
     485  } // namespace Rust
     486  
     487  #endif