Extract Function: Fix extraction of reference to class object property
#KT-5053 Fixed
This commit is contained in:
@@ -40,6 +40,11 @@ import com.intellij.psi.PsiNamedElement
|
|||||||
import org.jetbrains.jet.lang.psi.JetSuperExpression
|
import org.jetbrains.jet.lang.psi.JetSuperExpression
|
||||||
import org.jetbrains.jet.lang.types.JetType
|
import org.jetbrains.jet.lang.types.JetType
|
||||||
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
|
||||||
|
import org.jetbrains.jet.lang.psi.psiUtil.getQualifiedElementSelector
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassDescriptor
|
||||||
|
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
|
||||||
|
import org.jetbrains.jet.lang.resolve.scopes.receivers.ThisReceiver
|
||||||
|
import org.jetbrains.jet.lang.descriptors.ClassKind
|
||||||
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
|
import org.jetbrains.jet.lang.psi.psiUtil.getParentByType
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclaration
|
import org.jetbrains.jet.lang.psi.JetDeclaration
|
||||||
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
import org.jetbrains.jet.lang.psi.JetDeclarationWithBody
|
||||||
@@ -120,21 +125,26 @@ class ExtractionData(
|
|||||||
val startOffset = body.getBlockContentOffset()
|
val startOffset = body.getBlockContentOffset()
|
||||||
|
|
||||||
val referencesInfo = ArrayList<ResolvedReferenceInfo>()
|
val referencesInfo = ArrayList<ResolvedReferenceInfo>()
|
||||||
for ((ref, context) in JetFileReferencesResolver.resolve(body)) {
|
val refToContextMap = JetFileReferencesResolver.resolve(body)
|
||||||
|
for ((ref, context) in refToContextMap) {
|
||||||
if (ref !is JetSimpleNameExpression) continue
|
if (ref !is JetSimpleNameExpression) continue
|
||||||
|
|
||||||
val parent = ref.getParent()
|
|
||||||
if (parent is JetQualifiedExpression
|
|
||||||
&& parent.getSelectorExpression() == ref
|
|
||||||
&& parent.getReceiverExpression() !is JetSuperExpression) continue
|
|
||||||
|
|
||||||
val offset = ref.getTextRange()!!.getStartOffset() - startOffset
|
val offset = ref.getTextRange()!!.getStartOffset() - startOffset
|
||||||
refOffsetToDeclaration[offset]?.let { originalResolveResult ->
|
val originalResolveResult = refOffsetToDeclaration[offset]
|
||||||
val descriptor = context[BindingContext.REFERENCE_TARGET, ref]
|
if (originalResolveResult == null) continue
|
||||||
if (!compareDescriptors(originalResolveResult.descriptor, descriptor)
|
|
||||||
&& !originalResolveResult.declaration.isInsideOf(originalElements)) {
|
val parent = ref.getParent()
|
||||||
referencesInfo.add(ResolvedReferenceInfo(ref, offset, originalResolveResult))
|
if (parent is JetQualifiedExpression && parent.getSelectorExpression() == ref) {
|
||||||
}
|
val receiverDescriptor =
|
||||||
|
(originalResolveResult.resolvedCall?.getThisObject() as? ThisReceiver)?.getDeclarationDescriptor()
|
||||||
|
if ((receiverDescriptor as? ClassDescriptor)?.getKind() != ClassKind.CLASS_OBJECT
|
||||||
|
&& parent.getReceiverExpression() !is JetSuperExpression) continue
|
||||||
|
}
|
||||||
|
|
||||||
|
val descriptor = context[BindingContext.REFERENCE_TARGET, ref]
|
||||||
|
if (!compareDescriptors(originalResolveResult.descriptor, descriptor)
|
||||||
|
&& !originalResolveResult.declaration.isInsideOf(originalElements)) {
|
||||||
|
referencesInfo.add(ResolvedReferenceInfo(ref, offset, originalResolveResult))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,14 @@
|
|||||||
|
// SIBLING:
|
||||||
|
class MyClass {
|
||||||
|
fun test() {
|
||||||
|
<selection>P.foo()
|
||||||
|
P.a</selection>
|
||||||
|
}
|
||||||
|
|
||||||
|
public class P {
|
||||||
|
class object {
|
||||||
|
val a = 1
|
||||||
|
fun foo() = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
+18
@@ -0,0 +1,18 @@
|
|||||||
|
// SIBLING:
|
||||||
|
class MyClass {
|
||||||
|
fun test() {
|
||||||
|
unit()
|
||||||
|
}
|
||||||
|
|
||||||
|
public class P {
|
||||||
|
class object {
|
||||||
|
val a = 1
|
||||||
|
fun foo() = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fun unit() {
|
||||||
|
MyClass.P.foo()
|
||||||
|
MyClass.P.a
|
||||||
|
}
|
||||||
+5
@@ -729,6 +729,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest {
|
|||||||
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/multipleOccurrences.kt");
|
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/multipleOccurrences.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("qualifiedClassObject.kt")
|
||||||
|
public void testQualifiedClassObject() throws Exception {
|
||||||
|
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("usagesInCallArgs.kt")
|
@TestMetadata("usagesInCallArgs.kt")
|
||||||
public void testUsagesInCallArgs() throws Exception {
|
public void testUsagesInCallArgs() throws Exception {
|
||||||
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt");
|
doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user