diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-11-19 21:59:51 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-11-19 21:59:51 +0000 |
| commit | ca4c78c800e74065f7257db76bf49de420a5824f (patch) | |
| tree | da4bab879083ad513474ebd38a6f5e72a54e7fd3 /src/test/java | |
| parent | 3244aa2a2d81f0b31bfc18f1e0db333000a1c44b (diff) | |
Allow capture of vars in effect handler methods in type checker
Diffstat (limited to 'src/test/java')
| -rw-r--r-- | src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java index f1a68abf..2d60446b 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerTryTests.java @@ -626,4 +626,47 @@ public class TypeCheckerTryTests { () -> typeCheckExpression(untyped, context) ); } + + @Test + public void handlerMethodMayCaptureVars() { + var handledEffect = Effects.userDefined(NAMESPACE_NAME, "HandledEffect"); + var untyped = UntypedTryNode.builder() + .withHandledEffect(Untyped.typeLevelReference(handledEffect.name())) + .addHandlerMethod( + UntypedTryHandlerMethodNode.builder() + .addStatement(Untyped.resume(Untyped.reference("x"))) + .withName("mark") + .build() + ) + .build(); + var context = TypeCheckerContext.EMPTY + .addUserDefinedEffectInfo( + handledEffect, + UserDefinedEffectInfo.builder() + .addMethod("mark", FunctionType.builder().withReturnType(Types.INT).build()) + .build() + ) + .enterFunction( + P.map( + Map.entry(handledEffect.name(), Variable.defined(Types.effectType(handledEffect), VariableType.CONSTANT)), + Map.entry("x", Variable.defined(Types.INT, VariableType.VAR)) + ), + Effects.NONE, + Optional.empty() + ); + + var result = typeCheckExpression(untyped, context); + + assertThat( + result.value(), + isTypedTryNode() + .withHandlerMethods(isSequence( + isTypedTryHandlerMethodNode() + .withName("mark") + .withBodyBlock(isTypedBlockNode(isSequence( + isTypedResumeNode(isTypedReferenceNode("x", Types.INT)) + ))) + )) + ); + } } |
