From 4281ebfda1ba1753795e89328a4eca4327124e69 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 23 Dec 2023 22:33:58 +0000 Subject: Restrict types that can be constructed --- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 1 - src/main/java/org/shedlang/compiler/types/StructType.java | 2 +- src/main/java/org/shedlang/compiler/types/StructuredType.java | 5 +++++ src/main/java/org/shedlang/compiler/types/Type.java | 2 +- src/main/java/org/shedlang/compiler/types/TypeConstructor.java | 5 ++--- .../java/org/shedlang/compiler/types/TypeOrConstructor.java | 10 +++++----- 6 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/types/StructuredType.java (limited to 'src/main/java') 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( - String name, +public record TypeConstructor( List 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 { - static TypeOrConstructor type(T value) { +public sealed interface TypeOrConstructor { + static TypeOrConstructor type(T value) { return new Type<>(value); } - static TypeOrConstructor constructor(TypeConstructor value) { + static TypeOrConstructor constructor(TypeConstructor value) { return new Constructor<>(value); } T toType(); org.shedlang.compiler.types.Type toMetaType(); - record Type(T value) implements TypeOrConstructor { + record Type(T value) implements TypeOrConstructor { @Override public T toType() { return value; @@ -24,7 +24,7 @@ public sealed interface TypeOrConstructor { } } - record Constructor(TypeConstructor value) implements TypeOrConstructor { + record Constructor(TypeConstructor value) implements TypeOrConstructor { @Override public T toType() { return value.genericType(); -- cgit v1.2.3