From dc04b200b6bbe45bd9378302bdb69567a8b2b4b5 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 22 Mar 2017 16:08:19 +0300 Subject: [PATCH] Move: Do not shorten references unaffected by the refactoring --- .../idea/codeInsight/shorten/shortenWaitingSet.kt | 13 +++++++++++++ .../kotlin/idea/references/KtSimpleNameReference.kt | 11 ++++++----- .../moveDeclarations/MoveDeclarationsDelegate.kt | 3 ++- .../MoveKotlinDeclarationsProcessor.kt | 6 +++--- .../after/source/Foo.kt | 6 ++++++ .../after/target/foo.kt | 5 +++++ .../after/util/util.kt | 3 +++ .../before/source/Foo.kt | 9 +++++++++ .../before/util/util.kt | 3 +++ .../unaffectedQualifiedReferences.test | 5 +++++ .../idea/refactoring/move/MoveTestGenerated.java | 6 ++++++ 11 files changed, 61 insertions(+), 9 deletions(-) create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/source/Foo.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/target/foo.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/util/util.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/source/Foo.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/util/util.kt create mode 100644 idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt index b87775f3b7b..e1323050814 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/codeInsight/shorten/shortenWaitingSet.kt @@ -27,6 +27,8 @@ import com.intellij.psi.SmartPointerManager import com.intellij.openapi.diagnostic.Logger import org.jetbrains.kotlin.idea.core.ShortenReferences.Options import org.jetbrains.kotlin.idea.core.ShortenReferences +import org.jetbrains.kotlin.psi.CopyableUserDataProperty +import org.jetbrains.kotlin.psi.psiUtil.forEachDescendantOfType import java.util.* class ShorteningRequest(val pointer: SmartPsiElementPointer, val options: Options) @@ -88,3 +90,14 @@ fun prepareElementsToShorten(project: Project) { project.elementsToShorten = null } } + +var KtElement.isToBeShortened: Boolean? by CopyableUserDataProperty(Key.create("IS_TO_BE_SHORTENED")) + +fun KtElement.addToBeShortenedDescendantsToWaitingSet() { + forEachDescendantOfType { + if (it.isToBeShortened ?: false) { + it.isToBeShortened = null + it.addToShorteningWaitSet() + } + } +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt index 6d0d0637858..35a1b98bc53 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/references/KtSimpleNameReference.kt @@ -24,6 +24,7 @@ import com.intellij.util.IncorrectOperationException import com.intellij.util.SmartList import org.jetbrains.kotlin.descriptors.DeclarationDescriptor import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet +import org.jetbrains.kotlin.idea.codeInsight.shorten.isToBeShortened import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.quoteIfNeeded import org.jetbrains.kotlin.idea.intentions.OperatorToFunctionIntention @@ -131,6 +132,7 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere enum class ShorteningMode { NO_SHORTENING, DELAYED_SHORTENING, + DELAYED_SHORTENING_VIA_USER_DATA, FORCED_SHORTENING } @@ -157,11 +159,10 @@ class KtSimpleNameReference(expression: KtSimpleNameExpression) : KtSimpleRefere val needToShorten = PsiTreeUtil.getParentOfType(expression, KtImportDirective::class.java, KtPackageDirective::class.java) == null if (needToShorten) { - if (shorteningMode == ShorteningMode.FORCED_SHORTENING) { - ShortenReferences.DEFAULT.process(newQualifiedElement) - } - else { - newQualifiedElement.addToShorteningWaitSet() + when (shorteningMode) { + ShorteningMode.FORCED_SHORTENING -> ShortenReferences.DEFAULT.process(newQualifiedElement) + ShorteningMode.DELAYED_SHORTENING_VIA_USER_DATA -> newQualifiedElement.isToBeShortened = true + else -> newQualifiedElement.addToShorteningWaitSet() } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationsDelegate.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationsDelegate.kt index 76a9325d35f..42de851dd1f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationsDelegate.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationsDelegate.kt @@ -26,6 +26,7 @@ import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.codeInsight.shorten.isToBeShortened import org.jetbrains.kotlin.idea.refactoring.move.* import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.lexer.KtTokens @@ -130,7 +131,7 @@ sealed class MoveDeclarationsDelegate { val type = (containingClassOrObject!!.resolveToDescriptor() as ClassDescriptor).defaultType val parameter = KtPsiFactory(project) .createParameter("private val $outerInstanceParameterName: ${IdeDescriptorRenderers.SOURCE_CODE.renderType(type)}") - createPrimaryConstructorParameterListIfAbsent().addParameter(parameter) + createPrimaryConstructorParameterListIfAbsent().addParameter(parameter).isToBeShortened = true } } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt index 325a56fedb5..1efbe633712 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveKotlinDeclarationsProcessor.kt @@ -42,7 +42,7 @@ import gnu.trove.THashMap import gnu.trove.TObjectHashingStrategy import org.jetbrains.kotlin.asJava.elements.KtLightElement import org.jetbrains.kotlin.asJava.toLightElements -import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet +import org.jetbrains.kotlin.idea.codeInsight.shorten.addToBeShortenedDescendantsToWaitingSet import org.jetbrains.kotlin.idea.core.deleteSingle import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.refactoring.move.* @@ -221,7 +221,7 @@ class MoveKotlinDeclarationsProcessor( descriptor.delegate.preprocessDeclaration(descriptor, declaration) val newElement = mover(declaration, targetContainer) - newElement.addToShorteningWaitSet() + newElement.addToBeShortenedDescendantsToWaitingSet() return newElement } @@ -236,7 +236,7 @@ class MoveKotlinDeclarationsProcessor( descriptor.delegate.preprocessUsages(project, descriptor, usagesToProcessBeforeMove) descriptor.delegate.preprocessUsages(project, descriptor, usagesToProcessAfterMove) - postProcessMoveUsages(usagesToProcessBeforeMove, shorteningMode = ShorteningMode.NO_SHORTENING) + postProcessMoveUsages(usagesToProcessBeforeMove, shorteningMode = ShorteningMode.DELAYED_SHORTENING_VIA_USER_DATA) val oldToNewElementsMapping = THashMap( object: TObjectHashingStrategy { diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/source/Foo.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/source/Foo.kt new file mode 100644 index 00000000000..73873239299 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/source/Foo.kt @@ -0,0 +1,6 @@ +package source + +class Foo { + +} + diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/target/foo.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/target/foo.kt new file mode 100644 index 00000000000..af339b6b8c9 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/target/foo.kt @@ -0,0 +1,5 @@ +package target + +fun foo() { + val util: util.Util = util.Util() +} \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/util/util.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/util/util.kt new file mode 100644 index 00000000000..37788d25191 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/after/util/util.kt @@ -0,0 +1,3 @@ +package util + +class Util \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/source/Foo.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/source/Foo.kt new file mode 100644 index 00000000000..e1098732cc1 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/source/Foo.kt @@ -0,0 +1,9 @@ +package source + +class Foo { + +} + +fun foo() { + val util: util.Util = util.Util() +} \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/util/util.kt b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/util/util.kt new file mode 100644 index 00000000000..37788d25191 --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/before/util/util.kt @@ -0,0 +1,3 @@ +package util + +class Util \ No newline at end of file diff --git a/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test new file mode 100644 index 00000000000..1a649bb5efc --- /dev/null +++ b/idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test @@ -0,0 +1,5 @@ +{ + "mainFile": "source/Foo.kt", + "type": "MOVE_KOTLIN_TOP_LEVEL_DECLARATIONS", + "targetPackage": "target" +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java index 235d12b68ac..49a573d7482 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/move/MoveTestGenerated.java @@ -552,6 +552,12 @@ public class MoveTestGenerated extends AbstractMoveTest { doTest(fileName); } + @TestMetadata("kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test") + public void testKotlin_moveTopLevelDeclarations_misc_unaffectedQualifiedReferences_UnaffectedQualifiedReferences() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/unaffectedQualifiedReferences/unaffectedQualifiedReferences.test"); + doTest(fileName); + } + @TestMetadata("kotlin/moveTopLevelDeclarations/misc/visibilityConflictInImport/visibilityConflictInImport.test") public void testKotlin_moveTopLevelDeclarations_misc_visibilityConflictInImport_VisibilityConflictInImport() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/move/kotlin/moveTopLevelDeclarations/misc/visibilityConflictInImport/visibilityConflictInImport.test");