(root)/
gcc-13.2.0/
gcc/
rust/
hir/
rust-ast-lower-base.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_AST_LOWER_BASE
      20  #define RUST_AST_LOWER_BASE
      21  
      22  #include "rust-system.h"
      23  #include "rust-ast-full.h"
      24  #include "rust-ast-visitor.h"
      25  #include "rust-hir-map.h"
      26  #include "rust-hir-full.h"
      27  #include "rust-attributes.h"
      28  
      29  namespace Rust {
      30  namespace HIR {
      31  
      32  // proxy class so we can do attribute checking on items and trait items
      33  class ItemWrapper
      34  {
      35  public:
      36    ItemWrapper (const HIR::Item &item)
      37      : mappings (item.get_mappings ()), locus (item.get_locus ()),
      38        outer_attrs (item.get_outer_attrs ())
      39    {}
      40  
      41    ItemWrapper (const HIR::TraitItem &item)
      42      : mappings (item.get_mappings ()), locus (item.get_trait_locus ()),
      43        outer_attrs (item.get_outer_attrs ())
      44    {}
      45  
      46    const Analysis::NodeMapping &get_mappings () const { return mappings; }
      47    Location get_locus () const { return locus; }
      48    const AST::AttrVec &get_outer_attrs () const { return outer_attrs; }
      49  
      50  private:
      51    const Analysis::NodeMapping &mappings;
      52    Location locus;
      53    const AST::AttrVec &outer_attrs;
      54  };
      55  
      56  // base class to allow derivatives to overload as needed
      57  class ASTLoweringBase : public AST::ASTVisitor
      58  {
      59  public:
      60    virtual ~ASTLoweringBase () {}
      61  
      62    // visitor impl
      63    // rust-ast.h
      64    //  virtual void visit(AttrInput& attr_input);
      65    //  virtual void visit(TokenTree& token_tree);
      66    //  virtual void visit(MacroMatch& macro_match);
      67    virtual void visit (AST::Token &tok);
      68    virtual void visit (AST::DelimTokenTree &delim_tok_tree);
      69    virtual void visit (AST::AttrInputMetaItemContainer &input);
      70    //  virtual void visit(MetaItem& meta_item);
      71    //  void vsit(Stmt& stmt);
      72    //  virtual void visit(Expr& expr);
      73    virtual void visit (AST::IdentifierExpr &ident_expr);
      74    //  virtual void visit(Pattern& pattern);
      75    //  virtual void visit(Type& type);
      76    //  virtual void visit(TypeParamBound& type_param_bound);
      77    virtual void visit (AST::Lifetime &lifetime);
      78    //  virtual void visit(GenericParam& generic_param);
      79    virtual void visit (AST::LifetimeParam &lifetime_param);
      80    virtual void visit (AST::ConstGenericParam &const_param);
      81    //  virtual void visit(TraitItem& trait_item);
      82    //  virtual void visit(InherentImplItem& inherent_impl_item);
      83    //  virtual void visit(TraitImplItem& trait_impl_item);
      84  
      85    // rust-path.h
      86    virtual void visit (AST::PathInExpression &path);
      87    virtual void visit (AST::TypePathSegment &segment);
      88    virtual void visit (AST::TypePathSegmentGeneric &segment);
      89    virtual void visit (AST::TypePathSegmentFunction &segment);
      90    virtual void visit (AST::TypePath &path);
      91    virtual void visit (AST::QualifiedPathInExpression &path);
      92    virtual void visit (AST::QualifiedPathInType &path);
      93  
      94    // rust-expr.h
      95    virtual void visit (AST::LiteralExpr &expr);
      96    virtual void visit (AST::AttrInputLiteral &attr_input);
      97    virtual void visit (AST::MetaItemLitExpr &meta_item);
      98    virtual void visit (AST::MetaItemPathLit &meta_item);
      99    virtual void visit (AST::BorrowExpr &expr);
     100    virtual void visit (AST::DereferenceExpr &expr);
     101    virtual void visit (AST::ErrorPropagationExpr &expr);
     102    virtual void visit (AST::NegationExpr &expr);
     103    virtual void visit (AST::ArithmeticOrLogicalExpr &expr);
     104    virtual void visit (AST::ComparisonExpr &expr);
     105    virtual void visit (AST::LazyBooleanExpr &expr);
     106    virtual void visit (AST::TypeCastExpr &expr);
     107    virtual void visit (AST::AssignmentExpr &expr);
     108    virtual void visit (AST::CompoundAssignmentExpr &expr);
     109    virtual void visit (AST::GroupedExpr &expr);
     110    //  virtual void visit(ArrayElems& elems);
     111    virtual void visit (AST::ArrayElemsValues &elems);
     112    virtual void visit (AST::ArrayElemsCopied &elems);
     113    virtual void visit (AST::ArrayExpr &expr);
     114    virtual void visit (AST::ArrayIndexExpr &expr);
     115    virtual void visit (AST::TupleExpr &expr);
     116    virtual void visit (AST::TupleIndexExpr &expr);
     117    virtual void visit (AST::StructExprStruct &expr);
     118    //  virtual void visit(StructExprField& field);
     119    virtual void visit (AST::StructExprFieldIdentifier &field);
     120    virtual void visit (AST::StructExprFieldIdentifierValue &field);
     121    virtual void visit (AST::StructExprFieldIndexValue &field);
     122    virtual void visit (AST::StructExprStructFields &expr);
     123    virtual void visit (AST::StructExprStructBase &expr);
     124    virtual void visit (AST::CallExpr &expr);
     125    virtual void visit (AST::MethodCallExpr &expr);
     126    virtual void visit (AST::FieldAccessExpr &expr);
     127    virtual void visit (AST::ClosureExprInner &expr);
     128    virtual void visit (AST::BlockExpr &expr);
     129    virtual void visit (AST::ClosureExprInnerTyped &expr);
     130    virtual void visit (AST::ContinueExpr &expr);
     131    virtual void visit (AST::BreakExpr &expr);
     132    virtual void visit (AST::RangeFromToExpr &expr);
     133    virtual void visit (AST::RangeFromExpr &expr);
     134    virtual void visit (AST::RangeToExpr &expr);
     135    virtual void visit (AST::RangeFullExpr &expr);
     136    virtual void visit (AST::RangeFromToInclExpr &expr);
     137    virtual void visit (AST::RangeToInclExpr &expr);
     138    virtual void visit (AST::ReturnExpr &expr);
     139    virtual void visit (AST::UnsafeBlockExpr &expr);
     140    virtual void visit (AST::LoopExpr &expr);
     141    virtual void visit (AST::WhileLoopExpr &expr);
     142    virtual void visit (AST::WhileLetLoopExpr &expr);
     143    virtual void visit (AST::ForLoopExpr &expr);
     144    virtual void visit (AST::IfExpr &expr);
     145    virtual void visit (AST::IfExprConseqElse &expr);
     146    virtual void visit (AST::IfExprConseqIf &expr);
     147    virtual void visit (AST::IfExprConseqIfLet &expr);
     148    virtual void visit (AST::IfLetExpr &expr);
     149    virtual void visit (AST::IfLetExprConseqElse &expr);
     150    virtual void visit (AST::IfLetExprConseqIf &expr);
     151    virtual void visit (AST::IfLetExprConseqIfLet &expr);
     152    //  virtual void visit(MatchCase& match_case);
     153    // virtual void visit (AST::MatchCaseBlockExpr &match_case);
     154    // virtual void visit (AST::MatchCaseExpr &match_case);
     155    virtual void visit (AST::MatchExpr &expr);
     156    virtual void visit (AST::AwaitExpr &expr);
     157    virtual void visit (AST::AsyncBlockExpr &expr);
     158  
     159    // rust-item.h
     160    virtual void visit (AST::TypeParam &param);
     161    //  virtual void visit(WhereClauseItem& item);
     162    virtual void visit (AST::LifetimeWhereClauseItem &item);
     163    virtual void visit (AST::TypeBoundWhereClauseItem &item);
     164    virtual void visit (AST::Method &method);
     165    virtual void visit (AST::Module &module);
     166    virtual void visit (AST::ExternCrate &crate);
     167    //  virtual void visit(UseTree& use_tree);
     168    virtual void visit (AST::UseTreeGlob &use_tree);
     169    virtual void visit (AST::UseTreeList &use_tree);
     170    virtual void visit (AST::UseTreeRebind &use_tree);
     171    virtual void visit (AST::UseDeclaration &use_decl);
     172    virtual void visit (AST::Function &function);
     173    virtual void visit (AST::TypeAlias &type_alias);
     174    virtual void visit (AST::StructStruct &struct_item);
     175    virtual void visit (AST::TupleStruct &tuple_struct);
     176    virtual void visit (AST::EnumItem &item);
     177    virtual void visit (AST::EnumItemTuple &item);
     178    virtual void visit (AST::EnumItemStruct &item);
     179    virtual void visit (AST::EnumItemDiscriminant &item);
     180    virtual void visit (AST::Enum &enum_item);
     181    virtual void visit (AST::Union &union_item);
     182    virtual void visit (AST::ConstantItem &const_item);
     183    virtual void visit (AST::StaticItem &static_item);
     184    virtual void visit (AST::TraitItemFunc &item);
     185    virtual void visit (AST::TraitItemMethod &item);
     186    virtual void visit (AST::TraitItemConst &item);
     187    virtual void visit (AST::TraitItemType &item);
     188    virtual void visit (AST::Trait &trait);
     189    virtual void visit (AST::InherentImpl &impl);
     190    virtual void visit (AST::TraitImpl &impl);
     191    //  virtual void visit(ExternalItem& item);
     192    virtual void visit (AST::ExternalStaticItem &item);
     193    virtual void visit (AST::ExternalFunctionItem &item);
     194    virtual void visit (AST::ExternBlock &block);
     195  
     196    // rust-macro.h
     197    virtual void visit (AST::MacroMatchFragment &match);
     198    virtual void visit (AST::MacroMatchRepetition &match);
     199    virtual void visit (AST::MacroMatcher &matcher);
     200    virtual void visit (AST::MacroRulesDefinition &rules_def);
     201    virtual void visit (AST::MacroInvocation &macro_invoc);
     202    virtual void visit (AST::MetaItemPath &meta_item);
     203    virtual void visit (AST::MetaItemSeq &meta_item);
     204    virtual void visit (AST::MetaWord &meta_item);
     205    virtual void visit (AST::MetaNameValueStr &meta_item);
     206    virtual void visit (AST::MetaListPaths &meta_item);
     207    virtual void visit (AST::MetaListNameValueStr &meta_item);
     208  
     209    // rust-pattern.h
     210    virtual void visit (AST::LiteralPattern &pattern);
     211    virtual void visit (AST::IdentifierPattern &pattern);
     212    virtual void visit (AST::WildcardPattern &pattern);
     213    //  virtual void visit(RangePatternBound& bound);
     214    virtual void visit (AST::RangePatternBoundLiteral &bound);
     215    virtual void visit (AST::RangePatternBoundPath &bound);
     216    virtual void visit (AST::RangePatternBoundQualPath &bound);
     217    virtual void visit (AST::RangePattern &pattern);
     218    virtual void visit (AST::ReferencePattern &pattern);
     219    //  virtual void visit(StructPatternField& field);
     220    virtual void visit (AST::StructPatternFieldTuplePat &field);
     221    virtual void visit (AST::StructPatternFieldIdentPat &field);
     222    virtual void visit (AST::StructPatternFieldIdent &field);
     223    virtual void visit (AST::StructPattern &pattern);
     224    //  virtual void visit(TupleStructItems& tuple_items);
     225    virtual void visit (AST::TupleStructItemsNoRange &tuple_items);
     226    virtual void visit (AST::TupleStructItemsRange &tuple_items);
     227    virtual void visit (AST::TupleStructPattern &pattern);
     228    //  virtual void visit(TuplePatternItems& tuple_items);
     229    virtual void visit (AST::TuplePatternItemsMultiple &tuple_items);
     230    virtual void visit (AST::TuplePatternItemsRanged &tuple_items);
     231    virtual void visit (AST::TuplePattern &pattern);
     232    virtual void visit (AST::GroupedPattern &pattern);
     233    virtual void visit (AST::SlicePattern &pattern);
     234    virtual void visit (AST::AltPattern &pattern);
     235  
     236    // rust-stmt.h
     237    virtual void visit (AST::EmptyStmt &stmt);
     238    virtual void visit (AST::LetStmt &stmt);
     239    virtual void visit (AST::ExprStmtWithoutBlock &stmt);
     240    virtual void visit (AST::ExprStmtWithBlock &stmt);
     241  
     242    // rust-type.h
     243    virtual void visit (AST::TraitBound &bound);
     244    virtual void visit (AST::ImplTraitType &type);
     245    virtual void visit (AST::TraitObjectType &type);
     246    virtual void visit (AST::ParenthesisedType &type);
     247    virtual void visit (AST::ImplTraitTypeOneBound &type);
     248    virtual void visit (AST::TraitObjectTypeOneBound &type);
     249    virtual void visit (AST::TupleType &type);
     250    virtual void visit (AST::NeverType &type);
     251    virtual void visit (AST::RawPointerType &type);
     252    virtual void visit (AST::ReferenceType &type);
     253    virtual void visit (AST::ArrayType &type);
     254    virtual void visit (AST::SliceType &type);
     255    virtual void visit (AST::InferredType &type);
     256    virtual void visit (AST::BareFunctionType &type);
     257  
     258  protected:
     259    ASTLoweringBase ()
     260      : mappings (Analysis::Mappings::get ()),
     261        attr_mappings (Analysis::BuiltinAttributeMappings::get ())
     262    {}
     263  
     264    Analysis::Mappings *mappings;
     265    Analysis::BuiltinAttributeMappings *attr_mappings;
     266  
     267    HIR::Lifetime lower_lifetime (AST::Lifetime &lifetime);
     268  
     269    HIR::LoopLabel lower_loop_label (AST::LoopLabel &loop_label);
     270  
     271    std::vector<std::unique_ptr<HIR::GenericParam> > lower_generic_params (
     272      std::vector<std::unique_ptr<AST::GenericParam> > &params);
     273  
     274    HIR::PathExprSegment lower_path_expr_seg (AST::PathExprSegment &s);
     275  
     276    HIR::GenericArgs lower_generic_args (AST::GenericArgs &args);
     277  
     278    HIR::GenericArgsBinding lower_binding (AST::GenericArgsBinding &binding);
     279  
     280    HIR::SelfParam lower_self (AST::SelfParam &self);
     281  
     282    HIR::Type *lower_type_no_bounds (AST::TypeNoBounds *type);
     283  
     284    HIR::TypeParamBound *lower_bound (AST::TypeParamBound *bound);
     285  
     286    HIR::QualifiedPathType
     287    lower_qual_path_type (AST::QualifiedPathType &qual_path_type);
     288  
     289    HIR::FunctionQualifiers
     290    lower_qualifiers (const AST::FunctionQualifiers &qualifiers);
     291  
     292    void handle_outer_attributes (const ItemWrapper &item);
     293  
     294    void handle_lang_item_attribute (const ItemWrapper &item,
     295  				   const AST::Attribute &attr);
     296  
     297    void handle_doc_item_attribute (const ItemWrapper &item,
     298  				  const AST::Attribute &attr);
     299  
     300    bool is_known_attribute (const std::string &attribute_path) const;
     301  
     302    bool
     303    attribute_handled_in_another_pass (const std::string &attribute_path) const;
     304  
     305    std::unique_ptr<TuplePatternItems>
     306    lower_tuple_pattern_multiple (AST::TuplePatternItemsMultiple &pattern);
     307  
     308    std::unique_ptr<TuplePatternItems>
     309    lower_tuple_pattern_ranged (AST::TuplePatternItemsRanged &pattern);
     310  
     311    std::unique_ptr<HIR::RangePatternBound>
     312    lower_range_pattern_bound (AST::RangePatternBound *bound);
     313  
     314    HIR::Literal lower_literal (const AST::Literal &literal);
     315  
     316    HIR::ExternBlock *lower_extern_block (AST::ExternBlock &extern_block);
     317  
     318    HIR::ClosureParam lower_closure_param (AST::ClosureParam &param);
     319  };
     320  
     321  } // namespace HIR
     322  } // namespace Rust
     323  
     324  #endif // RUST_AST_LOWER_BASE