Files
@ 22954bb75862
Branch filter:
Location: CSY/reowolf/src/protocol/parser/pass_rewriting.rs - annotation
22954bb75862
2.3 KiB
application/rls-services+xml
Add some tests for goto/select interaction
811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f 811e0bec1c0f | 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(())
}
}
|