diff --git a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt index 4a46d8c27da..df4e47b7c79 100644 --- a/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt +++ b/idea/src/org/jetbrains/jet/plugin/refactoring/extractFunction/ExtractionData.kt @@ -40,6 +40,11 @@ import com.intellij.psi.PsiNamedElement import org.jetbrains.jet.lang.psi.JetSuperExpression import org.jetbrains.jet.lang.types.JetType 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.JetDeclaration import org.jetbrains.jet.lang.psi.JetDeclarationWithBody @@ -120,21 +125,26 @@ class ExtractionData( val startOffset = body.getBlockContentOffset() val referencesInfo = ArrayList() - for ((ref, context) in JetFileReferencesResolver.resolve(body)) { + val refToContextMap = JetFileReferencesResolver.resolve(body) + for ((ref, context) in refToContextMap) { 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 - refOffsetToDeclaration[offset]?.let { originalResolveResult -> - val descriptor = context[BindingContext.REFERENCE_TARGET, ref] - if (!compareDescriptors(originalResolveResult.descriptor, descriptor) - && !originalResolveResult.declaration.isInsideOf(originalElements)) { - referencesInfo.add(ResolvedReferenceInfo(ref, offset, originalResolveResult)) - } + val originalResolveResult = refOffsetToDeclaration[offset] + if (originalResolveResult == null) continue + + val parent = ref.getParent() + 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)) } } diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt new file mode 100644 index 00000000000..2531a28bcde --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt @@ -0,0 +1,14 @@ +// SIBLING: +class MyClass { + fun test() { + P.foo() + P.a + } + + public class P { + class object { + val a = 1 + fun foo() = 1 + } + } +} \ No newline at end of file diff --git a/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt.after b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt.after new file mode 100644 index 00000000000..b36c9c68ecf --- /dev/null +++ b/idea/testData/refactoring/extractFunction/parameters/misc/qualifiedClassObject.kt.after @@ -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 +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java index 497c90c559b..ae7e2e315f6 100644 --- a/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/plugin/refactoring/introduce/introduceVariable/JetExtractionTestGenerated.java @@ -729,6 +729,11 @@ public class JetExtractionTestGenerated extends AbstractJetExtractionTest { 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") public void testUsagesInCallArgs() throws Exception { doExtractFunctionTest("idea/testData/refactoring/extractFunction/parameters/misc/usagesInCallArgs.kt");