diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-01 09:47:15 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-01 09:47:15 +0100 |
| commit | b1a386ca4aab5176566a5c30f747d669a562d8fb (patch) | |
| tree | 793bb38bc2901e6adabaf4f2624496f9ff53e523 /src/main/java/org | |
| parent | 6b4d2a11537282947dc71a646c168ea1343d6a52 (diff) | |
Use Box type instead of box keyword
Diffstat (limited to 'src/main/java/org')
10 files changed, 46 insertions, 38 deletions
diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedSumVariantDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedSumVariantDefinitionNode.java index efbea83..5c2dd6c 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedSumVariantDefinitionNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedSumVariantDefinitionNode.java @@ -5,7 +5,6 @@ import org.zwobble.hobgoblin.compiler.types.Type; public record TypedSumVariantDefinitionNode( TypedTypeLevelExpressionNode<Type> type, - boolean isBox, Source source ) implements TypedNode { } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java index 901c506..48045a3 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java @@ -7,36 +7,30 @@ package org.zwobble.hobgoblin.compiler.ast.untyped; public record UntypedSumVariantDefinitionNode( org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelExpressionNode type, - boolean isBox, org.zwobble.hobgoblin.compiler.sources.Source source ) { public static org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder arbitrary() { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelReferenceNode.arbitrary().build(), false, org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource()); + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelReferenceNode.arbitrary().build(), org.zwobble.hobgoblin.compiler.sources.HobgoblinNativeSources.arbitrarySource()); } public record Builder( org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelExpressionNode type, - boolean isBox, org.zwobble.hobgoblin.compiler.sources.Source source ) { public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode build() { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode(type, isBox, source); + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode(type, source); } public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder withType(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelExpressionNode type) { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type, isBox, source); + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type, source); } public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder withType(org.zwobble.hobgoblin.compiler.ast.untyped.UntypedTypeLevelExpressionNode.Builder type) { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type.build(), isBox, source); - } - - public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder withIsBox(boolean isBox) { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type, isBox, source); + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type.build(), source); } public org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder withSource(org.zwobble.hobgoblin.compiler.sources.Source source) { - return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type, isBox, source); + return new org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder(type, source); } // Custom area start: org.zwobble.hobgoblin.compiler.ast.untyped.UntypedSumVariantDefinitionNode.Builder body diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java index 7f8cf0f..9d81063 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -1,8 +1,6 @@ package org.zwobble.hobgoblin.compiler.builtins; -import org.zwobble.hobgoblin.compiler.types.SimpleNativeType; -import org.zwobble.hobgoblin.compiler.types.TypeConstructor; -import org.zwobble.hobgoblin.compiler.types.TypeParam; +import org.zwobble.hobgoblin.compiler.types.*; import java.util.List; @@ -20,6 +18,10 @@ public class NativeTypes { BOX_INNER ); + public static Type box(Type elementType) { + return new ConstructedNativeType(BOX, List.of(elementType)); + } + public static final SimpleNativeType LIST_INNER = SimpleNativeType.builtin("List"); public static TypeConstructor<SimpleNativeType> LIST = new TypeConstructor<>( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java index 22b6d7d..695f6e7 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java @@ -1,5 +1,6 @@ package org.zwobble.hobgoblin.compiler.output.generators.rust; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.output.lang.rust.RustWriter; import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.*; import org.zwobble.hobgoblin.compiler.types.*; @@ -120,6 +121,11 @@ public class RustGenerator { public RustIdentifier generateVariantName(Type type) { if (type instanceof StructType structType) { return generateTypeName(structType.name()); + } else if ( + type instanceof ConstructedNativeType constructedNativeType && + constructedNativeType.constructor().equals(NativeTypes.BOX) + ) { + return generateVariantName(constructedNativeType.args().getFirst()); } else { throw new UnsupportedOperationException("TODO"); } 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 981e02b..2f07f54 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 @@ -484,12 +484,6 @@ public class RustTransient0Generator implements Generator { .addSegment(RustPathSegment.of(this.rustGenerator.generateVariantName(variantType))); var valueExpression = generateDecode(variantType); - if (variant.isBox()) { - valueExpression = new RustCallExpression( - RustTypes.BOX.addSegment(RustPathSegment.of("new")), - List.of(valueExpression) - ); - } return new RustMatchArm( new RustLiteralPattern(new RustIntegerLiteral(variantIndex, Optional.empty())), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java index 0aaa723..c1c895b 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java @@ -1,13 +1,14 @@ package org.zwobble.hobgoblin.compiler.output.generators.rusttypes; import org.zwobble.hobgoblin.compiler.ast.typed.*; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.config.OutputConfig; import org.zwobble.hobgoblin.compiler.output.generators.Generator; import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGenerator; import org.zwobble.hobgoblin.compiler.output.generators.rust.RustGeneratorConfig; -import org.zwobble.hobgoblin.compiler.output.lang.rust.RustTypes; import org.zwobble.hobgoblin.compiler.output.lang.rust.ast.*; import org.zwobble.hobgoblin.compiler.typechecker.TypesInfo; +import org.zwobble.hobgoblin.compiler.types.ConstructedNativeType; import org.zwobble.hobgoblin.compiler.types.NamespaceName; import org.zwobble.hobgoblin.compiler.types.Type; import org.zwobble.json5.reader.Json5ObjectReader; @@ -165,10 +166,6 @@ public class RustTypesGenerator implements Generator { .map(variant -> { var variantType = generateRustTypeExpression(variant.type(), context); - if (variant.isBox()) { - variantType = RustTypes.box(variantType); - } - return new RustEnumVariant( this.rustGenerator.generateVariantName(variant.type().value()), new RustEnumVariantTuple(List.of( @@ -187,8 +184,21 @@ public class RustTypesGenerator implements Generator { items.add(rustEnum); for (var variant : sumDefinition.variants()) { - var variantType = generateRustTypeExpression(variant.type(), context); var variantName = this.rustGenerator.generateVariantName(variant.type().value()); + + var fromType = variant.type().value(); + var isBox = false; + + if ( + variant.type().value() instanceof ConstructedNativeType variantConstructedNativeType && + variantConstructedNativeType.constructor().equals(NativeTypes.BOX) + ) { + fromType = variantConstructedNativeType.args().getFirst(); + isBox = true; + } + + var fromRustType = this.rustGenerator.generateRustTypeExpression(fromType); + var innerValueName = new RustIdentifier("value"); RustExpression innerValue = new RustPath(List.of( new RustPathSegment( @@ -197,7 +207,7 @@ public class RustTypesGenerator implements Generator { ) )); - if (variant.isBox()) { + if (isBox) { innerValue = new RustCallExpression( RustPath.global("std", "boxed", "Box", "new"), List.of(innerValue) @@ -206,13 +216,13 @@ public class RustTypesGenerator implements Generator { var fromImpl = new RustTraitImpl( RustPath.global("std", "convert", "From") - .withArgs(List.of(variantType)), + .withArgs(List.of(fromRustType)), this.rustGenerator.generateRustTypeExpression(sumDefinition.type()), List.of( new RustFunction( Optional.empty(), new RustIdentifier("from"), - List.of(new RustFunctionParam(innerValueName, variantType)), + List.of(new RustFunctionParam(innerValueName, fromRustType)), Optional.of(RustPath.selfType()), Optional.of(new RustBlockExpression( List.of(), diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java index e312f30..ab88af0 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java @@ -304,7 +304,6 @@ public class Parser { tokens.skip(TokenType.KEYWORD_VARIANT); var type = parseTypeLevelExpression(tokens); - var isBox = tokens.trySkip(TokenType.KEYWORD_BOX); tokens.skip(TokenType.SYMBOL_SEMICOLON); var end = tokens.endPosition(); @@ -312,7 +311,6 @@ public class Parser { return new UntypedSumVariantDefinitionNode( type, - isBox, source ); } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java index 610359e..df86ae6 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java @@ -6,7 +6,6 @@ enum TokenType { IDENTIFIER, WHITESPACE, - KEYWORD_BOX, KEYWORD_ENUM, KEYWORD_FIELD, KEYWORD_FROM, diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java index a07afc8..c0cf716 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java @@ -122,9 +122,7 @@ class Tokenizer { var sourceRange = start.to(end); TokenType tokenType; - if (CharSequence.compare(sourceRange.charSequence(), "box") == 0) { - tokenType = TokenType.KEYWORD_BOX; - } else if (CharSequence.compare(sourceRange.charSequence(), "enum") == 0) { + if (CharSequence.compare(sourceRange.charSequence(), "enum") == 0) { tokenType = TokenType.KEYWORD_ENUM; } else if (CharSequence.compare(sourceRange.charSequence(), "field") == 0) { tokenType = TokenType.KEYWORD_FIELD; diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java index f448a56..7ac14fe 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -2,6 +2,7 @@ package org.zwobble.hobgoblin.compiler.typechecker; import org.zwobble.hobgoblin.compiler.ast.typed.*; import org.zwobble.hobgoblin.compiler.ast.untyped.*; +import org.zwobble.hobgoblin.compiler.builtins.NativeTypes; import org.zwobble.hobgoblin.compiler.sources.Source; import org.zwobble.hobgoblin.compiler.typechecker.errors.*; import org.zwobble.hobgoblin.compiler.types.*; @@ -272,12 +273,19 @@ public class TypeChecker { var variantType = typeCheckMetaType(untypedVariant.type(), context); var typedVariant = new TypedSumVariantDefinitionNode( variantType, - untypedVariant.isBox(), untyped.source() ); typedVariants.add(typedVariant); + // TODO: handle not struct type - variantTypes.add((StructType) variantType.value()); + if ( + variantType.value() instanceof ConstructedNativeType variantConstructedNativeType && + variantConstructedNativeType.constructor().equals(NativeTypes.BOX) + ) { + variantTypes.add((StructType) variantConstructedNativeType.args().getFirst()); + } else { + variantTypes.add((StructType) variantType.value()); + } } var typeCheckedFieldDefinitions = typeCheckFieldDefinitions(untyped.fields(), context); |
