Fixed ShortenReferences for extension on companion object

This commit is contained in:
Valentin Kipyatkov
2017-09-19 16:45:57 +03:00
parent d4e0f53583
commit 69f74b2a51
5 changed files with 44 additions and 7 deletions
@@ -538,13 +538,25 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
private fun canBePossibleToDropReceiver(element: KtDotQualifiedExpression, bindingContext: BindingContext): Boolean {
val receiver = element.receiverExpression
if (receiver is KtThisExpression) return true
val qualifier = bindingContext[BindingContext.QUALIFIER, receiver] ?: return false
val classDescriptor = qualifier.descriptor as? ClassDescriptor ?: return true
if (classDescriptor.kind != ClassKind.OBJECT) return true
// for object receiver we should additionally check that it's dispatch receiver (that is the member is inside the object)
val resolvedCall = element.getResolvedCall(bindingContext) ?: return false
return resolvedCall.explicitReceiverKind == ExplicitReceiverKind.DISPATCH_RECEIVER
val nameRef = when (receiver) {
is KtThisExpression -> return true
is KtNameReferenceExpression -> receiver
is KtDotQualifiedExpression -> receiver.selectorExpression as? KtNameReferenceExpression ?: return false
else -> return false
}
val targetDescriptor = bindingContext[BindingContext.REFERENCE_TARGET, nameRef]
when (targetDescriptor) {
is ClassDescriptor -> {
if (targetDescriptor.kind != ClassKind.OBJECT) return true
// for object receiver we should additionally check that it's dispatch receiver (that is the member is inside the object)
val resolvedCall = element.getResolvedCall(bindingContext) ?: return false
return resolvedCall.explicitReceiverKind == ExplicitReceiverKind.DISPATCH_RECEIVER
}
is PackageViewDescriptor -> return true
else -> return false
}
}
private fun copyShortenAndAnalyze(
@@ -0,0 +1,8 @@
package dependency
class AClass {
companion object {
}
}
fun AClass.Companion.extFun(){}
@@ -0,0 +1,5 @@
import dependency.extFun
fun foo() {
<selection>dependency.AClass.extFun()</selection>
}
@@ -0,0 +1,6 @@
import dependency.AClass
import dependency.extFun
fun foo() {
AClass.extFun()
}
@@ -59,6 +59,12 @@ public class ShortenRefsTestGenerated extends AbstractShortenRefsTest {
runTest("idea/testData/shortenRefs/descriptorsChangeAfterImportInsertion.kt");
}
@TestMetadata("extensionForCompanionObject.kt")
public void testExtensionForCompanionObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/shortenRefs/extensionForCompanionObject.kt");
doTest(fileName);
}
@TestMetadata("extensionForObject.kt")
public void testExtensionForObject() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/shortenRefs/extensionForObject.kt");