From e402dc37b14873900b19361c5f64bea745204dd9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 1 Oct 2023 22:18:35 +0100 Subject: Require when cases to be structs --- .../compiler/ast/typed/TypedWhenCaseNode.java | 4 ++-- .../shedlang/compiler/typechecker/TypeChecker.java | 2 +- .../typechecker/typesets/TypeSetStructMetaType.java | 20 ++++++++++++++++++++ .../typechecker/typesets/TypeSetTypeLevelValue.java | 2 +- .../compiler/typechecker/typesets/TypeSets.java | 1 + 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java (limited to 'src/main/java') 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 caseType, + TypedTypeLevelExpressionNode 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 { + private TypeSetStructMetaType() { + } + + static final TypeSetStructMetaType INSTANCE = new TypeSetStructMetaType(); + + @Override + public String describe() { + return "struct metatype"; + } + + @Override + public Class 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 extends TypeSet permits TypeSetEffect, TypeSetMetaType { +public sealed interface TypeSetTypeLevelValue extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType { Class 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) { -- cgit v1.2.3