4#include <llvm/Support/Casting.h>
10concept OnlyStmt = std::derived_from<T, ast::Stmt> && !std::derived_from<T, ast::Expr>;
27 auto kind = stat.
kind();
29 case ast::K_Compound:
return conv_statement<ast::Compound>(stat, args...);
30 case ast::K_While:
return conv_statement<ast::WhileStmt>(stat, args...);
31 case ast::K_If:
return conv_statement<ast::IfStmt>(stat, args...);
32 case ast::K_Return:
return conv_statement<ast::ReturnStmt>(stat, args...);
33 case ast::K_VarDecl:
return conv_statement<ast::VarDecl>(stat, args...);
35 case ast::K_FnDecl:
return conv_statement<ast::FnDecl>(stat, args...);
37 case ast::K_CtorDecl:
return conv_statement<ast::CtorDecl>(stat, args...);
38 default: (
static_cast<Derived*
>(
this))->body_expression(llvm::cast<ast::Expr>(stat), args...);
43 auto kind = expr.
kind();
45 case ast::K_Number:
return conv_expression<ast::NumberExpr>(expr, args...);
46 case ast::K_String:
return conv_expression<ast::StringExpr>(expr, args...);
47 case ast::K_Char:
return conv_expression<ast::CharExpr>(expr, args...);
48 case ast::K_Bool:
return conv_expression<ast::BoolExpr>(expr, args...);
49 case ast::K_Call:
return conv_expression<ast::CallExpr>(expr, args...);
51 case ast::K_Var:
return conv_expression<ast::VarExpr>(expr, args...);
52 case ast::K_Const:
return conv_expression<ast::ConstExpr>(expr, args...);
53 case ast::K_Lambda:
return conv_expression<ast::LambdaExpr>(expr, args...);
54 case ast::K_Assign:
return conv_expression<ast::AssignExpr>(expr, args...);
55 case ast::K_Ctor:
return conv_expression<ast::CtorExpr>(expr, args...);
57 case ast::K_Slice:
return conv_expression<ast::SliceExpr>(expr, args...);
60 case ast::K_TypeExpr:
return conv_expression<ast::TypeExpr>(expr, args...);
61 default:
return (
static_cast<Derived*
>(
this))->template expression(expr, args...);
66 template <std::derived_from<ast::Expr> T>
auto conv_expression(
ast::Expr& expr,
auto... args) {
67 return (
static_cast<Derived*
>(
this))->expression(llvm::cast<T>(expr), args...);
70 template <OnlyStmt T>
void conv_statement(ast::Stmt& stat,
auto... args) {
71 return (
static_cast<Derived*
>(
this))->statement(llvm::cast<T>(stat), args...);
auto kind() const -> Kind
Expressions have an associated value and type.
Statements make up most things in source code.
@ K_BinaryLogic
BinaryLogicExpr
@ K_ImplicitCast
ImplicitCastExpr
@ K_FieldAccess
FieldAccessExpr
A helper template to walk the Abstract Syntax Tree (AST), utilizing the Curiously Recurring Template ...
auto body_statement(ast::Stmt &stat, auto &&... args)
auto body_expression(ast::Expr &expr, auto &&... args)