diff options
| author | Michael Williamson <mike@zwobble.org> | 2024-01-13 19:29:38 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2024-01-13 19:29:38 +0000 |
| commit | 67a50b8a79c963ec1790587d6af03d322454dc2a (patch) | |
| tree | 10be5c5fc59c3cd6c9c94806aa7340adc7564b96 /src/main/java | |
| parent | 0f4b398649e64a328b06345120ea2992f645b106 (diff) | |
Push instance checking into TypeSetTypeLevelValue
Diffstat (limited to 'src/main/java')
7 files changed, 22 insertions, 16 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 769944c2..22519ef8 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1722,7 +1722,7 @@ public class TypeChecker { var constructedType = Types.constructedType(constructor, args); // TODO: tidy this (and other similar checks in this function) up - if (valueType.valueClass().isAssignableFrom(constructedType.getClass())) { + if (valueType.isInstance(constructedType)) { yield (TypedTypeLevelExpressionNode<T>) new TypedConstructedTypeNode( constructedType, constructedTypeNode.source() @@ -1739,7 +1739,7 @@ public class TypeChecker { case UntypedFunctionTypeNode functionType -> { var typedFunctionTypeNode = typeCheckFunctionType(functionType, context); - if (valueType.valueClass().isAssignableFrom(typedFunctionTypeNode.value().getClass())) { + if (valueType.isInstance(typedFunctionTypeNode.value())) { yield (TypedTypeLevelExpressionNode<T>) typedFunctionTypeNode; } else { throw new UnexpectedTypeError( @@ -1753,7 +1753,7 @@ public class TypeChecker { case UntypedTupleTypeNode tuple -> { var typedTupleTypeNode = typeCheckTupleType(tuple, context); - if (valueType.valueClass().isAssignableFrom(typedTupleTypeNode.value().getClass())) { + if (valueType.isInstance(typedTupleTypeNode.value())) { yield (TypedTypeLevelExpressionNode<T>) typedTupleTypeNode; } else { throw new UnexpectedTypeError( @@ -1809,6 +1809,7 @@ public class TypeChecker { return new TypedTupleTypeNode(tupleType, untyped.source()); } + @SuppressWarnings("unchecked") private static <T extends TypeLevelValue> TypedTypeLevelExpressionNode<T> typeCheckTypeLevelReference( TypeSetTypeLevelValue<T> valueType, UntypedTypeLevelReferenceNode untyped, @@ -1820,13 +1821,13 @@ public class TypeChecker { throw new UnexpectedTypeError(valueType, type, untyped.source()); } - if (!valueType.valueClass().isInstance(typeLevelValueType.value())) { + if (!valueType.isInstance(typeLevelValueType.value())) { throw new UnexpectedTypeError(valueType, type, untyped.source()); } return new TypedTypeLevelReferenceNode<>( untyped.name(), - valueType.valueClass().cast(typeLevelValueType.value()), + (T) typeLevelValueType.value(), untyped.source() ); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetEffect.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetEffect.java index 6c250a7a..283d3ac7 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetEffect.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetEffect.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.Effect; +import org.shedlang.compiler.types.TypeLevelValue; public final class TypeSetEffect implements TypeSetTypeLevelValue<Effect> { private TypeSetEffect() { @@ -14,7 +15,7 @@ public final class TypeSetEffect implements TypeSetTypeLevelValue<Effect> { } @Override - public Class<Effect> valueClass() { - return Effect.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof Effect; } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetMetaType.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetMetaType.java index 095c5c82..e325dcfa 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetMetaType.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetMetaType.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.Type; +import org.shedlang.compiler.types.TypeLevelValue; public final class TypeSetMetaType implements TypeSetTypeLevelValue<Type> { private TypeSetMetaType() { @@ -14,7 +15,7 @@ public final class TypeSetMetaType implements TypeSetTypeLevelValue<Type> { } @Override - public Class<Type> valueClass() { - return Type.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof Type; } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java index b6db14cc..d6763a95 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetStructMetaType.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.StructType; +import org.shedlang.compiler.types.TypeLevelValue; public final class TypeSetStructMetaType implements TypeSetTypeLevelValue<StructType> { private TypeSetStructMetaType() { @@ -14,7 +15,7 @@ public final class TypeSetStructMetaType implements TypeSetTypeLevelValue<Struct } @Override - public Class<StructType> valueClass() { - return StructType.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof StructType; } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeConstructor.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeConstructor.java index 4a5f5ad3..711fa31c 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeConstructor.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeConstructor.java @@ -1,6 +1,7 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.TypeConstructor; +import org.shedlang.compiler.types.TypeLevelValue; public final class TypeSetTypeConstructor implements TypeSetTypeLevelValue<TypeConstructor> { private TypeSetTypeConstructor() { @@ -14,7 +15,7 @@ public final class TypeSetTypeConstructor implements TypeSetTypeLevelValue<TypeC } @Override - public Class<TypeConstructor> valueClass() { - return TypeConstructor.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof TypeConstructor<?>; } } 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 9159a2d5..9d1e6c61 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java @@ -3,5 +3,5 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.TypeLevelValue; public sealed interface TypeSetTypeLevelValue<T extends TypeLevelValue> extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType, TypeSetTypeConstructor, TypeSetUserDefinedEffect { - Class<T> valueClass(); + boolean isInstance(TypeLevelValue value); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java index 3ee46d2c..9f39cc3f 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java @@ -1,5 +1,6 @@ package org.shedlang.compiler.typechecker.typesets; +import org.shedlang.compiler.types.TypeLevelValue; import org.shedlang.compiler.types.UserDefinedEffect; public final class TypeSetUserDefinedEffect implements TypeSetTypeLevelValue<UserDefinedEffect> { @@ -14,7 +15,7 @@ public final class TypeSetUserDefinedEffect implements TypeSetTypeLevelValue<Use } @Override - public Class<UserDefinedEffect> valueClass() { - return UserDefinedEffect.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof UserDefinedEffect; } } |
