diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-12-23 22:33:58 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-12-23 22:33:58 +0000 |
| commit | 4281ebfda1ba1753795e89328a4eca4327124e69 (patch) | |
| tree | ee0002e3bfb90060b62f0fa4ad607d0297d844c3 /src/main/java | |
| parent | 66e07897524bf6239eb154c8d548c75bd74c82d0 (diff) | |
Restrict types that can be constructed
Diffstat (limited to 'src/main/java')
6 files changed, 14 insertions, 11 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 964a0000..668a005c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1419,7 +1419,6 @@ public class TypeChecker { var typeOrConstructor = untyped.typeLevelParams() .map(typeLevelParamNodes -> TypeOrConstructor.constructor(new TypeConstructor<>( - type.name(), typeLevelParamNodes.stream() .map(typeLevelParamNode -> new TypeParam( new Scope.Struct(type), diff --git a/src/main/java/org/shedlang/compiler/types/StructType.java b/src/main/java/org/shedlang/compiler/types/StructType.java index ab9b18a6..04e42057 100644 --- a/src/main/java/org/shedlang/compiler/types/StructType.java +++ b/src/main/java/org/shedlang/compiler/types/StructType.java @@ -3,7 +3,7 @@ package org.shedlang.compiler.types; /** * A set of named fields. */ -public record StructType(NamespaceName namespaceName, String name) implements Type { +public record StructType(NamespaceName namespaceName, String name) implements StructuredType { @Override public String describe() { return namespaceName.toString() + "." + name; diff --git a/src/main/java/org/shedlang/compiler/types/StructuredType.java b/src/main/java/org/shedlang/compiler/types/StructuredType.java new file mode 100644 index 00000000..114da180 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/types/StructuredType.java @@ -0,0 +1,5 @@ +package org.shedlang.compiler.types; + +public sealed interface StructuredType extends Type permits StructType { + String name(); +} diff --git a/src/main/java/org/shedlang/compiler/types/Type.java b/src/main/java/org/shedlang/compiler/types/Type.java index 27d133ee..8ec577bf 100644 --- a/src/main/java/org/shedlang/compiler/types/Type.java +++ b/src/main/java/org/shedlang/compiler/types/Type.java @@ -6,5 +6,5 @@ package org.shedlang.compiler.types; * found through auxiliary data. */ public sealed interface Type extends TypeLevelValue - permits BoolType, BottomType, FunctionType, IntType, NamespaceType, StringType, StructType, SumType, TopType, TupleType, TypeLevelValueType, TypeParam, UnitType { + permits BoolType, BottomType, FunctionType, IntType, NamespaceType, StringType, StructuredType, SumType, TopType, TupleType, TypeLevelValueType, TypeParam, UnitType { } diff --git a/src/main/java/org/shedlang/compiler/types/TypeConstructor.java b/src/main/java/org/shedlang/compiler/types/TypeConstructor.java index 78aa0b61..a43001bc 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeConstructor.java +++ b/src/main/java/org/shedlang/compiler/types/TypeConstructor.java @@ -2,13 +2,12 @@ package org.shedlang.compiler.types; import java.util.List; -public record TypeConstructor<T extends Type>( - String name, +public record TypeConstructor<T extends StructuredType>( List<TypeParam> params, T genericType ) implements TypeLevelValue { @Override public String describe() { - return name; + return genericType.name(); } } diff --git a/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java b/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java index 6c512117..8c040c2d 100644 --- a/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java +++ b/src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java @@ -1,18 +1,18 @@ package org.shedlang.compiler.types; -public sealed interface TypeOrConstructor<T extends Type> { - static <T extends org.shedlang.compiler.types.Type> TypeOrConstructor<T> type(T value) { +public sealed interface TypeOrConstructor<T extends StructuredType> { + static <T extends StructuredType> TypeOrConstructor<T> type(T value) { return new Type<>(value); } - static <T extends org.shedlang.compiler.types.Type> TypeOrConstructor<T> constructor(TypeConstructor<T> value) { + static <T extends StructuredType> TypeOrConstructor<T> constructor(TypeConstructor<T> value) { return new Constructor<>(value); } T toType(); org.shedlang.compiler.types.Type toMetaType(); - record Type<T extends org.shedlang.compiler.types.Type>(T value) implements TypeOrConstructor<T> { + record Type<T extends StructuredType>(T value) implements TypeOrConstructor<T> { @Override public T toType() { return value; @@ -24,7 +24,7 @@ public sealed interface TypeOrConstructor<T extends Type> { } } - record Constructor<T extends org.shedlang.compiler.types.Type>(TypeConstructor<T> value) implements TypeOrConstructor<T> { + record Constructor<T extends StructuredType>(TypeConstructor<T> value) implements TypeOrConstructor<T> { @Override public T toType() { return value.genericType(); |
