KT-4656 Wrong capturing a function literal variable.
#KT-4656 Fixed Reference for calleeExpression is recorded only in 'doResolveCallOrGetCachedResults'.
This commit is contained in:
@@ -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")
|
||||
|
||||
Reference in New Issue
Block a user