From 064ff5d8cc38d0d7cf4574eeef7f596d7cb3f709 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Mon, 5 Oct 2015 21:25:34 +0300 Subject: [PATCH] Fixed bug with local function --- .../KotlinFunctionParameterInfoHandler.kt | 20 +++++++++++-------- .../functionParameterInfo/LocalFunctionBug.kt | 9 +++++++++ .../FunctionParameterInfoTestGenerated.java | 6 ++++++ 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 idea/testData/parameterInfo/functionParameterInfo/LocalFunctionBug.kt diff --git a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt index 36593cc9e73..3726bd08b74 100644 --- a/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt +++ b/idea/src/org/jetbrains/kotlin/idea/parameterInfo/KotlinFunctionParameterInfoHandler.kt @@ -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 + } } } diff --git a/idea/testData/parameterInfo/functionParameterInfo/LocalFunctionBug.kt b/idea/testData/parameterInfo/functionParameterInfo/LocalFunctionBug.kt new file mode 100644 index 00000000000..bdc7df75b9f --- /dev/null +++ b/idea/testData/parameterInfo/functionParameterInfo/LocalFunctionBug.kt @@ -0,0 +1,9 @@ +fun foo() { + fun fff(p: String, c: Char) {} + + fff() +} + +// TYPE: "1, " + +//Text: (p: String, c: Char), Disabled: true, Strikeout: false, Green: true \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/FunctionParameterInfoTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/FunctionParameterInfoTestGenerated.java index 11d47d8e380..f61f0fee789 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/FunctionParameterInfoTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/parameterInfo/FunctionParameterInfoTestGenerated.java @@ -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");