Lower priority for extensions on own type parameters
This commit is contained in:
@@ -135,6 +135,7 @@ enum class CallableWeight {
|
||||
thisTypeExtension,
|
||||
baseTypeExtension,
|
||||
globalOrStatic, // global non-extension
|
||||
typeParameterExtension,
|
||||
receiverCastRequired
|
||||
}
|
||||
|
||||
|
||||
+17
-4
@@ -334,12 +334,19 @@ public class LookupElementFactory(
|
||||
|
||||
val receiverParameter = descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
|
||||
if (receiverParameter != null) {
|
||||
return if (receiverTypes.any { TypeUtils.equalTypes(it, receiverParameter.type) })
|
||||
if (descriptor.isExtension) CallableWeight.thisTypeExtension else CallableWeight.thisClassMember
|
||||
else if (receiverTypes.any { it.isSubtypeOf(receiverParameter.type) })
|
||||
return if (receiverTypes.any { TypeUtils.equalTypes(it, receiverParameter.type) }) {
|
||||
when {
|
||||
descriptor.isExtensionForTypeParameter() -> CallableWeight.typeParameterExtension
|
||||
descriptor.isExtension -> CallableWeight.thisTypeExtension
|
||||
else -> CallableWeight.thisClassMember
|
||||
}
|
||||
}
|
||||
else if (receiverTypes.any { it.isSubtypeOf(receiverParameter.type) }) {
|
||||
if (descriptor.isExtension) CallableWeight.baseTypeExtension else CallableWeight.baseClassMember
|
||||
else
|
||||
}
|
||||
else {
|
||||
CallableWeight.receiverCastRequired
|
||||
}
|
||||
}
|
||||
|
||||
return when (descriptor.containingDeclaration) {
|
||||
@@ -348,6 +355,12 @@ public class LookupElementFactory(
|
||||
}
|
||||
}
|
||||
|
||||
private fun CallableDescriptor.isExtensionForTypeParameter(): Boolean {
|
||||
val receiverParameter = original.extensionReceiverParameter ?: return false
|
||||
val typeParameter = receiverParameter.type.constructor.declarationDescriptor as? TypeParameterDescriptor ?: return false
|
||||
return typeParameter.containingDeclaration == original
|
||||
}
|
||||
|
||||
companion object {
|
||||
public fun getDefaultInsertHandler(descriptor: DeclarationDescriptor): InsertHandler<LookupElement> {
|
||||
return when (descriptor) {
|
||||
|
||||
@@ -12,4 +12,4 @@ fun f(pair: Pair<out Any, out Any>) {
|
||||
// EXIST: { lookupString: "hashCode", attributes: "bold" }
|
||||
// EXIST: { lookupString: "forString", attributes: "grayed" }
|
||||
// EXIST: { lookupString: "forAny", attributes: "bold" }
|
||||
// EXIST: { lookupString: "forT", attributes: "bold" }
|
||||
// EXIST: { lookupString: "forT", attributes: "" }
|
||||
|
||||
Vendored
+11
@@ -0,0 +1,11 @@
|
||||
fun <T> List<T>.forListT(){}
|
||||
fun <T> Collection<T>.forCollectionT(){}
|
||||
fun <T> T.forT() {}
|
||||
|
||||
fun foo(list: List<String>) {
|
||||
list.<caret>
|
||||
}
|
||||
|
||||
// EXIST: { itemText: "forListT", attributes: "bold" }
|
||||
// EXIST: { itemText: "forCollectionT", attributes: "" }
|
||||
// EXIST: { itemText: "forT", attributes: "" }
|
||||
@@ -18,12 +18,14 @@ class Derived : Base() {
|
||||
}
|
||||
}
|
||||
|
||||
fun Any.aAnyExtensionFun(){}
|
||||
fun Any.aaAnyExtensionFun(){}
|
||||
fun Derived.aaExtensionFun(){}
|
||||
|
||||
val Any.aAnyExtensionProp: Int get() = 1
|
||||
val Any.aaAnyExtensionProp: Int get() = 1
|
||||
val Derived.aaExtensionProp: Int get() = 1
|
||||
|
||||
fun <T> T.aaTypeParamExt(){}
|
||||
|
||||
// ORDER: aaLocalVal
|
||||
// ORDER: aaLocalFun
|
||||
// ORDER: aaDerivedProp
|
||||
@@ -32,7 +34,8 @@ val Derived.aaExtensionProp: Int get() = 1
|
||||
// ORDER: aaBaseFun
|
||||
// ORDER: aaExtensionProp
|
||||
// ORDER: aaExtensionFun
|
||||
// ORDER: aAnyExtensionProp
|
||||
// ORDER: aAnyExtensionFun
|
||||
// ORDER: aaAnyExtensionProp
|
||||
// ORDER: aaAnyExtensionFun
|
||||
// ORDER: aaGlobalProp
|
||||
// ORDER: aaGlobalFun
|
||||
// ORDER: aaTypeParamExt
|
||||
|
||||
@@ -16,8 +16,8 @@ class C {
|
||||
// ORDER: "pFoo, s"
|
||||
// ORDER: this
|
||||
// ORDER: local
|
||||
// ORDER: apply
|
||||
// ORDER: nonNullable
|
||||
// ORDER: apply
|
||||
// ORDER: nullableX
|
||||
// ORDER: nullableX
|
||||
// ORDER: C
|
||||
|
||||
+6
@@ -1425,6 +1425,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ImmediateExtensionMembersGeneric.kt")
|
||||
public void testImmediateExtensionMembersGeneric() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateExtensionMembersGeneric.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ImmediateMembers1.kt")
|
||||
public void testImmediateMembers1() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt");
|
||||
|
||||
+6
@@ -1425,6 +1425,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ImmediateExtensionMembersGeneric.kt")
|
||||
public void testImmediateExtensionMembersGeneric() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateExtensionMembersGeneric.kt");
|
||||
doTest(fileName);
|
||||
}
|
||||
|
||||
@TestMetadata("ImmediateMembers1.kt")
|
||||
public void testImmediateMembers1() throws Exception {
|
||||
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt");
|
||||
|
||||
Reference in New Issue
Block a user