From 3b110f8ef89976f92811ab03740276de84aa0560 Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Wed, 1 Apr 2015 12:07:46 +0300 Subject: [PATCH] KT-7194 No completion for member extension function inside itself #KT-7194 Fixed --- .../codeInsight/ReferenceVariantsHelper.kt | 8 +++++--- .../MemberExtensionsFromMemberExtension.kt | 20 +++++++++++++++++++ .../NoMemberExtensionsFromCompanionObject.kt | 14 +++++++++++++ .../JSBasicCompletionTestGenerated.java | 12 +++++++++++ .../JvmBasicCompletionTestGenerated.java | 12 +++++++++++ 5 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt create mode 100644 idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt diff --git a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt index 9621c8f3264..ba25e86ef5b 100644 --- a/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt +++ b/idea/ide-common/src/org/jetbrains/kotlin/idea/codeInsight/ReferenceVariantsHelper.kt @@ -126,12 +126,14 @@ public class ReferenceVariantsHelper( // process extensions and non-instance members for (descriptor in resolutionScope.getDescriptorsFiltered(kindFilter, nameFilter)) { - if (descriptor is CallableDescriptor && descriptor.getDispatchReceiverParameter() != null) continue // should already be processed via implicit receivers - if (descriptor is CallableDescriptor && descriptor.getExtensionReceiverParameter() != null) { - descriptorsSet.addAll(descriptor.substituteExtensionIfCallable(receiverValues, context, dataFlowInfo, CallType.NORMAL)) + val dispatchReceiver = descriptor.getDispatchReceiverParameter() + if (dispatchReceiver == null || dispatchReceiver in receivers) { + descriptorsSet.addAll(descriptor.substituteExtensionIfCallable(receiverValues, context, dataFlowInfo, CallType.NORMAL)) + } } else { + if (descriptor is CallableDescriptor && descriptor.getDispatchReceiverParameter() != null) continue // should already be processed via implicit receivers descriptorsSet.add(descriptor) } } diff --git a/idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt b/idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt new file mode 100644 index 00000000000..cae52affb13 --- /dev/null +++ b/idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt @@ -0,0 +1,20 @@ +class C { + fun String.extFun() { + + } + + fun String.otherExtFun() { } + fun Int.wrongExtFun() { } + + companion object { + fun String.companionExtFun() { } + } +} + +fun String.nonMemberExtFun() {} + +// EXIST: extFun +// EXIST: otherExtFun +// ABSENT: wrongExtFun +// EXIST: nonMemberExtFun +// EXIST: companionExtFun diff --git a/idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt b/idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt new file mode 100644 index 00000000000..616c482b7b8 --- /dev/null +++ b/idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt @@ -0,0 +1,14 @@ +class C { + fun String.extFun() { } + + companion object { + fun String.foo() { + + } + } +} + +fun String.nonMemberExtFun() {} + +// EXIST: nonMemberExtFun +// ABSENT: extFun diff --git a/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java index a5c228d1aa4..cdf285e12e3 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/JSBasicCompletionTestGenerated.java @@ -1242,6 +1242,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("MemberExtensionsFromMemberExtension.kt") + public void testMemberExtensionsFromMemberExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt"); + doTest(fileName); + } + @TestMetadata("NoDuplicatedMethodForSmartCast.kt") public void testNoDuplicatedMethodForSmartCast() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/NoDuplicatedMethodForSmartCast.kt"); @@ -1254,6 +1260,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes doTest(fileName); } + @TestMetadata("NoMemberExtensionsFromCompanionObject.kt") + public void testNoMemberExtensionsFromCompanionObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt"); + doTest(fileName); + } + @TestMetadata("WrongExplicitReceiver.kt") public void testWrongExplicitReceiver() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/WrongExplicitReceiver.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java index af0ad9c6571..5a133c9f0eb 100644 --- a/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/completion/JvmBasicCompletionTestGenerated.java @@ -1242,6 +1242,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("MemberExtensionsFromMemberExtension.kt") + public void testMemberExtensionsFromMemberExtension() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/MemberExtensionsFromMemberExtension.kt"); + doTest(fileName); + } + @TestMetadata("NoDuplicatedMethodForSmartCast.kt") public void testNoDuplicatedMethodForSmartCast() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/NoDuplicatedMethodForSmartCast.kt"); @@ -1254,6 +1260,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT doTest(fileName); } + @TestMetadata("NoMemberExtensionsFromCompanionObject.kt") + public void testNoMemberExtensionsFromCompanionObject() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/NoMemberExtensionsFromCompanionObject.kt"); + doTest(fileName); + } + @TestMetadata("WrongExplicitReceiver.kt") public void testWrongExplicitReceiver() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/completion/basic/common/extensions/WrongExplicitReceiver.kt");