From c22e9652e8a2904829bc7d5586074f38ded966f3 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Tue, 7 Nov 2023 16:15:45 +0000 Subject: Allow effects from outer scope in effect handler fields --- .../shedlang/compiler/typechecker/PartialFunctionSignature.java | 9 +++++++++ src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 5 +++-- 2 files changed, 12 insertions(+), 2 deletions(-) (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/typechecker/PartialFunctionSignature.java b/src/main/java/org/shedlang/compiler/typechecker/PartialFunctionSignature.java index 68541f64..c0501856 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/PartialFunctionSignature.java +++ b/src/main/java/org/shedlang/compiler/typechecker/PartialFunctionSignature.java @@ -24,6 +24,15 @@ public record PartialFunctionSignature( return Lists.concat(positionalParams, namedParams); } + public PartialFunctionSignature withEffect(Effect effect) { + return new PartialFunctionSignature( + this.positionalParams, + this.namedParams, + effect, + this.returnType + ); + } + public static Builder builder() { return new Builder( P.vector(), diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 90d68238..8dbf0927 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -1641,7 +1641,7 @@ public class TypeChecker { context = typedHandlerFieldResult.context(); checkIsSubType( - typedHandlerField.type(), + typedHandlerField.type().withEffect(Effects.NONE), effectFieldType, untypedHandlerField.source(), context @@ -1672,7 +1672,8 @@ public class TypeChecker { ) { var typedSignature = typeCheckFunctionSignature(untyped.signature(), context); - var partialSignature = inferFunctionPartialSignature(typedSignature, Optional.of(effectFieldType)); + var partialSignature = inferFunctionPartialSignature(typedSignature, Optional.of(effectFieldType)) + .withEffect(context.effect()); // TODO: don't allow returns, allow resumes var typedBodyResult = typeCheckFunctionBody( -- cgit v1.2.3