aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 20:03:22 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 20:03:22 +0000
commitfbe9654480d0d7b50afad2ce249b5874701da1d9 (patch)
tree904ce61f47260f685f7e5829a128b5d5884a2cd1 /src/main/java
parentaa88533bb9809fd9cc597d0b6fc7676b35f1ede2 (diff)
Throw error if effect field is not handled
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java17
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java8
2 files changed, 24 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java b/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java
new file mode 100644
index 00000000..468ca23d
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/MissingEffectHandlerFieldError.java
@@ -0,0 +1,17 @@
+package org.shedlang.compiler.typechecker;
+
+import org.shedlang.compiler.errors.SourceError;
+import org.shedlang.compiler.sources.Source;
+
+public class MissingEffectHandlerFieldError extends SourceError {
+ private final String fieldName;
+
+ public MissingEffectHandlerFieldError(String fieldName, Source source) {
+ super("Missing effect handler field: " + fieldName, source);
+ this.fieldName = fieldName;
+ }
+
+ public String fieldName() {
+ return fieldName;
+ }
+}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index db81d7cc..44842599 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1602,7 +1602,7 @@ public class TypeChecker {
) {
var typedHandledEffect = typeCheckEffect(untyped.handledEffect(), context);
- if (!(typedHandledEffect.value() instanceof UserDefinedEffect)) {
+ if (!(typedHandledEffect.value() instanceof UserDefinedEffect handledEffect)) {
throw new NotUserDefinedEffectError(
typedHandledEffect.value(),
untyped.handledEffect().source()
@@ -1623,6 +1623,12 @@ public class TypeChecker {
context = context.exit();
+ var effectInfo = context.userDefinedEffectInfo(handledEffect, typedHandledEffect.source());
+ // TODO: Don't create unnecessary list
+ for (var field : effectInfo.fields().stream().toList()) {
+ throw new MissingEffectHandlerFieldError(field.getKey(), untyped.source());
+ }
+
return context.toResult(new TypedTryNode(
typedBody,
typedHandledEffect,