From 04511855a22f07d595789520aa8beabaa642a0e6 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 12 Nov 2023 11:54:52 +0000 Subject: Narrow handled effect type in TypedTryNode --- .../shedlang/compiler/ast/typed/TypedTryNode.java | 4 ++-- .../shedlang/compiler/typechecker/TypeChecker.java | 17 +++++++++-------- .../errors/NotUserDefinedEffectError.java | 18 ------------------ .../typechecker/typesets/TypeSetTypeLevelValue.java | 2 +- .../typesets/TypeSetUserDefinedEffect.java | 20 ++++++++++++++++++++ .../compiler/typechecker/typesets/TypeSets.java | 1 + 6 files changed, 33 insertions(+), 29 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/ast/typed/TypedTryNode.java b/src/main/java/org/shedlang/compiler/ast/typed/TypedTryNode.java index 123744d5..5e87a6b7 100644 --- a/src/main/java/org/shedlang/compiler/ast/typed/TypedTryNode.java +++ b/src/main/java/org/shedlang/compiler/ast/typed/TypedTryNode.java @@ -1,14 +1,14 @@ package org.shedlang.compiler.ast.typed; import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.types.Effect; import org.shedlang.compiler.types.Type; +import org.shedlang.compiler.types.UserDefinedEffect; import java.util.List; public record TypedTryNode( TypedBlockNode body, - TypedTypeLevelExpressionNode handledEffect, + TypedTypeLevelExpressionNode handledEffect, List handlerMethods, Source source ) implements TypedExpressionNode { diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 5c203322..fdc24287 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -383,6 +383,13 @@ public class TypeChecker { return typeCheckTypeLevelExpression(TypeSets.EFFECT, untyped, context); } + private static TypedTypeLevelExpressionNode typeCheckUserDefinedEffect( + UntypedTypeLevelExpressionNode untyped, + TypeCheckerContext context + ) { + return typeCheckTypeLevelExpression(TypeSets.USER_DEFINED_EFFECT, untyped, context); + } + private static TypeCheckSteps typeCheckStepsEffectDefinition( UntypedEffectDefinitionNode untyped ) { @@ -1671,14 +1678,8 @@ public class TypeChecker { UntypedTryNode untyped, TypeCheckerContext context ) { - var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context); - - if (!(typedHandledEffect.value() instanceof UserDefinedEffect handledEffect)) { - throw new NotUserDefinedEffectError( - typedHandledEffect.value(), - untyped.handledEffect().source() - ); - } + var typedHandledEffect = typeCheckUserDefinedEffect(untyped.handledEffect(), context); + var handledEffect = typedHandledEffect.value(); var declaredVariables = DeclaredVariables.forFunctionStatements( untyped.body().statements(), diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java deleted file mode 100644 index a740dccc..00000000 --- a/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java +++ /dev/null @@ -1,18 +0,0 @@ -package org.shedlang.compiler.typechecker.errors; - -import org.shedlang.compiler.errors.SourceError; -import org.shedlang.compiler.sources.Source; -import org.shedlang.compiler.types.Effect; - -public class NotUserDefinedEffectError extends SourceError { - private final Effect effect; - - public NotUserDefinedEffectError(Effect effect, Source source) { - super("Only user-defined effects can be handled, but was: " + effect.describe(), source); - this.effect = effect; - } - - public Effect effect() { - return effect; - } -} 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 b9e66762..a0a6d43a 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java @@ -2,6 +2,6 @@ package org.shedlang.compiler.typechecker.typesets; import org.shedlang.compiler.types.TypeLevelValue; -public sealed interface TypeSetTypeLevelValue extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType { +public sealed interface TypeSetTypeLevelValue extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType, TypeSetUserDefinedEffect { Class valueClass(); } diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java new file mode 100644 index 00000000..3ee46d2c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java @@ -0,0 +1,20 @@ +package org.shedlang.compiler.typechecker.typesets; + +import org.shedlang.compiler.types.UserDefinedEffect; + +public final class TypeSetUserDefinedEffect implements TypeSetTypeLevelValue { + private TypeSetUserDefinedEffect() { + } + + static final TypeSetUserDefinedEffect INSTANCE = new TypeSetUserDefinedEffect(); + + @Override + public String describe() { + return "user-defined effect"; + } + + @Override + public Class valueClass() { + return UserDefinedEffect.class; + } +} diff --git a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java index b6a0ad3a..57002c37 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java +++ b/src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java @@ -11,6 +11,7 @@ public class TypeSets { public static final TypeSetMetaType META_TYPE = TypeSetMetaType.INSTANCE; public static final TypeSetStructMetaType STRUCT_META_TYPE = TypeSetStructMetaType.INSTANCE; public static final TypeSetTuple TUPLE = TypeSetTuple.INSTANCE; + public static final TypeSetUserDefinedEffect USER_DEFINED_EFFECT = TypeSetUserDefinedEffect.INSTANCE; public static TypeSet type(Type type) { return new TypeSetType(type); -- cgit v1.2.3