#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-desugar-while-let.h"
#include "rust-expr.h"
-#include "rust-stmt.h"
namespace Rust {
namespace AST {
void
ExpressionYeast::go (AST::Crate &crate)
{
- DefaultASTVisitor::visit (crate);
+ PointerVisitor::visit (crate);
}
void
}
void
-ExpressionYeast::dispatch (std::unique_ptr<Expr> &expr)
+ExpressionYeast::reseat (std::unique_ptr<Expr> &expr)
{
switch (expr->get_expr_kind ())
{
default:
break;
}
-}
-
-void
-ExpressionYeast::visit (ExprStmt &stmt)
-{
- dispatch (stmt.get_expr_ptr ());
-
- DefaultASTVisitor::visit (stmt);
-}
-
-void
-ExpressionYeast::visit (CallExpr &call)
-{
- dispatch (call.get_function_expr_ptr ());
-
- for (auto &arg : call.get_params ())
- dispatch (arg);
-
- DefaultASTVisitor::visit (call);
-}
-
-void
-ExpressionYeast::visit (BlockExpr &block)
-{
- for (auto &stmt : block.get_statements ())
- 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
-ExpressionYeast::visit (LetStmt &stmt)
-{
- if (stmt.has_init_expr ())
- dispatch (stmt.get_init_expr_ptr ());
- DefaultASTVisitor::visit (stmt);
+ visit (expr);
}
} // namespace AST
#ifndef RUST_EXPRESSION_YEAST
#define RUST_EXPRESSION_YEAST
-#include "rust-ast-visitor.h"
+#include "rust-ast-pointer-visitor.h"
#include "rust-ast.h"
#include "rust-desugar-question-mark.h"
// This visitor takes care of all the expression desugars: try-blocks,
// error-propagation, etc.
-class ExpressionYeast : public AST::DefaultASTVisitor
+class ExpressionYeast : public AST::PointerVisitor
{
- using AST::DefaultASTVisitor::visit;
+ using AST::PointerVisitor::reseat;
+ using AST::PointerVisitor::visit;
public:
void go (AST::Crate &);
private:
// Dispatch to the proper desugar
- void dispatch (std::unique_ptr<Expr> &expr);
- void dispatch_loops (std::unique_ptr<Expr> &loop_expr);
+ void reseat (std::unique_ptr<Expr> &expr) override;
- void visit (AST::ExprStmt &) override;
- void visit (AST::CallExpr &) override;
- void visit (AST::LetStmt &) override;
- void visit (AST::BlockExpr &) override;
+ void dispatch_loops (std::unique_ptr<Expr> &loop_expr);
};
} // namespace AST