From 6b4d2a11537282947dc71a646c168ea1343d6a52 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 1 Aug 2026 09:24:12 +0100 Subject: Support Box in transient-0 --- .../javatransient0/JavaTransient0Generator.java | 8 +++++-- .../rusttransient0/RustTransient0Generator.java | 26 ++++++++++++++++++++-- 2 files changed, 30 insertions(+), 4 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java index dd81f99..e27c606 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/javatransient0/JavaTransient0Generator.java @@ -701,7 +701,9 @@ public class JavaTransient0Generator implements Generator { private List generateEncode(JavaExpression value, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateEncode(value, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateEncodeList(value, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateEncodeOption(value, constructedNativeType.args().getFirst()); @@ -775,7 +777,9 @@ public class JavaTransient0Generator implements Generator { private List generateDecode(JavaIdentifier target, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateDecode(target, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateDecodeList(target, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateDecodeOption(target, constructedNativeType.args().getFirst()); 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 ea1949d..981e02b 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 @@ -578,7 +578,9 @@ public class RustTransient0Generator implements Generator { private RustStatement generateEncode(RustExpression value, Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateEncodeBox(value, constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateEncodeList(value, constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateEncodeOption(value, constructedNativeType.args().getFirst()); @@ -618,7 +620,9 @@ public class RustTransient0Generator implements Generator { private RustExpression generateDecode(Type type) { return switch (type) { case ConstructedNativeType constructedNativeType -> { - if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { + if (constructedNativeType.constructor().equals(NativeTypes.BOX)) { + yield generateDecodeBox(constructedNativeType.args().getFirst()); + } else if (constructedNativeType.constructor().equals(NativeTypes.LIST)) { yield generateDecodeList(constructedNativeType.args().getFirst()); } else if (constructedNativeType.constructor().equals(NativeTypes.OPTION)) { yield generateDecodeOption(constructedNativeType.args().getFirst()); @@ -685,6 +689,24 @@ public class RustTransient0Generator implements Generator { )); } + private RustStatement generateEncodeBox(RustExpression value, Type elementType) { + return generateEncode( + methodCall( + value, + RustIdentifier.of("as_ref"), + List.of() + ), + elementType + ); + } + + private RustExpression generateDecodeBox(Type elementType) { + return new RustCallExpression( + RustTypes.BOX.addSegment(RustPathSegment.of("new")), + List.of(generateDecode(elementType)) + ); + } + private RustStatement generateEncodeList(RustExpression value, Type elementType) { var element = RustIdentifier.of("element"); -- cgit v1.2.3