aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-05 20:08:08 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-05 20:08:08 +0000
commitf3d28bc5d05eea6d8ed9db603682631290f8da2c (patch)
tree66dbc1373cf3523dbf6941d17a637b2f130fa977 /src/main/java/org
parent65affbc796449ab434a80212d6bf20ccf0ddbd97 (diff)
Throw error if handling field not on effect
Diffstat (limited to 'src/main/java/org')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java8
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java12
2 files changed, 18 insertions, 2 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java
index c7906c8a..50a5a2c2 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedTryNode.java
@@ -50,5 +50,13 @@ public record UntypedTryNode(
this.handlers
);
}
+
+ public Builder addHandlerField(UntypedFunctionDefinitionNode handlerField) {
+ return new Builder(
+ this.body,
+ this.handledEffect,
+ this.handlers.plus(handlerField)
+ );
+ }
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 44842599..222ddc79 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1625,8 +1625,16 @@ public class TypeChecker {
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());
+ for (var effectField : effectInfo.fields().stream().toList()) {
+ throw new MissingEffectHandlerFieldError(effectField.getKey(), untyped.source());
+ }
+
+ for (var handlerField : untyped.handlers()) {
+ throw new NoSuchFieldError(
+ Types.effectType(handledEffect),
+ handlerField.name(),
+ handlerField.source()
+ );
}
return context.toResult(new TypedTryNode(