From f3d28bc5d05eea6d8ed9db603682631290f8da2c Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 5 Nov 2023 20:08:08 +0000 Subject: Throw error if handling field not on effect --- .../org/shedlang/compiler/ast/untyped/UntypedTryNode.java | 8 ++++++++ .../java/org/shedlang/compiler/typechecker/TypeChecker.java | 12 ++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) (limited to 'src/main/java') 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( -- cgit v1.2.3