diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-07 16:15:45 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-07 16:15:45 +0000 |
| commit | c22e9652e8a2904829bc7d5586074f38ded966f3 (patch) | |
| tree | 35a431a7dbf348c59b974d470415f03000ce35f7 /src/main/java | |
| parent | 075b43b9d0283b80ecfd19bc37c380406a8c27bc (diff) | |
Allow effects from outer scope in effect handler fields
Diffstat (limited to 'src/main/java')
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/PartialFunctionSignature.java | 9 | ||||
| -rw-r--r-- | src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java | 5 |
2 files changed, 12 insertions, 2 deletions
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( |
