diff --git a/src/protocol/ast_printer.rs b/src/protocol/ast_printer.rs index 5a0c23a1af62f4b4e996f4d1a5648c11a9a96186..92c14d0d7f752d2ac9511911219cdf90d381aee4 100644 --- a/src/protocol/ast_printer.rs +++ b/src/protocol/ast_printer.rs @@ -275,7 +275,24 @@ impl ASTWriter { let indent4 = indent3 + 1; match &heap[def_id] { - Definition::Struct(_) => todo!("implement Definition::Struct"), + Definition::Struct(def) => { + self.kv(indent).with_id(PREFIX_STRUCT_ID, def.this.0.index) + .with_s_key("DefinitionStruct"); + + self.kv(indent2).with_s_key("Name").with_ascii_val(&def.identifier.value); + for poly_var_id in &def.poly_vars { + self.kv(indent3).with_s_key("PolyVar").with_ascii_val(&poly_var_id.value); + } + + self.kv(indent2).with_s_key("Fields"); + for field in &def.fields { + self.kv(indent3).with_s_key("Field"); + self.kv(indent4).with_s_key("Name") + .with_ascii_val(&field.field.value); + self.kv(indent4).with_s_key("Type") + .with_custom_val(|s| write_parser_type(s, heap, &heap[field.parser_type])); + } + }, Definition::Enum(def) => { self.kv(indent).with_id(PREFIX_ENUM_ID, def.this.0.index) .with_s_key("DefinitionEnum"); @@ -290,7 +307,13 @@ impl ASTWriter { self.kv(indent3).with_s_key("Variant"); self.kv(indent4).with_s_key("Name") .with_ascii_val(&variant.identifier.value); - // TODO: Attached value + let variant_value = self.kv(indent4).with_s_key("Value"); + match &variant.value { + EnumVariantValue::None => variant_value.with_s_val("None"), + EnumVariantValue::Integer(value) => variant_value.with_disp_val(value), + EnumVariantValue::Type(parser_type_id) => variant_value + .with_custom_val(|s| write_parser_type(s, heap, &heap[*parser_type_id])), + }; } }, Definition::Function(def) => { diff --git a/src/protocol/parser/mod.rs b/src/protocol/parser/mod.rs index f05b8faf04146540c90c2543161b34058fd56fe8..2ecd781606c3c13ddfd54b1bd62533da5564bc26 100644 --- a/src/protocol/parser/mod.rs +++ b/src/protocol/parser/mod.rs @@ -234,9 +234,9 @@ impl Parser { } } - let mut writer = ASTWriter::new(); - let mut file = std::fs::File::create(std::path::Path::new("ast.txt")).unwrap(); - writer.write_ast(&mut file, &self.heap); + // let mut writer = ASTWriter::new(); + // let mut file = std::fs::File::create(std::path::Path::new("ast.txt")).unwrap(); + // writer.write_ast(&mut file, &self.heap); Ok(()) } diff --git a/src/protocol/parser/visitor_linker.rs b/src/protocol/parser/visitor_linker.rs index aa7b9ee5f5df6edf27635f665f93cf9da68dd0ec..ffd76d988bd8abd78a9febacedd9de789746b035 100644 --- a/src/protocol/parser/visitor_linker.rs +++ b/src/protocol/parser/visitor_linker.rs @@ -1187,7 +1187,8 @@ impl ValidityAndLinkerVisitor { symbolic.poly_args2.push(self.parser_type_buffer.pop().unwrap()); } } else if !symbolic.identifier.poly_args.is_empty() { - symbolic.poly_args2.extend(&symbolic.identifier.poly_args) + symbolic.poly_args2.extend(&symbolic.identifier.poly_args); + self.parser_type_buffer.extend(&symbolic.poly_args2); } symbolic.variant = Some(symbolic_variant); } else { diff --git a/src/protocol/tests/utils.rs b/src/protocol/tests/utils.rs index 5b1c07dd45fe71c3196c467b4d7bacd49b7c2e97..d024b850a84b2ccec71ed575d289726037684ae6 100644 --- a/src/protocol/tests/utils.rs +++ b/src/protocol/tests/utils.rs @@ -781,6 +781,7 @@ fn serialize_concrete_type(buffer: &mut String, heap: &Heap, def: DefinitionId, Definition::Function(definition) => &definition.poly_vars, Definition::Component(definition) => &definition.poly_vars, Definition::Struct(definition) => &definition.poly_vars, + Definition::Enum(definition) => &definition.poly_vars, _ => unreachable!("Error in testing utility: unexpected type for concrete type serialization"), };