Fixed ShortenReferences for the case of extension for object
This commit is contained in:
@@ -444,8 +444,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
element: KtDotQualifiedExpression,
|
element: KtDotQualifiedExpression,
|
||||||
bindingContext: BindingContext
|
bindingContext: BindingContext
|
||||||
): AnalyzeQualifiedElementResult {
|
): AnalyzeQualifiedElementResult {
|
||||||
val receiver = element.receiverExpression
|
if (!canBePossibleToDropReceiver(element, bindingContext)) return AnalyzeQualifiedElementResult.Skip
|
||||||
if (receiver !is KtThisExpression && bindingContext[BindingContext.QUALIFIER, receiver] == null) return AnalyzeQualifiedElementResult.Skip
|
|
||||||
|
|
||||||
if (PsiTreeUtil.getParentOfType(
|
if (PsiTreeUtil.getParentOfType(
|
||||||
element,
|
element,
|
||||||
@@ -503,6 +502,7 @@ class ShortenReferences(val options: (KtElement) -> Options = { Options.DEFAULT
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
val receiver = element.receiverExpression
|
||||||
if (receiver is KtThisExpression) {
|
if (receiver is KtThisExpression) {
|
||||||
if (!targetsMatch) return AnalyzeQualifiedElementResult.Skip
|
if (!targetsMatch) return AnalyzeQualifiedElementResult.Skip
|
||||||
val originalCall = selector.getResolvedCall(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
val originalCall = selector.getResolvedCall(bindingContext) ?: return AnalyzeQualifiedElementResult.Skip
|
||||||
@@ -536,6 +536,17 @@ 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
|
||||||
|
}
|
||||||
|
|
||||||
private fun copyShortenAndAnalyze(
|
private fun copyShortenAndAnalyze(
|
||||||
element: KtDotQualifiedExpression,
|
element: KtDotQualifiedExpression,
|
||||||
bindingContext: BindingContext
|
bindingContext: BindingContext
|
||||||
|
|||||||
@@ -0,0 +1,5 @@
|
|||||||
|
package dependency
|
||||||
|
|
||||||
|
object AnObject
|
||||||
|
|
||||||
|
fun AnObject.extFun(){}
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
import dependency.extFun
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
<selection>dependency.AnObject.extFun()</selection>
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
import dependency.AnObject
|
||||||
|
import dependency.extFun
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
AnObject.extFun()
|
||||||
|
}
|
||||||
@@ -59,6 +59,12 @@ public class ShortenRefsTestGenerated extends AbstractShortenRefsTest {
|
|||||||
runTest("idea/testData/shortenRefs/descriptorsChangeAfterImportInsertion.kt");
|
runTest("idea/testData/shortenRefs/descriptorsChangeAfterImportInsertion.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("extensionForObject.kt")
|
||||||
|
public void testExtensionForObject() throws Exception {
|
||||||
|
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/shortenRefs/extensionForObject.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("extensionFunctionVarInvokedWithQualifier.kt")
|
@TestMetadata("extensionFunctionVarInvokedWithQualifier.kt")
|
||||||
public void testExtensionFunctionVarInvokedWithQualifier() throws Exception {
|
public void testExtensionFunctionVarInvokedWithQualifier() throws Exception {
|
||||||
runTest("idea/testData/shortenRefs/extensionFunctionVarInvokedWithQualifier.kt");
|
runTest("idea/testData/shortenRefs/extensionFunctionVarInvokedWithQualifier.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user