KT-4656 Wrong capturing a function literal variable.

#KT-4656 Fixed
 Reference for calleeExpression is recorded only in 'doResolveCallOrGetCachedResults'.
This commit is contained in:
Svetlana Isakova
2014-03-08 12:22:03 +04:00
parent 92a4bb8c18
commit 4771986b32
3 changed files with 28 additions and 4 deletions
@@ -198,8 +198,6 @@ public class CallResolver {
JetSimpleNameExpression expression = (JetSimpleNameExpression) calleeExpression;
functionReference = expression;
ExpressionTypingUtils.checkCapturingInClosure(expression, context.trace, context.scope);
Name name = expression.getReferencedNameAsName();
prioritizedTasks = TaskPrioritizer.<CallableDescriptor, FunctionDescriptor>computePrioritizedTasks(context, name, functionReference, CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES);
@@ -306,8 +304,13 @@ public class CallResolver {
}
}
return doResolveCallOrGetCachedResults(ResolutionResultsCache.FUNCTION_MEMBER_TYPE, context, prioritizedTasks,
CallTransformer.FUNCTION_CALL_TRANSFORMER, functionReference);
OverloadResolutionResultsImpl<FunctionDescriptor> results = doResolveCallOrGetCachedResults(
ResolutionResultsCache.FUNCTION_MEMBER_TYPE, context, prioritizedTasks,
CallTransformer.FUNCTION_CALL_TRANSFORMER, functionReference);
if (calleeExpression instanceof JetSimpleNameExpression) {
ExpressionTypingUtils.checkCapturingInClosure((JetSimpleNameExpression) calleeExpression, context.trace, context.scope);
}
return results;
}
public OverloadResolutionResults<FunctionDescriptor> resolveCallWithKnownCandidate(
@@ -0,0 +1,16 @@
//KT-4656 Wrong capturing a function literal variable
fun box(): String {
var foo = { 1 }
var bar = 1
val t = { "${foo()} $bar" }
fun b() = "${foo()} $bar"
foo = { 2 }
bar = 2
if (t() != "2 2") return "fail1"
if (b() != "2 2") return "fail2"
return "OK"
}
@@ -1566,6 +1566,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
doTest("compiler/testData/codegen/box/closures/captureOuterProperty/kt4176.kt");
}
@TestMetadata("kt4656.kt")
public void testKt4656() throws Exception {
doTest("compiler/testData/codegen/box/closures/captureOuterProperty/kt4656.kt");
}
}
@TestMetadata("compiler/testData/codegen/box/closures/closureInsideClosure")