diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-08-02 14:19:23 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-08-02 14:19:23 +0100 |
| commit | ff49a4cd2231787867b4aafc95bd5705057bfcc3 (patch) | |
| tree | 13ca6588de1f5f5dae010e537c54af3ad8b1c06d /src/main/java/org | |
| parent | f8b54eca1cedff1fcccb099b3cd1dbea81a1410b (diff) | |
Introduce NativeTypeConstructor for greater safety
Diffstat (limited to 'src/main/java/org')
5 files changed, 40 insertions, 17 deletions
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 485df8c..f4e499e 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java @@ -13,7 +13,7 @@ public class NativeTypes { public static final SimpleNativeType BOX_INNER = SimpleNativeType.builtin("Box"); - public static TypeConstructor<SimpleNativeType> BOX = new TypeConstructor<>( + public static TypeConstructor<SimpleNativeType> BOX = Types.constructor( List.of(new TypeParam("T")), BOX_INNER ); @@ -24,7 +24,7 @@ public class NativeTypes { public static final SimpleNativeType LIST_INNER = SimpleNativeType.builtin("List"); - public static TypeConstructor<SimpleNativeType> LIST = new TypeConstructor<>( + public static TypeConstructor<SimpleNativeType> LIST = Types.constructor( List.of(new TypeParam("T")), LIST_INNER ); @@ -35,7 +35,7 @@ public class NativeTypes { public static final SimpleNativeType OPTION_INNER = SimpleNativeType.builtin("Option"); - public static TypeConstructor<SimpleNativeType> OPTION = new TypeConstructor<>( + public static TypeConstructor<SimpleNativeType> OPTION = Types.constructor( List.of(new TypeParam("T")), OPTION_INNER ); @@ -46,7 +46,7 @@ public class NativeTypes { public static final SimpleNativeType SHARED_INNER = SimpleNativeType.builtin("Shared"); - public static TypeConstructor<SimpleNativeType> SHARED = new TypeConstructor<>( + public static TypeConstructor<SimpleNativeType> SHARED = Types.constructor( List.of(new TypeParam("T")), SHARED_INNER ); 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 4b02f60..9429313 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java @@ -408,12 +408,9 @@ public class TypeChecker { .map(untypedArg -> typeCheckMetaType(untypedArg, context).value()) .toList(); - var constructedType = switch (receiver.genericType()) { - case SimpleNativeType _ -> { - @SuppressWarnings("unchecked") - var narrowReceiver = (TypeConstructor<SimpleNativeType>) receiver; - yield new ConstructedNativeType(narrowReceiver, args); - } + var constructedType = switch (receiver) { + case NativeTypeConstructor nativeTypeConstructor -> + new ConstructedNativeType(nativeTypeConstructor, args); }; return new TypedConstructedTypeNode( diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/NativeTypeConstructor.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/NativeTypeConstructor.java new file mode 100644 index 0000000..43e0cfc --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/NativeTypeConstructor.java @@ -0,0 +1,9 @@ +package org.zwobble.hobgoblin.compiler.types; + +import java.util.List; + +public record NativeTypeConstructor( + List<TypeParam> params, + SimpleNativeType genericType +) implements TypeConstructor<SimpleNativeType> { +} diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java index 1e412d7..e2726fb 100644 --- a/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java @@ -2,12 +2,11 @@ package org.zwobble.hobgoblin.compiler.types; import java.util.List; -public record TypeConstructor<T extends ConstructibleType>( - List<TypeParam> params, - T genericType -) implements TypeLevelValue { - @Override - public String describe() { - return genericType.describe(); +public sealed interface TypeConstructor<T extends ConstructibleType> extends TypeLevelValue permits NativeTypeConstructor { + List<TypeParam> params(); + T genericType(); + + default String describe() { + return genericType().describe(); } } diff --git a/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java b/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java new file mode 100644 index 0000000..6d8fcbb --- /dev/null +++ b/src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java @@ -0,0 +1,18 @@ +package org.zwobble.hobgoblin.compiler.types; + +import java.util.List; + +public class Types { + private Types() {} + + @SuppressWarnings("unchecked") + public static <T extends ConstructibleType> TypeConstructor<T> constructor( + List<TypeParam> params, + T genericType + ) { + return (TypeConstructor<T>) switch (genericType) { + case SimpleNativeType simpleNativeType -> + new NativeTypeConstructor(params, simpleNativeType); + }; + } +} |
