aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-12-23 22:33:58 +0000
committerMichael Williamson <mike@zwobble.org>2023-12-23 22:33:58 +0000
commit4281ebfda1ba1753795e89328a4eca4327124e69 (patch)
treeee0002e3bfb90060b62f0fa4ad607d0297d844c3 /src/main/java
parent66e07897524bf6239eb154c8d548c75bd74c82d0 (diff)
Restrict types that can be constructed
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java1
-rw-r--r--src/main/java/org/shedlang/compiler/types/StructType.java2
-rw-r--r--src/main/java/org/shedlang/compiler/types/StructuredType.java5
-rw-r--r--src/main/java/org/shedlang/compiler/types/Type.java2
-rw-r--r--src/main/java/org/shedlang/compiler/types/TypeConstructor.java5
-rw-r--r--src/main/java/org/shedlang/compiler/types/TypeOrConstructor.java10
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();