diff --git a/src/protocol/ast_printer.rs b/src/protocol/ast_printer.rs index 5529cd3dde91d3b9834ab3cc4ecce3d8641eef9d..22a5db0376dda2d918d174df982d37d19cec4970 100644 --- a/src/protocol/ast_printer.rs +++ b/src/protocol/ast_printer.rs @@ -345,7 +345,7 @@ impl ASTWriter { } } } - Definition::Function(def) => { + Definition::Procedure(def) => { self.kv(indent).with_id(PREFIX_FUNCTION_ID, def.this.0.index) .with_s_key("DefinitionFunction"); @@ -354,10 +354,10 @@ impl ASTWriter { self.kv(indent3).with_s_key("PolyVar").with_identifier_val(&poly_var_id); } - self.kv(indent2).with_s_key("ReturnParserTypes"); - for return_type in &def.return_types { - self.kv(indent3).with_s_key("ReturnParserType") - .with_custom_val(|s| write_parser_type(s, heap, return_type)); + self.kv(indent2).with_s_key("Kind").with_debug_val(&def.kind); + if let Some(parser_type) = &def.return_type { + self.kv(indent2).with_s_key("ReturnParserType") + .with_custom_val(|s| write_parser_type(s, heap, parser_type)); } self.kv(indent2).with_s_key("Parameters"); @@ -368,26 +368,6 @@ impl ASTWriter { self.kv(indent2).with_s_key("Body"); self.write_stmt(heap, def.body.upcast(), indent3); }, - Definition::Component(def) => { - self.kv(indent).with_id(PREFIX_COMPONENT_ID,def.this.0.index) - .with_s_key("DefinitionComponent"); - - self.kv(indent2).with_s_key("Name").with_identifier_val(&def.identifier); - self.kv(indent2).with_s_key("Variant").with_debug_val(&def.variant); - - self.kv(indent2).with_s_key("PolymorphicVariables"); - for poly_var_id in &def.poly_vars { - self.kv(indent3).with_s_key("PolyVar").with_identifier_val(&poly_var_id); - } - - self.kv(indent2).with_s_key("Parameters"); - for variable_id in &def.parameters { - self.write_variable(heap, *variable_id, indent3) - } - - self.kv(indent2).with_s_key("Body"); - self.write_stmt(heap, def.body.upcast(), indent3); - } } } @@ -401,9 +381,7 @@ impl ASTWriter { self.kv(indent).with_id(PREFIX_BLOCK_STMT_ID, stmt.this.0.index) .with_s_key("Block"); 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.scope_node.relative_pos_in_parent); + self.kv(indent2).with_s_key("ScopeID").with_disp_val(&stmt.scope.index); self.kv(indent2).with_s_key("Statements"); for stmt_id in &stmt.statements { @@ -457,11 +435,11 @@ impl ASTWriter { self.write_expr(heap, stmt.test, indent3); self.kv(indent2).with_s_key("TrueBody"); - self.write_stmt(heap, stmt.true_body.upcast(), indent3); + self.write_stmt(heap, stmt.true_case.body, indent3); - if let Some(false_body) = stmt.false_body { + if let Some(false_body) = stmt.false_case { self.kv(indent2).with_s_key("FalseBody"); - self.write_stmt(heap, false_body.upcast(), indent3); + self.write_stmt(heap, false_body.body, indent3); } }, Statement::EndIf(stmt) => { @@ -480,7 +458,7 @@ impl ASTWriter { self.kv(indent2).with_s_key("Condition"); self.write_expr(heap, stmt.test, indent3); self.kv(indent2).with_s_key("Body"); - self.write_stmt(heap, stmt.body.upcast(), indent3); + self.write_stmt(heap, stmt.body, indent3); }, Statement::EndWhile(stmt) => { self.kv(indent).with_id(PREFIX_ENDWHILE_STMT_ID, stmt.this.0.index) @@ -509,7 +487,7 @@ impl ASTWriter { .with_s_key("Synchronous"); self.kv(indent2).with_s_key("EndSync").with_disp_val(&stmt.end_sync.0.index); self.kv(indent2).with_s_key("Body"); - self.write_stmt(heap, stmt.body.upcast(), indent3); + self.write_stmt(heap, stmt.body, indent3); }, Statement::EndSynchronous(stmt) => { self.kv(indent).with_id(PREFIX_ENDSYNC_STMT_ID, stmt.this.0.index) @@ -522,11 +500,11 @@ impl ASTWriter { .with_s_key("Fork"); self.kv(indent2).with_s_key("EndFork").with_disp_val(&stmt.end_fork.0.index); self.kv(indent2).with_s_key("LeftBody"); - self.write_stmt(heap, stmt.left_body.upcast(), indent3); + self.write_stmt(heap, stmt.left_body, indent3); if let Some(right_body_id) = stmt.right_body { self.kv(indent2).with_s_key("RightBody"); - self.write_stmt(heap, right_body_id.upcast(), indent3); + self.write_stmt(heap, right_body_id, indent3); } }, Statement::EndFork(stmt) => { @@ -547,8 +525,10 @@ impl ASTWriter { self.write_stmt(heap, case.guard, indent4); self.kv(indent3).with_s_key("Block"); - self.write_stmt(heap, case.block.upcast(), indent4); + self.write_stmt(heap, case.body, indent4); } + self.kv(indent2).with_s_key("Replacement"); + self.write_stmt(heap, stmt.next, indent3); }, Statement::EndSelect(stmt) => { self.kv(indent).with_id(PREFIX_END_SELECT_STMT_ID, stmt.this.0.index) @@ -596,6 +576,7 @@ impl ASTWriter { Expression::Assignment(expr) => { self.kv(indent).with_id(PREFIX_ASSIGNMENT_EXPR_ID, expr.this.0.index) .with_s_key("AssignmentExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Operation").with_debug_val(&expr.operation); self.kv(indent2).with_s_key("Left"); self.write_expr(heap, expr.left, indent3); @@ -607,6 +588,7 @@ impl ASTWriter { Expression::Binding(expr) => { self.kv(indent).with_id(PREFIX_BINARY_EXPR_ID, expr.this.0.index) .with_s_key("BindingExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("BindToExpression"); self.write_expr(heap, expr.bound_to, indent3); self.kv(indent2).with_s_key("BindFromExpression"); @@ -617,6 +599,7 @@ impl ASTWriter { Expression::Conditional(expr) => { self.kv(indent).with_id(PREFIX_CONDITIONAL_EXPR_ID, expr.this.0.index) .with_s_key("ConditionalExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Condition"); self.write_expr(heap, expr.test, indent3); self.kv(indent2).with_s_key("TrueExpression"); @@ -629,6 +612,7 @@ impl ASTWriter { Expression::Binary(expr) => { self.kv(indent).with_id(PREFIX_BINARY_EXPR_ID, expr.this.0.index) .with_s_key("BinaryExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Operation").with_debug_val(&expr.operation); self.kv(indent2).with_s_key("Left"); self.write_expr(heap, expr.left, indent3); @@ -640,6 +624,7 @@ impl ASTWriter { Expression::Unary(expr) => { self.kv(indent).with_id(PREFIX_UNARY_EXPR_ID, expr.this.0.index) .with_s_key("UnaryExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Operation").with_debug_val(&expr.operation); self.kv(indent2).with_s_key("Argument"); self.write_expr(heap, expr.expression, indent3); @@ -649,6 +634,7 @@ impl ASTWriter { Expression::Indexing(expr) => { self.kv(indent).with_id(PREFIX_INDEXING_EXPR_ID, expr.this.0.index) .with_s_key("IndexingExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Subject"); self.write_expr(heap, expr.subject, indent3); self.kv(indent2).with_s_key("Index"); @@ -659,6 +645,7 @@ impl ASTWriter { Expression::Slicing(expr) => { self.kv(indent).with_id(PREFIX_SLICING_EXPR_ID, expr.this.0.index) .with_s_key("SlicingExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Subject"); self.write_expr(heap, expr.subject, indent3); self.kv(indent2).with_s_key("FromIndex"); @@ -671,6 +658,7 @@ impl ASTWriter { Expression::Select(expr) => { self.kv(indent).with_id(PREFIX_SELECT_EXPR_ID, expr.this.0.index) .with_s_key("SelectExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Subject"); self.write_expr(heap, expr.subject, indent3); @@ -690,6 +678,7 @@ impl ASTWriter { self.kv(indent).with_id(PREFIX_LITERAL_EXPR_ID, expr.this.0.index) .with_s_key("LiteralExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); let val = self.kv(indent2).with_s_key("Value"); match &expr.value { Literal::Null => { val.with_s_val("null"); }, @@ -765,6 +754,7 @@ impl ASTWriter { Expression::Cast(expr) => { self.kv(indent).with_id(PREFIX_CAST_EXPR_ID, expr.this.0.index) .with_s_key("CallExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("ToType") .with_custom_val(|t| write_parser_type(t, heap, &expr.to_type)); self.kv(indent2).with_s_key("Subject"); @@ -776,21 +766,16 @@ impl ASTWriter { self.kv(indent).with_id(PREFIX_CALL_EXPR_ID, expr.this.0.index) .with_s_key("CallExpr"); - let definition = &heap[expr.definition]; - match definition { - Definition::Component(definition) => { - self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&false); - self.kv(indent2).with_s_key("Variant").with_debug_val(&definition.variant); - }, - Definition::Function(definition) => { - self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&definition.builtin); - self.kv(indent2).with_s_key("Variant").with_s_val("Function"); - }, - _ => unreachable!() + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); + self.kv(indent2).with_s_key("Method").with_debug_val(&expr.method); + if !expr.procedure.is_invalid() { + let definition = &heap[expr.procedure]; + self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&definition.builtin); + self.kv(indent2).with_s_key("Variant").with_debug_val(&definition.kind); + self.kv(indent2).with_s_key("MethodName").with_identifier_val(&definition.identifier); + self.kv(indent2).with_s_key("ParserType") + .with_custom_val(|t| write_parser_type(t, heap, &expr.parser_type)); } - self.kv(indent2).with_s_key("MethodName").with_identifier_val(definition.identifier()); - self.kv(indent2).with_s_key("ParserType") - .with_custom_val(|t| write_parser_type(t, heap, &expr.parser_type)); // Arguments self.kv(indent2).with_s_key("Arguments"); @@ -805,6 +790,7 @@ impl ASTWriter { Expression::Variable(expr) => { self.kv(indent).with_id(PREFIX_VARIABLE_EXPR_ID, expr.this.0.index) .with_s_key("VariableExpr"); + self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); self.kv(indent2).with_s_key("Name").with_identifier_val(&expr.identifier); self.kv(indent2).with_s_key("Definition") .with_opt_disp_val(expr.declaration.as_ref().map(|v| &v.index)); @@ -825,7 +811,7 @@ impl ASTWriter { self.kv(indent2).with_s_key("Kind").with_debug_val(&var.kind); self.kv(indent2).with_s_key("ParserType") .with_custom_val(|w| write_parser_type(w, heap, &var.parser_type)); - self.kv(indent2).with_s_key("RelativePos").with_disp_val(&var.relative_pos_in_block); + self.kv(indent2).with_s_key("RelativePos").with_disp_val(&var.relative_pos_in_parent); self.kv(indent2).with_s_key("UniqueScopeID").with_disp_val(&var.unique_id_in_scope); } @@ -854,6 +840,11 @@ fn write_option(target: &mut String, value: Option) { fn write_parser_type(target: &mut String, heap: &Heap, t: &ParserType) { use ParserTypeVariant as PTV; + if t.elements.is_empty() { + target.push_str("no elements in ParserType (can happen due to compiler-inserted AST nodes)"); + return; + } + fn write_element(target: &mut String, heap: &Heap, t: &ParserType, mut element_idx: usize) -> usize { let element = &t.elements[element_idx]; match &element.variant { @@ -950,7 +941,7 @@ fn write_concrete_type(target: &mut String, heap: &Heap, def_id: DefinitionId, t match &t.parts[idx] { CTP::Void => target.push_str("void"), CTP::Message => target.push_str("msg"), - CTP::Bool => target.push_str("bool"), + CTP::Bool => target.push_str(KW_TYPE_BOOL_STR), CTP::UInt8 => target.push_str(KW_TYPE_UINT8_STR), CTP::UInt16 => target.push_str(KW_TYPE_UINT16_STR), CTP::UInt32 => target.push_str(KW_TYPE_UINT32_STR), @@ -961,6 +952,7 @@ fn write_concrete_type(target: &mut String, heap: &Heap, def_id: DefinitionId, t CTP::SInt64 => target.push_str(KW_TYPE_SINT64_STR), CTP::Character => target.push_str(KW_TYPE_CHAR_STR), CTP::String => target.push_str(KW_TYPE_STRING_STR), + CTP::Pointer => target.push('*'), CTP::Array => { idx = write_concrete_part(target, heap, def_id, t, idx + 1); target.push_str("[]");