aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-11-07 16:15:45 +0000
committerMichael Williamson <mike@zwobble.org>2023-11-07 16:15:45 +0000
commitc22e9652e8a2904829bc7d5586074f38ded966f3 (patch)
tree35a431a7dbf348c59b974d470415f03000ce35f7 /src/main/java
parent075b43b9d0283b80ecfd19bc37c380406a8c27bc (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.java9
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java5
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(