diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:08:08 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-05 20:08:08 +0000 |
| commit | f3d28bc5d05eea6d8ed9db603682631290f8da2c (patch) | |
| tree | 66dbc1373cf3523dbf6941d17a637b2f130fa977 /src/main/java/org | |
| parent | 65affbc796449ab434a80212d6bf20ccf0ddbd97 (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.java | 8 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 12 |
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( |
