Line data Source code
1 : // Copyright (C) 2020-2026 Free Software Foundation, Inc.
2 :
3 : // This file is part of GCC.
4 :
5 : // GCC is free software; you can redistribute it and/or modify it under
6 : // the terms of the GNU General Public License as published by the Free
7 : // Software Foundation; either version 3, or (at your option) any later
8 : // version.
9 :
10 : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : // for more details.
14 :
15 : // You should have received a copy of the GNU General Public License
16 : // along with GCC; see the file COPYING3. If not see
17 : // <http://www.gnu.org/licenses/>.
18 :
19 : #ifndef RUST_AST_LOWER_EXPR
20 : #define RUST_AST_LOWER_EXPR
21 :
22 : #include "rust-ast-lower-base.h"
23 : #include "rust-ast.h"
24 : #include "rust-expr.h"
25 :
26 : namespace Rust {
27 : namespace HIR {
28 :
29 24149 : class ASTLowerPathInExpression : public ASTLoweringBase
30 : {
31 : using Rust::HIR::ASTLoweringBase::visit;
32 :
33 : public:
34 24149 : static HIR::PathInExpression *translate (AST::PathInExpression &expr)
35 : {
36 48298 : ASTLowerPathInExpression compiler;
37 24149 : expr.accept_vis (compiler);
38 24149 : rust_assert (compiler.translated);
39 24149 : return compiler.translated;
40 24149 : }
41 :
42 : void visit (AST::PathInExpression &expr) override;
43 :
44 : private:
45 24149 : ASTLowerPathInExpression () : translated (nullptr) {}
46 :
47 : HIR::PathInExpression *translated;
48 : };
49 :
50 114 : class ASTLowerQualPathInExpression : public ASTLoweringBase
51 : {
52 : using Rust::HIR::ASTLoweringBase::visit;
53 :
54 : public:
55 : static HIR::QualifiedPathInExpression *
56 114 : translate (AST::QualifiedPathInExpression &expr)
57 : {
58 228 : ASTLowerQualPathInExpression compiler;
59 114 : expr.accept_vis (compiler);
60 114 : rust_assert (compiler.translated);
61 114 : return compiler.translated;
62 114 : }
63 :
64 : void visit (AST::QualifiedPathInExpression &expr) override;
65 :
66 : private:
67 114 : ASTLowerQualPathInExpression () : translated (nullptr) {}
68 :
69 : HIR::QualifiedPathInExpression *translated;
70 : };
71 :
72 116495 : class ASTLoweringExpr : public ASTLoweringBase
73 : {
74 : using Rust::HIR::ASTLoweringBase::visit;
75 :
76 : public:
77 : static HIR::Expr *translate (AST::Expr &expr, bool *terminated = nullptr);
78 :
79 : void visit (AST::TupleIndexExpr &expr) override;
80 : void visit (AST::TupleExpr &expr) override;
81 : void visit (AST::IfExpr &expr) override;
82 : void visit (AST::IfExprConseqElse &expr) override;
83 : void visit (AST::IfLetExpr &expr) override;
84 : void visit (AST::IfLetExprConseqElse &expr) override;
85 : void visit (AST::BlockExpr &expr) override;
86 : void visit (AST::AnonConst &expr) override;
87 : void visit (AST::ConstBlock &expr) override;
88 : void visit (AST::UnsafeBlockExpr &expr) override;
89 : void visit (AST::PathInExpression &expr) override;
90 : void visit (AST::QualifiedPathInExpression &expr) override;
91 : void visit (AST::BoxExpr &expr) override;
92 : void visit (AST::ReturnExpr &expr) override;
93 : void visit (AST::CallExpr &expr) override;
94 : void visit (AST::MethodCallExpr &expr) override;
95 : void visit (AST::AssignmentExpr &expr) override;
96 : void visit (AST::IdentifierExpr &expr) override;
97 : void visit (AST::ArrayExpr &expr) override;
98 : void visit (AST::ArrayIndexExpr &expr) override;
99 : void visit (AST::ArrayElemsValues &elems) override;
100 : void visit (AST::ArrayElemsCopied &elems) override;
101 : void visit (AST::LiteralExpr &expr) override;
102 : void visit (AST::ArithmeticOrLogicalExpr &expr) override;
103 : void visit (AST::ComparisonExpr &expr) override;
104 : void visit (AST::LazyBooleanExpr &expr) override;
105 : void visit (AST::NegationExpr &expr) override;
106 : void visit (AST::TypeCastExpr &expr) override;
107 : void visit (AST::CompoundAssignmentExpr &expr) override;
108 : void visit (AST::StructExprStruct &struct_expr) override;
109 : void visit (AST::StructExprStructFields &struct_expr) override;
110 : void visit (AST::GroupedExpr &expr) override;
111 : void visit (AST::FieldAccessExpr &expr) override;
112 : void visit (AST::LoopExpr &expr) override;
113 : void visit (AST::WhileLoopExpr &expr) override;
114 : void visit (AST::BreakExpr &expr) override;
115 : void visit (AST::ContinueExpr &expr) override;
116 : void visit (AST::BorrowExpr &expr) override;
117 : void visit (AST::DereferenceExpr &expr) override;
118 : void visit (AST::MatchExpr &expr) override;
119 : void visit (AST::RangeFromToExpr &expr) override;
120 : void visit (AST::RangeFromExpr &expr) override;
121 : void visit (AST::RangeToExpr &expr) override;
122 : void visit (AST::RangeFullExpr &expr) override;
123 : void visit (AST::RangeFromToInclExpr &expr) override;
124 : void visit (AST::ClosureExprInner &expr) override;
125 : void visit (AST::ClosureExprInnerTyped &expr) override;
126 : void visit (AST::InlineAsm &expr) override;
127 : void visit (AST::LlvmInlineAsm &expr) override;
128 :
129 : // Extra visitor for builtin macro nodes
130 : void visit (AST::FormatArgs &fmt) override;
131 : void visit (AST::OffsetOf &offset_of) override;
132 :
133 : private:
134 : ASTLoweringExpr ();
135 :
136 : HIR::Expr *translated;
137 : HIR::ArrayElems *translated_array_elems;
138 : bool terminated;
139 : };
140 :
141 : } // namespace HIR
142 : } // namespace Rust
143 :
144 : #endif // RUST_AST_LOWER_EXPR
|