summaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/typed/TypedSumVariantDefinitionNode.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/ast/untyped/UntypedSumVariantDefinitionNode.java16
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rust/RustGenerator.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttransient0/RustTransient0Generator.java6
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/output/generators/rusttypes/RustTypesGenerator.java28
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Parser.java2
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/TokenType.java1
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/parser/Tokenizer.java4
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java12
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);