Lower priority for extensions on own type parameters

This commit is contained in:
Valentin Kipyatkov
2015-08-12 22:29:07 +03:00
parent 9e26d0eacf
commit 000d2f0cd1
8 changed files with 50 additions and 10 deletions
@@ -135,6 +135,7 @@ enum class CallableWeight {
thisTypeExtension,
baseTypeExtension,
globalOrStatic, // global non-extension
typeParameterExtension,
receiverCastRequired
}
@@ -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: "" }
@@ -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: "" }
+7 -4
View File
@@ -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
@@ -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");
@@ -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");