aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-12 11:54:52 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-12 11:54:52 +0000
commit04511855a22f07d595789520aa8beabaa642a0e6 (patch)
treecbf3473de4194a0af4a249fb9a83d71ae08c26db /src/main/java
parentc260aad8915adb3958ab5fc35d51c20a5d025c2e (diff)
Narrow handled effect type in TypedTryNode
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/typed/TypedTryNode.java4
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java17
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java18
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetTypeLevelValue.java2
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSetUserDefinedEffect.java20
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/typesets/TypeSets.java1
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);