diff --git a/src/protocol/ast_printer.rs b/src/protocol/ast_printer.rs index 9b894301378e1cc8be76cbde116323b30b0cc3c9..22a5db0376dda2d918d174df982d37d19cec4970 100644 --- a/src/protocol/ast_printer.rs +++ b/src/protocol/ast_printer.rs @@ -527,6 +527,8 @@ impl ASTWriter { self.kv(indent3).with_s_key("Block"); 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) @@ -765,13 +767,15 @@ impl ASTWriter { .with_s_key("CallExpr"); self.kv(indent2).with_s_key("TypeIndex").with_disp_val(&expr.type_index); - - let definition = &heap[expr.procedure]; - self.kv(indent2).with_s_key("BuiltIn").with_disp_val(&false); - 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("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)); + } // Arguments self.kv(indent2).with_s_key("Arguments"); @@ -836,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 {