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, thisTypeExtension,
baseTypeExtension, baseTypeExtension,
globalOrStatic, // global non-extension globalOrStatic, // global non-extension
typeParameterExtension,
receiverCastRequired receiverCastRequired
} }
@@ -334,12 +334,19 @@ public class LookupElementFactory(
val receiverParameter = descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter val receiverParameter = descriptor.extensionReceiverParameter ?: descriptor.dispatchReceiverParameter
if (receiverParameter != null) { if (receiverParameter != null) {
return if (receiverTypes.any { TypeUtils.equalTypes(it, receiverParameter.type) }) return if (receiverTypes.any { TypeUtils.equalTypes(it, receiverParameter.type) }) {
if (descriptor.isExtension) CallableWeight.thisTypeExtension else CallableWeight.thisClassMember when {
else if (receiverTypes.any { it.isSubtypeOf(receiverParameter.type) }) 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 if (descriptor.isExtension) CallableWeight.baseTypeExtension else CallableWeight.baseClassMember
else }
else {
CallableWeight.receiverCastRequired CallableWeight.receiverCastRequired
}
} }
return when (descriptor.containingDeclaration) { 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 { companion object {
public fun getDefaultInsertHandler(descriptor: DeclarationDescriptor): InsertHandler<LookupElement> { public fun getDefaultInsertHandler(descriptor: DeclarationDescriptor): InsertHandler<LookupElement> {
return when (descriptor) { return when (descriptor) {
@@ -12,4 +12,4 @@ fun f(pair: Pair<out Any, out Any>) {
// EXIST: { lookupString: "hashCode", attributes: "bold" } // EXIST: { lookupString: "hashCode", attributes: "bold" }
// EXIST: { lookupString: "forString", attributes: "grayed" } // EXIST: { lookupString: "forString", attributes: "grayed" }
// EXIST: { lookupString: "forAny", attributes: "bold" } // 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(){} fun Derived.aaExtensionFun(){}
val Any.aAnyExtensionProp: Int get() = 1 val Any.aaAnyExtensionProp: Int get() = 1
val Derived.aaExtensionProp: Int get() = 1 val Derived.aaExtensionProp: Int get() = 1
fun <T> T.aaTypeParamExt(){}
// ORDER: aaLocalVal // ORDER: aaLocalVal
// ORDER: aaLocalFun // ORDER: aaLocalFun
// ORDER: aaDerivedProp // ORDER: aaDerivedProp
@@ -32,7 +34,8 @@ val Derived.aaExtensionProp: Int get() = 1
// ORDER: aaBaseFun // ORDER: aaBaseFun
// ORDER: aaExtensionProp // ORDER: aaExtensionProp
// ORDER: aaExtensionFun // ORDER: aaExtensionFun
// ORDER: aAnyExtensionProp // ORDER: aaAnyExtensionProp
// ORDER: aAnyExtensionFun // ORDER: aaAnyExtensionFun
// ORDER: aaGlobalProp // ORDER: aaGlobalProp
// ORDER: aaGlobalFun // ORDER: aaGlobalFun
// ORDER: aaTypeParamExt
@@ -16,8 +16,8 @@ class C {
// ORDER: "pFoo, s" // ORDER: "pFoo, s"
// ORDER: this // ORDER: this
// ORDER: local // ORDER: local
// ORDER: apply
// ORDER: nonNullable // ORDER: nonNullable
// ORDER: apply
// ORDER: nullableX // ORDER: nullableX
// ORDER: nullableX // ORDER: nullableX
// ORDER: C // ORDER: C
@@ -1425,6 +1425,12 @@ public class JSBasicCompletionTestGenerated extends AbstractJSBasicCompletionTes
doTest(fileName); 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") @TestMetadata("ImmediateMembers1.kt")
public void testImmediateMembers1() throws Exception { public void testImmediateMembers1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt"); String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt");
@@ -1425,6 +1425,12 @@ public class JvmBasicCompletionTestGenerated extends AbstractJvmBasicCompletionT
doTest(fileName); 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") @TestMetadata("ImmediateMembers1.kt")
public void testImmediateMembers1() throws Exception { public void testImmediateMembers1() throws Exception {
String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt"); String fileName = JetTestUtils.navigationMetadata("idea/idea-completion/testData/basic/common/immediateMembers/ImmediateMembers1.kt");