Files
@ 863da17c9dc3
Branch filter:
Location: CSY/reowolf/src/protocol/parser/pass_rewriting.rs - annotation
863da17c9dc3
2.3 KiB
application/rls-services+xml
Add some tests for goto/select interaction
3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 3bee4ec688b3 | use crate::collections::*;
use crate::protocol::*;
use super::visitor::*;
pub(crate) struct PassRewriting {
statement_buffer: ScopedBuffer<StatementId>,
}
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(())
}
}
|