diff --git a/src/protocol/ast_printer.rs b/src/protocol/ast_printer.rs index 6bdc0dd1171d61344c781fe57b0ee3e296f35098..5529cd3dde91d3b9834ab3cc4ecce3d8641eef9d 100644 --- a/src/protocol/ast_printer.rs +++ b/src/protocol/ast_printer.rs @@ -38,6 +38,8 @@ const PREFIX_SYNC_STMT_ID: &'static str = "SSyn"; const PREFIX_ENDSYNC_STMT_ID: &'static str = "SESy"; const PREFIX_FORK_STMT_ID: &'static str = "SFrk"; const PREFIX_END_FORK_STMT_ID: &'static str = "SEFk"; +const PREFIX_SELECT_STMT_ID: &'static str = "SSel"; +const PREFIX_END_SELECT_STMT_ID: &'static str = "SESl"; const PREFIX_RETURN_STMT_ID: &'static str = "SRet"; const PREFIX_ASSERT_STMT_ID: &'static str = "SAsr"; const PREFIX_GOTO_STMT_ID: &'static str = "SGot"; @@ -401,7 +403,7 @@ impl ASTWriter { self.kv(indent2).with_s_key("EndBlockID").with_disp_val(&stmt.end_block.0.index); self.kv(indent2).with_s_key("FirstUniqueScopeID").with_disp_val(&stmt.first_unique_id_in_scope); self.kv(indent2).with_s_key("NextUniqueScopeID").with_disp_val(&stmt.next_unique_id_in_scope); - self.kv(indent2).with_s_key("RelativePos").with_disp_val(&stmt.relative_pos_in_parent); + self.kv(indent2).with_s_key("RelativePos").with_disp_val(&stmt.scope_node.relative_pos_in_parent); self.kv(indent2).with_s_key("Statements"); for stmt_id in &stmt.statements { @@ -431,6 +433,8 @@ impl ASTWriter { self.kv(indent2).with_s_key("Variable"); self.write_variable(heap, stmt.variable, indent3); + self.kv(indent2).with_s_key("InitialValue"); + self.write_expr(heap, stmt.initial_expr.upcast(), indent3); self.kv(indent2).with_s_key("Next").with_disp_val(&stmt.next.index); } } @@ -490,7 +494,7 @@ impl ASTWriter { self.kv(indent2).with_s_key("Label") .with_opt_identifier_val(stmt.label.as_ref()); self.kv(indent2).with_s_key("Target") - .with_opt_disp_val(stmt.target.as_ref().map(|v| &v.0.index)); + .with_disp_val(&stmt.target.0.index); }, Statement::Continue(stmt) => { self.kv(indent).with_id(PREFIX_CONTINUE_STMT_ID, stmt.this.0.index) @@ -498,7 +502,7 @@ impl ASTWriter { self.kv(indent2).with_s_key("Label") .with_opt_identifier_val(stmt.label.as_ref()); self.kv(indent2).with_s_key("Target") - .with_opt_disp_val(stmt.target.as_ref().map(|v| &v.0.index)); + .with_disp_val(&stmt.target.0.index); }, Statement::Synchronous(stmt) => { self.kv(indent).with_id(PREFIX_SYNC_STMT_ID, stmt.this.0.index) @@ -530,6 +534,27 @@ impl ASTWriter { .with_s_key("EndFork"); self.kv(indent2).with_s_key("StartFork").with_disp_val(&stmt.start_fork.0.index); self.kv(indent2).with_s_key("Next").with_disp_val(&stmt.next.index); + }, + Statement::Select(stmt) => { + self.kv(indent).with_id(PREFIX_SELECT_STMT_ID, stmt.this.0.index) + .with_s_key("Select"); + self.kv(indent2).with_s_key("EndSelect").with_disp_val(&stmt.end_select.0.index); + self.kv(indent2).with_s_key("Cases"); + let indent3 = indent2 + 1; + let indent4 = indent3 + 1; + for case in &stmt.cases { + self.kv(indent3).with_s_key("Guard"); + self.write_stmt(heap, case.guard, indent4); + + self.kv(indent3).with_s_key("Block"); + self.write_stmt(heap, case.block.upcast(), indent4); + } + }, + Statement::EndSelect(stmt) => { + self.kv(indent).with_id(PREFIX_END_SELECT_STMT_ID, stmt.this.0.index) + .with_s_key("EndSelect"); + self.kv(indent2).with_s_key("StartSelect").with_disp_val(&stmt.start_select.0.index); + self.kv(indent2).with_s_key("Next").with_disp_val(&stmt.next.index); } Statement::Return(stmt) => { self.kv(indent).with_id(PREFIX_RETURN_STMT_ID, stmt.this.0.index) @@ -544,7 +569,7 @@ impl ASTWriter { .with_s_key("Goto"); self.kv(indent2).with_s_key("Label").with_identifier_val(&stmt.label); self.kv(indent2).with_s_key("Target") - .with_opt_disp_val(stmt.target.as_ref().map(|v| &v.0.index)); + .with_disp_val(&stmt.target.0.index); }, Statement::New(stmt) => { self.kv(indent).with_id(PREFIX_NEW_STMT_ID, stmt.this.0.index) @@ -991,6 +1016,7 @@ fn write_expression_parent(target: &mut String, parent: &ExpressionParent) { *target = match parent { EP::None => String::from("None"), + EP::Memory(id) => format!("MemStmt({})", id.0.0.index), EP::If(id) => format!("IfStmt({})", id.0.index), EP::While(id) => format!("WhileStmt({})", id.0.index), EP::Return(id) => format!("ReturnStmt({})", id.0.index),