diff --git a/schala-lang/language/src/ast/visitor.rs b/schala-lang/language/src/ast/visitor.rs index 13dd73c..e05412e 100644 --- a/schala-lang/language/src/ast/visitor.rs +++ b/schala-lang/language/src/ast/visitor.rs @@ -6,7 +6,8 @@ use crate::ast::*; pub trait ASTVisitor: Sized { fn ast(&mut self, _ast: &AST) {} - fn block(&mut self, _statements: &Vec) {} + fn enter_block(&mut self, _statements: &Vec) {} + fn exit_block(&mut self, _statements: &Vec) {} fn statement(&mut self, _statement: &Statement) {} fn declaration(&mut self, _declaration: &Declaration) {} fn signature(&mut self, _signature: &Signature) {} @@ -55,9 +56,17 @@ pub trait ExpressionVisitor { fn string_literal(&mut self, _value: &Rc) -> Self::Output; fn binexp(&mut self, _op: &BinOp, _lhs_resul: Self::Output, _rhs_result: Self::Output) -> Self::Output; fn tuple_literal(&mut self, _items: Vec) -> Self::Output; + fn visit_statement(&mut self) -> StatementVisitor; fn done(&mut self, kind: Self::Output, anno: Option) -> Self::Output; } +pub trait StatementVisitor { + type Output; + + fn expression(&mut self) -> Self::Output; + fn declaration(&mut self, &Declaration) -> Self::Output; +} + pub fn dispatch_expression(input: &Expression, visitor: &mut dyn ExpressionVisitor) -> Result { let output = match input.kind { diff --git a/schala-lang/language/src/ast/walker.rs b/schala-lang/language/src/ast/walker.rs index 1125b38..f38e065 100644 --- a/schala-lang/language/src/ast/walker.rs +++ b/schala-lang/language/src/ast/walker.rs @@ -1,7 +1,7 @@ #![allow(dead_code)] use std::rc::Rc; use crate::ast::*; -use crate::ast::visitor::ASTVisitor; +use crate::ast::visitor::{ASTVisitor, BlockEntry}; use crate::util::deref_optional_box; pub fn walk_ast(v: &mut V, ast: &AST) { @@ -10,10 +10,12 @@ pub fn walk_ast(v: &mut V, ast: &AST) { } fn walk_block(v: &mut V, block: &Vec) { + v.enter_block(&block); for s in block { v.statement(s); statement(v, s); } + v.exit_block(&block); } fn statement(v: &mut V, statement: &Statement) { @@ -44,7 +46,6 @@ fn declaration(v: &mut V, decl: &Declaration) { }, FuncDecl(sig, block) => { v.signature(&sig); - v.block(&block); walk_block(v, block); }, TypeDecl { name, body, mutable } => v.type_declaration(name, body, *mutable), @@ -123,7 +124,6 @@ fn lambda(v: &mut V, params: &Vec, type_anno: Option formal_param(v, param); } v.type_annotation(type_anno); - v.block(body); walk_block(v, body); } @@ -234,7 +234,6 @@ fn condition_arm(v: &mut V, arm: &ConditionArm) { v.expression(guard); expression(v, guard); }); - v.block(&arm.body); walk_block(v, &arm.body); }