diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-07-22 15:00:32 +0200 |
---|---|---|
committer | Arthur Cohen <arthur.cohen@embecosm.com> | 2025-08-05 16:36:59 +0200 |
commit | 40754a08e5bf529cb57223105b16e608f3d9f030 (patch) | |
tree | 9a2306908f9ae9ed9470ac645b104585e788dca2 /gcc | |
parent | 8a3cac82ccd4201b5d3018a5b900733cc5240139 (diff) | |
download | gcc-40754a08e5bf529cb57223105b16e608f3d9f030.zip gcc-40754a08e5bf529cb57223105b16e608f3d9f030.tar.gz gcc-40754a08e5bf529cb57223105b16e608f3d9f030.tar.bz2 |
gccrs: desugar: Add for-loop desugar to ExpressionYeast
gcc/rust/ChangeLog:
* ast/rust-desugar-for-loops.h: Adapt API and remove visitor.
* ast/rust-desugar-for-loops.cc: Likewise.
* ast/rust-expression-yeast.cc: Call DesugarForLoop.
* ast/rust-expression-yeast.h: Declare dispatch_loops function.
* rust-session-manager.cc (Session::expansion): Do not call for-loop desugar.
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/rust/ast/rust-desugar-for-loops.cc | 46 | ||||
-rw-r--r-- | gcc/rust/ast/rust-desugar-for-loops.h | 15 | ||||
-rw-r--r-- | gcc/rust/ast/rust-expression-yeast.cc | 29 | ||||
-rw-r--r-- | gcc/rust/ast/rust-expression-yeast.h | 1 | ||||
-rw-r--r-- | gcc/rust/rust-session-manager.cc | 1 |
5 files changed, 41 insertions, 51 deletions
diff --git a/gcc/rust/ast/rust-desugar-for-loops.cc b/gcc/rust/ast/rust-desugar-for-loops.cc index ffc3470..496e8ef 100644 --- a/gcc/rust/ast/rust-desugar-for-loops.cc +++ b/gcc/rust/ast/rust-desugar-for-loops.cc @@ -17,7 +17,6 @@ // <http://www.gnu.org/licenses/>. #include "rust-desugar-for-loops.h" -#include "rust-ast-visitor.h" #include "rust-ast.h" #include "rust-hir-map.h" #include "rust-path.h" @@ -31,19 +30,6 @@ namespace AST { DesugarForLoops::DesugarForLoops () {} -void -DesugarForLoops::go (AST::Crate &crate) -{ - DefaultASTVisitor::visit (crate); -} - -static void -replace_for_loop (std::unique_ptr<Expr> &for_loop, - std::unique_ptr<Expr> &&expanded) -{ - for_loop = std::move (expanded); -} - MatchArm DesugarForLoops::DesugarCtx::make_match_arm (std::unique_ptr<Pattern> &&path) { @@ -98,7 +84,7 @@ DesugarForLoops::DesugarCtx::statementify (std::unique_ptr<Expr> &&expr) } std::unique_ptr<Expr> -DesugarForLoops::desugar (AST::ForLoopExpr &expr) +DesugarForLoops::desugar (ForLoopExpr &expr) { auto ctx = DesugarCtx (expr.get_locus ()); @@ -170,34 +156,18 @@ DesugarForLoops::desugar (AST::ForLoopExpr &expr) } void -DesugarForLoops::maybe_desugar_expr (std::unique_ptr<Expr> &expr) +DesugarForLoops::go (std::unique_ptr<Expr> &ptr) { - if (expr->get_expr_kind () == AST::Expr::Kind::Loop) - { - auto &loop = static_cast<AST::BaseLoopExpr &> (*expr); - - if (loop.get_loop_kind () == AST::BaseLoopExpr::Kind::For) - { - auto &for_loop = static_cast<AST::ForLoopExpr &> (loop); - - auto desugared = desugar (for_loop); + rust_assert (ptr->get_expr_kind () == Expr::Kind::Loop); - replace_for_loop (expr, std::move (desugared)); - } - } -} + auto &loop = static_cast<BaseLoopExpr &> (*ptr); -void -DesugarForLoops::visit (AST::BlockExpr &block) -{ - for (auto &stmt : block.get_statements ()) - if (stmt->get_stmt_kind () == AST::Stmt::Kind::Expr) - maybe_desugar_expr (static_cast<AST::ExprStmt &> (*stmt).get_expr_ptr ()); + rust_assert (loop.get_loop_kind () == BaseLoopExpr::Kind::For); - if (block.has_tail_expr ()) - maybe_desugar_expr (block.get_tail_expr_ptr ()); + auto &for_loop = static_cast<ForLoopExpr &> (loop); + auto desugared = DesugarForLoops ().desugar (for_loop); - DefaultASTVisitor::visit (block); + ptr = std::move (desugared); } } // namespace AST diff --git a/gcc/rust/ast/rust-desugar-for-loops.h b/gcc/rust/ast/rust-desugar-for-loops.h index 7beb692..3a8365c 100644 --- a/gcc/rust/ast/rust-desugar-for-loops.h +++ b/gcc/rust/ast/rust-desugar-for-loops.h @@ -20,7 +20,6 @@ #define RUST_DESUGAR_FOR_LOOPS_H #include "rust-ast-builder.h" -#include "rust-ast-visitor.h" #include "rust-expr.h" namespace Rust { @@ -69,15 +68,14 @@ namespace AST { // of the way the typechecker is currently structured, where it will fetch name // resolution information in order to typecheck paths - which technically isn't // necessary. -class DesugarForLoops : public DefaultASTVisitor +class DesugarForLoops { - using DefaultASTVisitor::visit; - public: - DesugarForLoops (); - void go (AST::Crate &); + static void go (std::unique_ptr<Expr> &ptr); private: + DesugarForLoops (); + struct DesugarCtx { DesugarCtx (location_t loc) : builder (Builder (loc)), loc (loc) {} @@ -96,10 +94,7 @@ private: constexpr static const char *result_id = "#result"; }; - std::unique_ptr<Expr> desugar (AST::ForLoopExpr &expr); - void maybe_desugar_expr (std::unique_ptr<Expr> &expr); - - void visit (AST::BlockExpr &) override; + std::unique_ptr<Expr> desugar (ForLoopExpr &expr); }; } // namespace AST diff --git a/gcc/rust/ast/rust-expression-yeast.cc b/gcc/rust/ast/rust-expression-yeast.cc index 6c0b3d3..e8cf6d5 100644 --- a/gcc/rust/ast/rust-expression-yeast.cc +++ b/gcc/rust/ast/rust-expression-yeast.cc @@ -20,7 +20,10 @@ #include "rust-ast-visitor.h" #include "rust-desugar-question-mark.h" #include "rust-desugar-try-block.h" +#include "rust-desugar-for-loops.h" #include "rust-ast-full.h" +#include "rust-expr.h" +#include "rust-stmt.h" namespace Rust { namespace AST { @@ -32,17 +35,36 @@ ExpressionYeast::go (AST::Crate &crate) } void +ExpressionYeast::dispatch_loops (std::unique_ptr<Expr> &loop_expr) +{ + auto &loop = static_cast<BaseLoopExpr &> (*loop_expr.get ()); + + switch (loop.get_loop_kind ()) + { + case BaseLoopExpr::Kind::For: + DesugarForLoops::go (loop_expr); + break; + case BaseLoopExpr::Kind::Loop: + case BaseLoopExpr::Kind::While: + case BaseLoopExpr::Kind::WhileLet: + break; + } +} + +void ExpressionYeast::dispatch (std::unique_ptr<Expr> &expr) { switch (expr->get_expr_kind ()) { - // TODO: Handle try-blocks case Expr::Kind::ErrorPropagation: DesugarQuestionMark::go (expr); break; case Expr::Kind::Try: DesugarTryBlock::go (expr); break; + case Expr::Kind::Loop: + dispatch_loops (expr); + break; default: break; @@ -72,10 +94,13 @@ void ExpressionYeast::visit (BlockExpr &block) { for (auto &stmt : block.get_statements ()) - DefaultASTVisitor::visit (stmt); + if (stmt->get_stmt_kind () == Stmt::Kind::Expr) + dispatch (static_cast<ExprStmt &> (*stmt).get_expr_ptr ()); if (block.has_tail_expr ()) dispatch (block.get_tail_expr_ptr ()); + + DefaultASTVisitor::visit (block); } void diff --git a/gcc/rust/ast/rust-expression-yeast.h b/gcc/rust/ast/rust-expression-yeast.h index 18712b4..855918f 100644 --- a/gcc/rust/ast/rust-expression-yeast.h +++ b/gcc/rust/ast/rust-expression-yeast.h @@ -38,6 +38,7 @@ public: private: // Dispatch to the proper desugar void dispatch (std::unique_ptr<Expr> &expr); + void dispatch_loops (std::unique_ptr<Expr> &loop_expr); void visit (AST::ExprStmt &) override; void visit (AST::CallExpr &) override; diff --git a/gcc/rust/rust-session-manager.cc b/gcc/rust/rust-session-manager.cc index dc59be0..17f9c06 100644 --- a/gcc/rust/rust-session-manager.cc +++ b/gcc/rust/rust-session-manager.cc @@ -988,7 +988,6 @@ Session::expansion (AST::Crate &crate, Resolver2_0::NameResolutionContext &ctx) { AST::ExpressionYeast ().go (crate); - AST::DesugarForLoops ().go (crate); AST::DesugarApit ().go (crate); // HACK: we may need a final TopLevel pass |