From ca4c78c800e74065f7257db76bf49de420a5824f Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 19 Nov 2023 21:59:51 +0000 Subject: Allow capture of vars in effect handler methods in type checker --- .../compiler/typechecker/TypeCheckerTryTests.java | 43 ++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'src/test/java') 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)) + ))) + )) + ); + } } -- cgit v1.2.3