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;
|
JetSimpleNameExpression expression = (JetSimpleNameExpression) calleeExpression;
|
||||||
functionReference = expression;
|
functionReference = expression;
|
||||||
|
|
||||||
ExpressionTypingUtils.checkCapturingInClosure(expression, context.trace, context.scope);
|
|
||||||
|
|
||||||
Name name = expression.getReferencedNameAsName();
|
Name name = expression.getReferencedNameAsName();
|
||||||
|
|
||||||
prioritizedTasks = TaskPrioritizer.<CallableDescriptor, FunctionDescriptor>computePrioritizedTasks(context, name, functionReference, CallableDescriptorCollectors.FUNCTIONS_AND_VARIABLES);
|
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,
|
OverloadResolutionResultsImpl<FunctionDescriptor> results = doResolveCallOrGetCachedResults(
|
||||||
CallTransformer.FUNCTION_CALL_TRANSFORMER, functionReference);
|
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(
|
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");
|
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")
|
@TestMetadata("compiler/testData/codegen/box/closures/closureInsideClosure")
|
||||||
|
|||||||
Reference in New Issue
Block a user