aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-01-14 10:33:24 +0000
committerMichael Williamson <mike@zwobble.org>2024-01-14 10:33:24 +0000
commitfa0a1df409c3cce6301fdda0d5a3ccc3cc25d625 (patch)
tree05b830481c75f6b48915ffb36a80ee825f221846 /src/main/java
parent67a50b8a79c963ec1790587d6af03d322454dc2a (diff)
Simplify narrowing of type-level expression nodes
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java80
-rw-r--r--src/main/java/org/shedlang/compiler/types/Types.java4
2 files changed, 35 insertions, 49 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 22519ef8..08600f43 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1712,6 +1712,24 @@ public class TypeChecker {
UntypedTypeLevelExpressionNode untyped,
TypeCheckerContext context
) {
+ var typedNode = typeCheckTypeLevelExpression(untyped, context);
+
+ // TODO: tidy this up
+ if (valueType.isInstance(typedNode.value())) {
+ return (TypedTypeLevelExpressionNode<T>) typedNode;
+ } else {
+ throw new UnexpectedTypeError(
+ valueType,
+ Types.typeLevelValueType(typedNode.value()),
+ untyped.source()
+ );
+ }
+ }
+
+ static TypedTypeLevelExpressionNode<?> typeCheckTypeLevelExpression(
+ UntypedTypeLevelExpressionNode untyped,
+ TypeCheckerContext context
+ ) {
return switch (untyped) {
case UntypedConstructedTypeNode constructedTypeNode -> {
// TODO: check number of args
@@ -1721,51 +1739,20 @@ public class TypeChecker {
.toList();
var constructedType = Types.constructedType(constructor, args);
- // TODO: tidy this (and other similar checks in this function) up
- if (valueType.isInstance(constructedType)) {
- yield (TypedTypeLevelExpressionNode<T>) new TypedConstructedTypeNode(
- constructedType,
- constructedTypeNode.source()
- );
- } else {
- throw new UnexpectedTypeError(
- valueType,
- Types.metaType(constructedType),
- untyped.source()
- );
- }
- }
-
- case UntypedFunctionTypeNode functionType -> {
- var typedFunctionTypeNode = typeCheckFunctionType(functionType, context);
-
- if (valueType.isInstance(typedFunctionTypeNode.value())) {
- yield (TypedTypeLevelExpressionNode<T>) typedFunctionTypeNode;
- } else {
- throw new UnexpectedTypeError(
- valueType,
- Types.metaType(typedFunctionTypeNode.value()),
- untyped.source()
- );
- }
+ yield new TypedConstructedTypeNode(
+ constructedType,
+ constructedTypeNode.source()
+ );
}
- case UntypedTupleTypeNode tuple -> {
- var typedTupleTypeNode = typeCheckTupleType(tuple, context);
+ case UntypedFunctionTypeNode functionType ->
+ typeCheckFunctionType(functionType, context);
- if (valueType.isInstance(typedTupleTypeNode.value())) {
- yield (TypedTypeLevelExpressionNode<T>) typedTupleTypeNode;
- } else {
- throw new UnexpectedTypeError(
- valueType,
- Types.metaType(typedTupleTypeNode.value()),
- untyped.source()
- );
- }
- }
+ case UntypedTupleTypeNode tuple ->
+ typeCheckTupleType(tuple, context);
case UntypedTypeLevelReferenceNode reference ->
- typeCheckTypeLevelReference(valueType, reference, context);
+ typeCheckTypeLevelReference(reference, context);
};
}
@@ -1809,25 +1796,20 @@ public class TypeChecker {
return new TypedTupleTypeNode(tupleType, untyped.source());
}
- @SuppressWarnings("unchecked")
- private static <T extends TypeLevelValue> TypedTypeLevelExpressionNode<T> typeCheckTypeLevelReference(
- TypeSetTypeLevelValue<T> valueType,
+ private static TypedTypeLevelExpressionNode<TypeLevelValue> typeCheckTypeLevelReference(
UntypedTypeLevelReferenceNode untyped,
TypeCheckerContext context
) {
var type = compileTimeLookup(untyped.name(), untyped.source(), context);
if (!(type instanceof TypeLevelValueType typeLevelValueType)) {
- throw new UnexpectedTypeError(valueType, type, untyped.source());
- }
-
- if (!valueType.isInstance(typeLevelValueType.value())) {
- throw new UnexpectedTypeError(valueType, type, untyped.source());
+ // TODO: should be type-level value, not meta-type
+ throw new UnexpectedTypeError(TypeSets.META_TYPE, type, untyped.source());
}
return new TypedTypeLevelReferenceNode<>(
untyped.name(),
- (T) typeLevelValueType.value(),
+ typeLevelValueType.value(),
untyped.source()
);
}
diff --git a/src/main/java/org/shedlang/compiler/types/Types.java b/src/main/java/org/shedlang/compiler/types/Types.java
index 2abf4df0..8c26d890 100644
--- a/src/main/java/org/shedlang/compiler/types/Types.java
+++ b/src/main/java/org/shedlang/compiler/types/Types.java
@@ -45,6 +45,10 @@ public class Types {
return new TypeLevelValueType(typeConstructor);
}
+ public static Type typeLevelValueType(TypeLevelValue value) {
+ return new TypeLevelValueType(value);
+ }
+
public static <T extends ConstructibleType> TypeConstructor<T> typeConstructor(
List<TypeParam> params,
T genericType