diff --git a/src/protocol/parser/pass_rewriting.rs b/src/protocol/parser/pass_rewriting.rs new file mode 100644 index 0000000000000000000000000000000000000000..3e3a117ed71dae830de1af1d9180ac5d5eb72818 --- /dev/null +++ b/src/protocol/parser/pass_rewriting.rs @@ -0,0 +1,80 @@ +use crate::collections::*; +use crate::protocol::*; + +use super::visitor::*; + +pub(crate) struct PassRewriting { + statement_buffer: ScopedBuffer, +} + +impl PassRewriting { + pub(crate) fn new() -> Self { + Self{ + statement_buffer: ScopedBuffer::with_capacity(16), + } + } +} + +impl Visitor for PassRewriting { + // --- Visiting procedures + + fn visit_component_definition(&mut self, ctx: &mut Ctx, id: ComponentDefinitionId) -> VisitorResult { + let def = &ctx.heap[id]; + let body_id = def.body; + return self.visit_block_stmt(ctx, body_id); + } + + fn visit_function_definition(&mut self, ctx: &mut Ctx, id: FunctionDefinitionId) -> VisitorResult { + let def = &ctx.heap[id]; + let body_id = def.body; + return self.visit_block_stmt(ctx, body_id); + } + + // --- Visiting statements (that are not the select statement) + + fn visit_block_stmt(&mut self, ctx: &mut Ctx, id: BlockStatementId) -> VisitorResult { + let block_stmt = &ctx.heap[id]; + let stmt_section = self.statement_buffer.start_section_initialized(&block_stmt.statements); + + for stmt_idx in 0..stmt_section.len() { + self.visit_stmt(ctx, stmt_section[stmt_idx])?; + } + + stmt_section.forget(); + return Ok(()) + } + + fn visit_labeled_stmt(&mut self, ctx: &mut Ctx, id: LabeledStatementId) -> VisitorResult { + let labeled_stmt = &ctx.heap[id]; + let body_id = labeled_stmt.body; + return self.visit_stmt(ctx, body_id); + } + + fn visit_if_stmt(&mut self, ctx: &mut Ctx, id: IfStatementId) -> VisitorResult { + let if_stmt = &ctx.heap[id]; + let true_body_id = if_stmt.true_body; + let false_body_id = if_stmt.false_body; + + self.visit_block_stmt(ctx, true_body_id)?; + if let Some(false_body_id) = false_body_id { + self.visit_block_stmt(ctx, false_body_id)?; + } + + return Ok(()) + } + + fn visit_while_stmt(&mut self, ctx: &mut Ctx, id: WhileStatementId) -> VisitorResult { + let while_stmt = &ctx.heap[id]; + let body_id = while_stmt.body; + return self.visit_block_stmt(ctx, body_id); + } + + // --- Visiting the select statement + + fn visit_select_stmt(&mut self, ctx: &mut Ctx, id: SelectStatementId) -> VisitorResult { + let stmt = &ctx.heap[id]; + + + return Ok(()) + } +} \ No newline at end of file