Branch data Line data Source code
1 : : // Copyright (C) 2020-2024 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_BLOCK
20 : : #define RUST_AST_LOWER_BLOCK
21 : :
22 : : #include "rust-diagnostics.h"
23 : : #include "rust-ast-lower-base.h"
24 : :
25 : : namespace Rust {
26 : : namespace HIR {
27 : :
28 : 15294 : class ASTLoweringBlock : public ASTLoweringBase
29 : : {
30 : : using Rust::HIR::ASTLoweringBase::visit;
31 : :
32 : : public:
33 : 12815 : static HIR::BlockExpr *translate (AST::BlockExpr &expr, bool *terminated)
34 : : {
35 : 25630 : ASTLoweringBlock resolver;
36 : 12815 : expr.normalize_tail_expr ();
37 : 12815 : expr.accept_vis (resolver);
38 : 12815 : if (resolver.translated != nullptr)
39 : : {
40 : 12815 : resolver.mappings->insert_hir_expr (resolver.translated);
41 : : }
42 : :
43 : 12815 : *terminated = resolver.terminated;
44 : 12815 : return resolver.translated;
45 : 12815 : }
46 : :
47 : 2479 : static HIR::UnsafeBlockExpr *translate (AST::UnsafeBlockExpr &expr,
48 : : bool *terminated)
49 : : {
50 : 4958 : ASTLoweringBlock resolver;
51 : :
52 : 2479 : HIR::BlockExpr *block
53 : 2479 : = ASTLoweringBlock::translate (expr.get_block_expr (), terminated);
54 : 2479 : auto crate_num = resolver.mappings->get_current_crate ();
55 : 4958 : Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
56 : : resolver.mappings->get_next_hir_id (
57 : : crate_num),
58 : 2479 : UNKNOWN_LOCAL_DEFID);
59 : :
60 : 2479 : HIR::UnsafeBlockExpr *translated
61 : : = new HIR::UnsafeBlockExpr (mapping,
62 : 2479 : std::unique_ptr<HIR::BlockExpr> (block),
63 : 2479 : expr.get_outer_attrs (), expr.get_locus ());
64 : :
65 : 2479 : resolver.mappings->insert_hir_expr (translated);
66 : :
67 : 2479 : return translated;
68 : 2479 : }
69 : :
70 : : void visit (AST::BlockExpr &expr) override;
71 : :
72 : : private:
73 : 15294 : ASTLoweringBlock ()
74 : 15294 : : ASTLoweringBase (), translated (nullptr), terminated (false)
75 : : {}
76 : :
77 : : HIR::BlockExpr *translated;
78 : : bool terminated;
79 : : };
80 : :
81 : : class ASTLoweringIfBlock : public ASTLoweringBase
82 : : {
83 : : using Rust::HIR::ASTLoweringBase::visit;
84 : :
85 : : public:
86 : 647 : static HIR::IfExpr *translate (AST::IfExpr &expr, bool *terminated)
87 : : {
88 : 1294 : ASTLoweringIfBlock resolver;
89 : 647 : expr.accept_vis (resolver);
90 : 647 : if (resolver.translated != nullptr)
91 : : {
92 : 647 : resolver.mappings->insert_hir_expr (resolver.translated);
93 : : }
94 : 647 : *terminated = resolver.terminated;
95 : 647 : return resolver.translated;
96 : 647 : }
97 : :
98 : 647 : ~ASTLoweringIfBlock () {}
99 : :
100 : : void visit (AST::IfExpr &expr) override;
101 : :
102 : : void visit (AST::IfExprConseqElse &expr) override;
103 : :
104 : : private:
105 : 647 : ASTLoweringIfBlock ()
106 : 647 : : ASTLoweringBase (), translated (nullptr), terminated (false)
107 : : {}
108 : :
109 : : HIR::IfExpr *translated;
110 : : bool terminated;
111 : : };
112 : :
113 : : class ASTLoweringIfLetBlock : public ASTLoweringBase
114 : : {
115 : : using Rust::HIR::ASTLoweringBase::visit;
116 : :
117 : : public:
118 : 2 : static HIR::IfLetExpr *translate (AST::IfLetExpr &expr)
119 : : {
120 : 4 : ASTLoweringIfLetBlock resolver;
121 : 2 : expr.accept_vis (resolver);
122 : 2 : if (resolver.translated != nullptr)
123 : : {
124 : 2 : resolver.mappings->insert_hir_expr (resolver.translated);
125 : : }
126 : 2 : return resolver.translated;
127 : 2 : }
128 : :
129 : 2 : ~ASTLoweringIfLetBlock () {}
130 : :
131 : : void visit (AST::IfLetExpr &expr) override;
132 : :
133 : : void visit (AST::IfLetExprConseqElse &expr) override;
134 : :
135 : : private:
136 : 2 : ASTLoweringIfLetBlock () : ASTLoweringBase (), translated (nullptr) {}
137 : :
138 : : HIR::IfLetExpr *translated;
139 : : };
140 : :
141 : : class ASTLoweringExprWithBlock : public ASTLoweringBase
142 : : {
143 : : using Rust::HIR::ASTLoweringBase::visit;
144 : :
145 : : public:
146 : 672 : static HIR::ExprWithBlock *translate (AST::ExprWithBlock &expr,
147 : : bool *terminated)
148 : : {
149 : 1344 : ASTLoweringExprWithBlock resolver;
150 : 672 : expr.accept_vis (resolver);
151 : 672 : if (resolver.translated != nullptr)
152 : : {
153 : 672 : resolver.mappings->insert_hir_expr (resolver.translated);
154 : : }
155 : :
156 : 672 : *terminated = resolver.terminated;
157 : 672 : return resolver.translated;
158 : 672 : }
159 : :
160 : 672 : ~ASTLoweringExprWithBlock () {}
161 : :
162 : 9 : void visit (AST::IfExpr &expr) override
163 : : {
164 : 9 : translated = ASTLoweringIfBlock::translate (expr, &terminated);
165 : 9 : }
166 : :
167 : 30 : void visit (AST::IfExprConseqElse &expr) override
168 : : {
169 : 30 : translated = ASTLoweringIfBlock::translate (expr, &terminated);
170 : 30 : }
171 : :
172 : 0 : void visit (AST::IfLetExpr &expr) override
173 : : {
174 : 0 : translated = ASTLoweringIfLetBlock::translate (expr);
175 : 0 : }
176 : :
177 : 1 : void visit (AST::IfLetExprConseqElse &expr) override
178 : : {
179 : 1 : translated = ASTLoweringIfLetBlock::translate (expr);
180 : 1 : }
181 : :
182 : 309 : void visit (AST::BlockExpr &expr) override
183 : : {
184 : 309 : translated = ASTLoweringBlock::translate (expr, &terminated);
185 : 309 : }
186 : :
187 : 0 : void visit (AST::UnsafeBlockExpr &expr) override
188 : : {
189 : 0 : translated = ASTLoweringBlock::translate (expr, &terminated);
190 : 0 : }
191 : :
192 : 90 : void visit (AST::LoopExpr &expr) override
193 : : {
194 : 90 : HIR::BlockExpr *loop_block
195 : 90 : = ASTLoweringBlock::translate (expr.get_loop_block (), &terminated);
196 : :
197 : 90 : HIR::LoopLabel loop_label = lower_loop_label (expr.get_loop_label ());
198 : :
199 : 90 : auto crate_num = mappings->get_current_crate ();
200 : 180 : Analysis::NodeMapping mapping (crate_num, expr.get_node_id (),
201 : 90 : mappings->get_next_hir_id (crate_num),
202 : 90 : UNKNOWN_LOCAL_DEFID);
203 : :
204 : 90 : translated
205 : 90 : = new HIR::LoopExpr (mapping,
206 : 90 : std::unique_ptr<HIR::BlockExpr> (loop_block),
207 : : expr.get_locus (), std::move (loop_label),
208 : 180 : expr.get_outer_attrs ());
209 : 90 : }
210 : :
211 : : void visit (AST::WhileLoopExpr &expr) override;
212 : :
213 : : void visit (AST::ForLoopExpr &expr) override;
214 : :
215 : : void visit (AST::MatchExpr &expr) override;
216 : :
217 : : private:
218 : 672 : ASTLoweringExprWithBlock ()
219 : 672 : : ASTLoweringBase (), translated (nullptr), terminated (false)
220 : : {}
221 : :
222 : : HIR::ExprWithBlock *translated;
223 : : bool terminated;
224 : : };
225 : :
226 : : } // namespace HIR
227 : : } // namespace Rust
228 : :
229 : : #endif // RUST_AST_LOWER_BLOCK
|