diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-01 22:18:35 +0100 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-01 22:18:35 +0100 |
| commit | e402dc37b14873900b19361c5f64bea745204dd9 (patch) | |
| tree | a88e393e39d5f6b84728ed2802fe5e6825696fc5 /src/main/java | |
| parent | f650c01fea4d6116f5d8ed14a1b92c7bdab6697e (diff) | |
Require when cases to be structs
Diffstat (limited to 'src/main/java')
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) { |
