From 67a50b8a79c963ec1790587d6af03d322454dc2a Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sat, 13 Jan 2024 19:29:38 +0000 Subject: Push instance checking into TypeSetTypeLevelValue --- .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 11 ++++++----- .../shedlang/compiler/typechecker/typesets/TypeSetEffect.java | 5 +++-- .../compiler/typechecker/typesets/TypeSetMetaType.java | 5 +++-- .../compiler/typechecker/typesets/TypeSetStructMetaType.java | 5 +++-- .../compiler/typechecker/typesets/TypeSetTypeConstructor.java | 5 +++-- .../compiler/typechecker/typesets/TypeSetTypeLevelValue.java | 2 +- .../typechecker/typesets/TypeSetUserDefinedEffect.java | 5 +++-- 7 files changed, 22 insertions(+), 16 deletions(-) (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 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) 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) 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) typedTupleTypeNode; } else { throw new UnexpectedTypeError( @@ -1809,6 +1809,7 @@ public class TypeChecker { return new TypedTupleTypeNode(tupleType, untyped.source()); } + @SuppressWarnings("unchecked") private static TypedTypeLevelExpressionNode typeCheckTypeLevelReference( TypeSetTypeLevelValue 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 { private TypeSetEffect() { @@ -14,7 +15,7 @@ public final class TypeSetEffect implements TypeSetTypeLevelValue { } @Override - public Class 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 { private TypeSetMetaType() { @@ -14,7 +15,7 @@ public final class TypeSetMetaType implements TypeSetTypeLevelValue { } @Override - public Class 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 { private TypeSetStructMetaType() { @@ -14,7 +15,7 @@ public final class TypeSetStructMetaType implements TypeSetTypeLevelValue 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 { private TypeSetTypeConstructor() { @@ -14,7 +15,7 @@ public final class TypeSetTypeConstructor implements TypeSetTypeLevelValue 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 extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType, TypeSetTypeConstructor, TypeSetUserDefinedEffect { - Class 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 { @@ -14,7 +15,7 @@ public final class TypeSetUserDefinedEffect implements TypeSetTypeLevelValue valueClass() { - return UserDefinedEffect.class; + public boolean isInstance(TypeLevelValue value) { + return value instanceof UserDefinedEffect; } } -- cgit v1.2.3