diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-12 11:54:52 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-12 11:54:52 +0000 |
| commit | 04511855a22f07d595789520aa8beabaa642a0e6 (patch) | |
| tree | cbf3473de4194a0af4a249fb9a83d71ae08c26db /src/main/java | |
| parent | c260aad8915adb3958ab5fc35d51c20a5d025c2e (diff) | |
Narrow handled effect type in TypedTryNode
Diffstat (limited to 'src/main/java')
6 files changed, 33 insertions, 29 deletions
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<Effect> handledEffect, + TypedTypeLevelExpressionNode<UserDefinedEffect> handledEffect, List<TypedTryHandlerMethodNode> 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<UserDefinedEffect> typeCheckUserDefinedEffect( + UntypedTypeLevelExpressionNode untyped, + TypeCheckerContext context + ) { + return typeCheckTypeLevelExpression(TypeSets.USER_DEFINED_EFFECT, untyped, context); + } + private static TypeCheckSteps<TypedEffectDefinitionNode> 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<T extends TypeLevelValue> extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType { +public sealed interface TypeSetTypeLevelValue<T extends TypeLevelValue> extends TypeSet permits TypeSetEffect, TypeSetMetaType, TypeSetStructMetaType, TypeSetUserDefinedEffect { Class<T> 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<UserDefinedEffect> { + private TypeSetUserDefinedEffect() { + } + + static final TypeSetUserDefinedEffect INSTANCE = new TypeSetUserDefinedEffect(); + + @Override + public String describe() { + return "user-defined effect"; + } + + @Override + public Class<UserDefinedEffect> 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); |
