Fixed bug with local function

This commit is contained in:
Valentin Kipyatkov
2015-10-05 21:25:34 +03:00
parent 9da7f39195
commit 064ff5d8cc
3 changed files with 27 additions and 8 deletions
@@ -259,13 +259,9 @@ class KotlinFunctionParameterInfoHandler : ParameterInfoHandlerWithTabActionSupp
functionDescriptor: FunctionDescriptor,
bindingContext: BindingContext
): Boolean {
val callNameExpression = getCallNameExpression(argumentList)
if (callNameExpression != null) {
val declarationDescriptor = bindingContext[BindingContext.REFERENCE_TARGET, callNameExpression]
if (declarationDescriptor?.original === functionDescriptor.original) return true
}
return false
val callNameExpression = getCallNameExpression(argumentList) ?: return false
val target = bindingContext[BindingContext.REFERENCE_TARGET, callNameExpression] as? FunctionDescriptor
return target != null && descriptorsEqual(target, functionDescriptor)
}
private fun getCallNameExpression(argumentList: JetValueArgumentList): JetSimpleNameExpression? {
@@ -338,7 +334,7 @@ class KotlinFunctionParameterInfoHandler : ParameterInfoHandlerWithTabActionSupp
}
val candidates = detectCandidates(callToUse, bindingContext, resolutionFacade)
val resolvedCall = candidates.singleOrNull { it.resultingDescriptor.original == overload.original } ?: return null
val resolvedCall = candidates.singleOrNull { descriptorsEqual(it.resultingDescriptor, overload) } ?: return null
val resultingDescriptor = resolvedCall.resultingDescriptor
val argumentToParameter = { argument: ValueArgument -> (resolvedCall.getArgumentMapping(argument) as? ArgumentMatch)?.valueParameter }
@@ -385,5 +381,13 @@ class KotlinFunctionParameterInfoHandler : ParameterInfoHandlerWithTabActionSupp
Visibilities.isVisible(thisReceiver, it.resultingDescriptor, inDescriptor)
}
}
// we should not compare descriptors directly because partial resolve is involved
private fun descriptorsEqual(descriptor1: FunctionDescriptor, descriptor2: FunctionDescriptor): Boolean {
if (descriptor1.original == descriptor2.original) return true
val declaration1 = DescriptorToSourceUtils.descriptorToDeclaration(descriptor1) ?: return false
val declaration2 = DescriptorToSourceUtils.descriptorToDeclaration(descriptor2)
return declaration1 == declaration2
}
}
}
@@ -0,0 +1,9 @@
fun foo() {
fun fff(p: String, c: Char) {}
fff(<caret>)
}
// TYPE: "1, "
//Text: (p: String, <highlight>c: Char</highlight>), Disabled: true, Strikeout: false, Green: true
@@ -77,6 +77,12 @@ public class FunctionParameterInfoTestGenerated extends AbstractFunctionParamete
doTest(fileName);
}
@TestMetadata("LocalFunctionBug.kt")
public void testLocalFunctionBug() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/parameterInfo/functionParameterInfo/LocalFunctionBug.kt");
doTest(fileName);
}
@TestMetadata("NamedAndDefaultParameter.kt")
public void testNamedAndDefaultParameter() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/testData/parameterInfo/functionParameterInfo/NamedAndDefaultParameter.kt");