diff --git a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt index 06f7521e3ef..32114799996 100644 --- a/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt +++ b/idea/idea-completion/src/org/jetbrains/kotlin/idea/completion/smart/StaticMembers.kt @@ -21,8 +21,8 @@ import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.completion.LookupElementFactory import org.jetbrains.kotlin.idea.completion.decorateAsStaticMember import org.jetbrains.kotlin.idea.core.ExpectedInfo -import org.jetbrains.kotlin.idea.core.fuzzyType import org.jetbrains.kotlin.idea.core.isVisible +import org.jetbrains.kotlin.idea.core.multipleFuzzyTypes import org.jetbrains.kotlin.idea.resolve.ResolutionFacade import org.jetbrains.kotlin.idea.util.fuzzyReturnType import org.jetbrains.kotlin.psi.KtSimpleNameExpression @@ -30,7 +30,7 @@ import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension import org.jetbrains.kotlin.types.TypeSubstitutor -import org.jetbrains.kotlin.types.TypeUtils +import java.util.* // adds java static members, enum members and members from companion object class StaticMembers( @@ -42,12 +42,16 @@ class StaticMembers( expectedInfos: Collection, context: KtSimpleNameExpression, enumEntriesToSkip: Set) { - - val expectedInfosByClass = expectedInfos.groupBy { - expectedInfo -> expectedInfo.fuzzyType?.type?.let { TypeUtils.getClassDescriptor(it) } + val expectedInfosByClass = HashMap>() + for (expectedInfo in expectedInfos) { + for (fuzzyType in expectedInfo.multipleFuzzyTypes) { + val classDescriptor = fuzzyType.type.constructor.declarationDescriptor as? ClassDescriptor ?: continue + expectedInfosByClass.getOrPut(classDescriptor) { ArrayList() }.add(expectedInfo) + } } + for ((classDescriptor, expectedInfosForClass) in expectedInfosByClass) { - if (classDescriptor != null && !classDescriptor.name.isSpecial) { + if (!classDescriptor.name.isSpecial) { addToCollection(collection, classDescriptor, expectedInfosForClass, context, enumEntriesToSkip) } } diff --git a/idea/idea-completion/testData/smart/propertyDelegate/ExtensionSubstitution1.kt b/idea/idea-completion/testData/smart/propertyDelegate/ExtensionSubstitution1.kt index 123d8639c33..33b017012eb 100644 --- a/idea/idea-completion/testData/smart/propertyDelegate/ExtensionSubstitution1.kt +++ b/idea/idea-completion/testData/smart/propertyDelegate/ExtensionSubstitution1.kt @@ -1,6 +1,10 @@ import kotlin.reflect.KProperty -class Property(owner: TOwner, value: TValue) +class Property(owner: TOwner, value: TValue) { + companion object { + fun create(owner: TOwner, value: TValue) = Property(owner, value) + } +} operator fun Property.getValue(thisRef: TOwner, property: KProperty<*>): TValue { throw Exception() @@ -14,3 +18,4 @@ class C { // EXIST: { itemText: "createProperty", typeText: "Property" } // EXIST: { itemText: "Property", tailText: "(owner: C, value: TValue) ()" } +// EXIST: { itemText:"Property.create", tailText:"(owner: C, value: TValue) ()", typeText:"Property" } diff --git a/idea/idea-completion/testData/smart/propertyDelegate/ValInClass.kt b/idea/idea-completion/testData/smart/propertyDelegate/ValInClass.kt index 5fc0c4d8d25..ef6274ee868 100644 --- a/idea/idea-completion/testData/smart/propertyDelegate/ValInClass.kt +++ b/idea/idea-completion/testData/smart/propertyDelegate/ValInClass.kt @@ -2,6 +2,10 @@ import kotlin.reflect.KProperty class X1 { operator fun getValue(thisRef: C, property: KProperty<*>): String = "" + + companion object { + fun create() = X1() + } } class X2 { operator fun getValue(thisRef: String, property: KProperty<*>): String = "" @@ -30,15 +34,19 @@ class C { } // EXIST: lazy + // EXIST: createX1 // ABSENT: createX2 // EXIST: createX3 // EXIST: createY1 // ABSENT: createY2 // EXIST: createY3 + // EXIST: X1 // ABSENT: X2 // EXIST: X3 // EXIST: Y1 // ABSENT: Y2 // ABSENT: Y3 + +// EXIST: { itemText:"X1.create", tailText:"() ()", typeText:"X1", attributes:"" }