aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 19:38:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 19:38:22 +0000
commit120b830cab1462d76761ee0d26cba7df783dc741 (patch)
tree01a0877a9cfcf747ec0749bf46f3853c5763c4d6 /src/main/java
parent23bc783e4c0eea019d47f1b69d9d8a74adb15326 (diff)
Check that handled effect is user-defined effect
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java18
2 files changed, 25 insertions, 0 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 29376e9f..f86ed78f 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1593,6 +1593,13 @@ public class TypeChecker {
) {
var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context);
+ if (!(typedHandledEffect.value() instanceof UserDefinedEffect)) {
+ throw new NotUserDefinedEffectError(
+ typedHandledEffect.value(),
+ untyped.handledEffect().source()
+ );
+ }
+
var declaredVariables = DeclaredVariables.forFunctionStatements(
untyped.body().statements(),
P.vector()
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java
new file mode 100644
index 00000000..a740dccc
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/NotUserDefinedEffectError.java
@@ -0,0 +1,18 @@
+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;
+ }
+}