diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt index 624c0500b7c..6a0ee43874e 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/SmartCompletion.kt @@ -37,6 +37,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.types.JetType import org.jetbrains.kotlin.types.TypeUtils import org.jetbrains.kotlin.types.typeUtil.makeNotNullable +import org.jetbrains.kotlin.utils.addIfNotNull import org.jetbrains.kotlin.utils.addToStdlib.check import org.jetbrains.kotlin.utils.addToStdlib.singletonList import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptySet @@ -164,7 +165,7 @@ class SmartCompletion( } if (callTypeAndReceiver is CallTypeAndReceiver.DEFAULT) { - toCallableReferenceLookupElement(descriptor)?.let { result.add(it) } + result.addCallableReferenceLookupElements(descriptor) } return result @@ -315,8 +316,8 @@ class SmartCompletion( return null } - private fun toCallableReferenceLookupElement(descriptor: DeclarationDescriptor): LookupElement? { - if (callableTypeExpectedInfo.isEmpty()) return null + private fun MutableCollection.addCallableReferenceLookupElements(descriptor: DeclarationDescriptor) { + if (callableTypeExpectedInfo.isEmpty()) return fun toLookupElement(descriptor: CallableDescriptor): LookupElement? { val callableReferenceType = descriptor.callableReferenceType(resolutionFacade) ?: return null @@ -345,24 +346,21 @@ class SmartCompletion( when (descriptor) { is CallableDescriptor -> { - if (descriptor.dispatchReceiverParameter != null || descriptor.extensionReceiverParameter != null) { - return null // members and extensions are not supported after "::" currently + // members and extensions are not supported after "::" currently + if (descriptor.dispatchReceiverParameter == null && descriptor.extensionReceiverParameter == null) { + addIfNotNull(toLookupElement(descriptor)) } - return toLookupElement(descriptor) } is ClassDescriptor -> { if (descriptor.modality != Modality.ABSTRACT && !descriptor.isInner) { - val constructors = descriptor.getConstructors().filter(visibilityFilter) - if (constructors.size() == 1) { - //TODO: this code is to be changed if overloads to start work after :: - return toLookupElement(constructors.single()) - } + descriptor.constructors + .filter(visibilityFilter) + .map { toLookupElement(it) } + .filterNotNullTo(this) } } } - - return null } private fun buildForAsTypePosition(): Collection? { diff --git a/idea/idea-completion/testData/smart/callableReference/NoQualifier7.kt b/idea/idea-completion/testData/smart/callableReference/NoQualifier7.kt index c1976752393..bf74c0467ae 100644 --- a/idea/idea-completion/testData/smart/callableReference/NoQualifier7.kt +++ b/idea/idea-completion/testData/smart/callableReference/NoQualifier7.kt @@ -6,4 +6,4 @@ fun bar(){ foo() } -// ABSENT: ::Date +// EXIST: ::Date diff --git a/idea/idea-completion/testData/smart/callableReference/NoQualifierMultipleConstructors.kt b/idea/idea-completion/testData/smart/callableReference/NoQualifierMultipleConstructors.kt new file mode 100644 index 00000000000..c0aa4036314 --- /dev/null +++ b/idea/idea-completion/testData/smart/callableReference/NoQualifierMultipleConstructors.kt @@ -0,0 +1,13 @@ +class A { + fun foo(p: (Int) -> Any){} + + fun bar() { + foo() + } +} + +class B() { + constructor(p: Int) : this(){} +} + +// EXIST: ::B diff --git a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java index 23f2cd88d96..9f348df6f75 100644 --- a/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java +++ b/idea/idea-completion/tests/org/jetbrains/kotlin/idea/completion/test/JvmSmartCompletionTestGenerated.java @@ -673,6 +673,12 @@ public class JvmSmartCompletionTestGenerated extends AbstractJvmSmartCompletionT doTest(fileName); } + @TestMetadata("NoQualifierMultipleConstructors.kt") + public void testNoQualifierMultipleConstructors() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/callableReference/NoQualifierMultipleConstructors.kt"); + doTest(fileName); + } + @TestMetadata("NoQualifierPropertyExpected.kt") public void testNoQualifierPropertyExpected() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/smart/callableReference/NoQualifierPropertyExpected.kt");