aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-01 22:18:35 +0100
committerMichael Williamson <mike@zwobble.org>2023-10-01 22:18:35 +0100
commite402dc37b14873900b19361c5f64bea745204dd9 (patch)
treea88e393e39d5f6b84728ed2802fe5e6825696fc5 /src/main/java
parentf650c01fea4d6116f5d8ed14a1b92c7bdab6697e (diff)
Require when cases to be structs
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java20
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java1
5 files changed, 25 insertions, 4 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java
index b50003ba..eb614cfc 100644
--- a/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedWhenCaseNode.java
@@ -1,10 +1,10 @@
package org.shedlang.compiler.ast.typed;
import org.shedlang.compiler.sources.Source;
-import org.shedlang.compiler.types.Type;
+import org.shedlang.compiler.types.StructType;
public record TypedWhenCaseNode(
- TypedTypeLevelExpressionNode<Type> caseType,
+ TypedTypeLevelExpressionNode<StructType> caseType,
TypedBlockNode body,
Source source
) implements TypedNode {
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 4cb52e54..e429d246 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1214,7 +1214,7 @@ public class TypeChecker {
TypeCheckerContext context
) {
var typedCaseType = typeCheckTypeLevelExpression(
- TypeSets.META_TYPE,
+ TypeSets.STRUCT_META_TYPE,
untyped.caseType(),
context
);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java
new file mode 100644
index 00000000..b6db14cc
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java
@@ -0,0 +1,20 @@
+package org.shedlang.compiler.typechecker.typesets;
+
+import org.shedlang.compiler.types.StructType;
+
+public final class TypeSetStructMetaType implements TypeSetTypeLevelValue<StructType> {
+ private TypeSetStructMetaType() {
+ }
+
+ static final TypeSetStructMetaType INSTANCE = new TypeSetStructMetaType();
+
+ @Override
+ public String describe() {
+ return "struct metatype";
+ }
+
+ @Override
+ public Class<StructType> valueClass() {
+ return StructType.class;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java
index 4007eb2c..b9e66762 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java
@@ -2,6 +2,6 @@ package org.shedlang.compiler.typechecker.typesets;
import org.shedlang.compiler.types.TypeLevelValue;
-public sealed interface TypeSetTypeLevelValue<T extends TypeLevelValue> extends TypeSet permits TypeSetEffect, TypeSetMetaType {
+public sealed interface TypeSetTypeLevelValue<T extends TypeLevelValue> extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType {
Class<T> valueClass();
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java
index 6b6d2d69..b6a0ad3a 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java
@@ -9,6 +9,7 @@ public class TypeSets {
public static final TypeSetEffect EFFECT = TypeSetEffect.INSTANCE;
public static final TypeSet FUNCTION = TypeSetFunction.INSTANCE;
public static final TypeSetMetaType META_TYPE = TypeSetMetaType.INSTANCE;
+ public static final TypeSetStructMetaType STRUCT_META_TYPE = TypeSetStructMetaType.INSTANCE;
public static final TypeSetTuple TUPLE = TypeSetTuple.INSTANCE;
public static TypeSet type(Type type) {