summaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/builtins/NativeTypes.java8
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/typechecker/TypeChecker.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/NativeTypeConstructor.java9
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/TypeConstructor.java13
-rw-r--r--src/main/java/org/zwobble/hobgoblin/compiler/types/Types.java18
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);
+ };
+ }
+}