From bf60176622a9f1842e7515cb3f8738ca6263705e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 19 Jul 2026 21:48:09 +0100 Subject: Return single statement from generateEncode() --- .../output/rust/src/gen/data/transient_0.rs | 44 ++--- .../output/rust/src/gen/transient_0.rs | 4 +- .../rusttransient0/RustTransient0Generator.java | 205 ++++++++++----------- 3 files changed, 112 insertions(+), 141 deletions(-) diff --git a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs b/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs index 0ea3f6f..e32d42f 100644 --- a/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs +++ b/examples/10-transient-0/output/rust/src/gen/data/transient_0.rs @@ -75,15 +75,15 @@ pub fn decode_inner_struct(reader: &mut impl std::io::Read) -> ::std::io::Result pub fn encode_struct_with_list(value: &crate::data::StructWithList, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { { crate::transient_0::encode_int_64(&(((&value.a).len()).try_into()).unwrap(), writer)?; - }; - for element in &value.a { - crate::transient_0::encode_int_64(element, writer)?; + for element in &value.a { + crate::transient_0::encode_int_64(element, writer)?; + }; }; { crate::transient_0::encode_int_64(&(((&value.b).len()).try_into()).unwrap(), writer)?; - }; - for element in &value.b { - crate::data::transient_0::encode_inner_struct(element, writer)?; + for element in &value.b { + crate::data::transient_0::encode_inner_struct(element, writer)?; + }; }; ::std::io::Result::Ok(()) } @@ -110,22 +110,14 @@ pub fn decode_struct_with_list(reader: &mut impl std::io::Read) -> ::std::io::Re pub fn encode_struct_with_option(value: &crate::data::StructWithOption, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { if (&value.a).is_some() { - { - crate::transient_0::encode_bool(&true, writer)?; - }; - { - crate::transient_0::encode_int_64(&((&value.a).as_ref()).unwrap(), writer)?; - }; + crate::transient_0::encode_bool(&true, writer)?; + crate::transient_0::encode_int_64(&((&value.a).as_ref()).unwrap(), writer)?; } else { crate::transient_0::encode_bool(&false, writer)?; }; if (&value.b).is_some() { - { - crate::transient_0::encode_bool(&true, writer)?; - }; - { - crate::data::transient_0::encode_inner_struct(&((&value.b).as_ref()).unwrap(), writer)?; - }; + crate::transient_0::encode_bool(&true, writer)?; + crate::data::transient_0::encode_inner_struct(&((&value.b).as_ref()).unwrap(), writer)?; } else { crate::transient_0::encode_bool(&false, writer)?; }; @@ -173,20 +165,12 @@ pub fn decode_enum_with_variants(reader: &mut impl std::io::Read) -> ::std::io:: pub fn encode_sum_with_variants(value: &crate::data::SumWithVariants, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { match value { crate::data::SumWithVariants::VariantOne(value) => { - { - crate::transient_0::encode_int_32(&0, writer)?; - }; - { - crate::data::transient_0::encode_variant_one(value, writer)?; - }; + crate::transient_0::encode_int_32(&0, writer)?; + crate::data::transient_0::encode_variant_one(value, writer)?; }, crate::data::SumWithVariants::VariantTwo(value) => { - { - crate::transient_0::encode_int_32(&1, writer)?; - }; - { - crate::data::transient_0::encode_variant_two(value, writer)?; - }; + crate::transient_0::encode_int_32(&1, writer)?; + crate::data::transient_0::encode_variant_two(value, writer)?; }, }; ::std::io::Result::Ok(()) diff --git a/examples/10-transient-0/output/rust/src/gen/transient_0.rs b/examples/10-transient-0/output/rust/src/gen/transient_0.rs index 24f5c9c..753dd23 100644 --- a/examples/10-transient-0/output/rust/src/gen/transient_0.rs +++ b/examples/10-transient-0/output/rust/src/gen/transient_0.rs @@ -54,9 +54,7 @@ pub fn decode_int_64(reader: &mut impl std::io::Read) -> ::std::io::Result::<::c } pub fn encode_string(value: &::std::string::String, writer: &mut impl std::io::Write) -> ::std::io::Result::<()> { - { - crate::transient_0::encode_int_64(&((value.len()).try_into()).unwrap(), writer)?; - }; + crate::transient_0::encode_int_64(&((value.len()).try_into()).unwrap(), writer)?; writer.write_all(value.as_bytes())?; ::std::io::Result::Ok(()) } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java index fd7bd34..165880f 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java @@ -218,20 +218,17 @@ public class RustTransient0Generator implements Generator { return generateEncodeFunction( NativeTypes.STRING, List.of( - new RustExpressionStatement(new RustBlockExpression( - generateEncode( - new RustPrefixExpression( - RustPrefixOperator.BORROW, - tryIntoOrUnwrap(methodCall( - RustPath.of(VALUE_NAME), - RustIdentifier.of("len"), - List.of() - )) - ), - NativeTypes.INT_64 + generateEncode( + new RustPrefixExpression( + RustPrefixOperator.BORROW, + tryIntoOrUnwrap(methodCall( + RustPath.of(VALUE_NAME), + RustIdentifier.of("len"), + List.of() + )) ), - Optional.empty() - )), + NativeTypes.INT_64 + ), new RustExpressionStatement(generateWriterWrite( methodCall( RustPath.of(VALUE_NAME), @@ -298,26 +295,30 @@ public class RustTransient0Generator implements Generator { ) { return switch (statement) { case TypedEnumDefinitionNode enumDefinition -> { + var ordinalExpression = new RustMatchExpression( + RustPath.of(VALUE_NAME), + IntStream.range(0, enumDefinition.variants().size()) + .mapToObj(variantIndex -> { + var variant = enumDefinition.variants().get(variantIndex); + var variantPath = this.rustGenerator.generateRustTypeExpression(enumDefinition.type()) + .addSegment(RustPathSegment.of(this.rustGenerator.generateVariantName(variant.name()))); + + return new RustMatchArm( + new RustPathPattern(variantPath), + new RustIntegerLiteral(variantIndex, Optional.empty()) + ); + }) + .toList() + ); + var encodeFunction = generateEncodeFunction( enumDefinition.type(), - generateEncode(new RustPrefixExpression( - RustPrefixOperator.BORROW, - new RustMatchExpression( - RustPath.of(VALUE_NAME), - IntStream.range(0, enumDefinition.variants().size()) - .mapToObj(variantIndex -> { - var variant = enumDefinition.variants().get(variantIndex); - var variantPath = this.rustGenerator.generateRustTypeExpression(enumDefinition.type()) - .addSegment(RustPathSegment.of(this.rustGenerator.generateVariantName(variant.name()))); - - return new RustMatchArm( - new RustPathPattern(variantPath), - new RustIntegerLiteral(variantIndex, Optional.empty()) - ); - }) - .toList() - ) - ), NativeTypes.INT_32) + List.of( + generateEncode(new RustPrefixExpression( + RustPrefixOperator.BORROW, + ordinalExpression + ), NativeTypes.INT_32) + ) ); var decodeMatchArms = IntStream.range(0, enumDefinition.variants().size()) @@ -369,7 +370,7 @@ public class RustTransient0Generator implements Generator { generateEncodeFunction( structDefinition.type(), structDefinition.fields().stream() - .flatMap(field -> generateEncode( + .map(field -> generateEncode( new RustPrefixExpression( RustPrefixOperator.BORROW, new RustFieldExpression( @@ -378,7 +379,7 @@ public class RustTransient0Generator implements Generator { ) ), field.type().value() - ).stream()) + )) .toList() ), generateDecodeFunction( @@ -422,20 +423,14 @@ public class RustTransient0Generator implements Generator { new RustTupleStructPattern(variantPath, List.of(new RustIdentifierPattern(VALUE_NAME))), new RustBlockExpression( List.of( - new RustExpressionStatement(new RustBlockExpression( - generateEncode( - new RustPrefixExpression( - RustPrefixOperator.BORROW, - new RustIntegerLiteral(variantIndex, Optional.empty()) - ), - NativeTypes.INT_32 + generateEncode( + new RustPrefixExpression( + RustPrefixOperator.BORROW, + new RustIntegerLiteral(variantIndex, Optional.empty()) ), - Optional.empty() - )), - new RustExpressionStatement(new RustBlockExpression( - generateEncode(RustPath.of(VALUE_NAME), variantType), - Optional.empty() - )) + NativeTypes.INT_32 + ), + generateEncode(RustPath.of(VALUE_NAME), variantType) ), Optional.empty() ) @@ -536,7 +531,7 @@ public class RustTransient0Generator implements Generator { ); } - private List generateEncode(RustExpression value, Type type) { + private RustStatement generateEncode(RustExpression value, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { @@ -544,12 +539,12 @@ public class RustTransient0Generator implements Generator { } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateEncodeOption(value, constructedNativeType.args().getFirst()); } else { - yield List.of(new RustExpressionStatement(generateTodo())); + yield new RustExpressionStatement(generateTodo()); } } case EnumType enumType -> { - yield List.of(new RustExpressionStatement(generateTodo())); + yield new RustExpressionStatement(generateTodo()); } case SimpleNativeType nativeType -> { @@ -561,15 +556,15 @@ public class RustTransient0Generator implements Generator { } case SumType sumType -> { - yield List.of(new RustExpressionStatement(generateTodo())); + yield new RustExpressionStatement(generateTodo()); } case TypeLevelValueType typeLevelValueType -> { - yield List.of(new RustExpressionStatement(generateTodo())); + yield new RustExpressionStatement(generateTodo()); } case TypeParam typeParam -> { - yield List.of(new RustExpressionStatement(generateTodo())); + yield new RustExpressionStatement(generateTodo()); } }; } @@ -612,7 +607,7 @@ public class RustTransient0Generator implements Generator { }; } - private List generateEncode(RustExpression value, NamespaceName typeNamespaceName, Type type) { + private RustStatement generateEncode(RustExpression value, NamespaceName typeNamespaceName, Type type) { var rustEncodeFunctionPathSegments = new ArrayList<>( this.generateTransient0ModuleName(typeNamespaceName) ); @@ -621,12 +616,10 @@ public class RustTransient0Generator implements Generator { rustEncodeFunctionPathSegments ); - return List.of( - new RustExpressionStatement(new RustTryPropagationExpression(new RustCallExpression( - rustEncodeFunctionPath, - List.of(value, RustPath.of(WRITER_NAME)) - ))) - ); + return new RustExpressionStatement(new RustTryPropagationExpression(new RustCallExpression( + rustEncodeFunctionPath, + List.of(value, RustPath.of(WRITER_NAME)) + ))); } private RustExpression generateDecode(NamespaceName typeNamespaceName, Type type) { @@ -644,11 +637,11 @@ public class RustTransient0Generator implements Generator { )); } - private List generateEncodeList(RustExpression value, Type elementType) { + private RustStatement generateEncodeList(RustExpression value, Type elementType) { var element = RustIdentifier.of("element"); - return List.of( - new RustExpressionStatement(new RustBlockExpression( + return new RustExpressionStatement(new RustBlockExpression( + List.of( generateEncode( new RustPrefixExpression( RustPrefixOperator.BORROW, @@ -656,17 +649,19 @@ public class RustTransient0Generator implements Generator { ), NativeTypes.INT_64 ), - Optional.empty() - )), - new RustExpressionStatement(new RustIteratorLoopExpression( - new RustIdentifierPattern(element), - value, - new RustBlockExpression( - generateEncode(RustPath.of(element), elementType), - Optional.empty() - ) - )) - ); + new RustExpressionStatement(new RustIteratorLoopExpression( + new RustIdentifierPattern(element), + value, + new RustBlockExpression( + List.of( + generateEncode(RustPath.of(element), elementType) + ), + Optional.empty() + ) + )) + ), + Optional.empty() + )); } private RustExpression generateDecodeList(Type elementType) { @@ -699,46 +694,40 @@ public class RustTransient0Generator implements Generator { ); } - private List generateEncodeOption(RustExpression value, Type elementType) { - return List.of( - // TODO: pattern matching - new RustExpressionStatement(new RustIfExpression( - methodCall(value, RustIdentifier.of("is_some"), List.of()), - new RustBlockExpression( - List.of( - new RustExpressionStatement(new RustBlockExpression( - generateEncode( - new RustPrefixExpression(RustPrefixOperator.BORROW, new RustBoolLiteral(true)), - NativeTypes.BOOL - ), - Optional.empty() - )), - new RustExpressionStatement(new RustBlockExpression( - generateEncode( - new RustPrefixExpression( - RustPrefixOperator.BORROW, - methodCall( - methodCall(value, RustIdentifier.of("as_ref"), List.of()), - RustIdentifier.of("unwrap"), - List.of() - ) - ), - elementType - ), - Optional.empty() - )) + private RustStatement generateEncodeOption(RustExpression value, Type elementType) { + // TODO: pattern matching + return new RustExpressionStatement(new RustIfExpression( + methodCall(value, RustIdentifier.of("is_some"), List.of()), + new RustBlockExpression( + List.of( + generateEncode( + new RustPrefixExpression(RustPrefixOperator.BORROW, new RustBoolLiteral(true)), + NativeTypes.BOOL ), - Optional.empty() + generateEncode( + new RustPrefixExpression( + RustPrefixOperator.BORROW, + methodCall( + methodCall(value, RustIdentifier.of("as_ref"), List.of()), + RustIdentifier.of("unwrap"), + List.of() + ) + ), + elementType + ) ), - new RustBlockExpression( + Optional.empty() + ), + new RustBlockExpression( + List.of( generateEncode( new RustPrefixExpression(RustPrefixOperator.BORROW, new RustBoolLiteral(false)), NativeTypes.BOOL - ), - Optional.empty() - ) - )) - ); + ) + ), + Optional.empty() + ) + )); } private RustExpression generateDecodeOption(Type elementType) { -- cgit v1.2.3