From fefa2304a0613fa350c1f2d41e7346c5a9c41398 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Fri, 15 Sep 2017 19:20:40 +0300 Subject: [PATCH] Move to Separate File: Optimize usage search/processing - Import optimization is already performed by refactoring helper, so running optimizer explicitly is unnecessary - Do not search external usages for declarations with unchaged package and module #KT-18823 Fixed --- .../MoveDeclarationToSeparateFileIntention.kt | 7 +------ .../MoveKotlinDeclarationsProcessor.kt | 14 ++++++++++++++ .../kotlin/idea/refactoring/move/moveUtils.kt | 8 ++++++++ .../kotlin/idea/util/projectStructureUtil.kt | 8 ++++++-- 4 files changed, 29 insertions(+), 8 deletions(-) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt index aa9cce1020f..55fe22d1eb1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveDeclarations/MoveDeclarationToSeparateFileIntention.kt @@ -16,7 +16,6 @@ package org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations -import com.intellij.codeInsight.actions.OptimizeImportsProcessor import com.intellij.codeInsight.intention.LowPriorityAction import com.intellij.codeInsight.navigation.NavigationUtil import com.intellij.openapi.application.ApplicationManager @@ -29,7 +28,6 @@ import org.jetbrains.kotlin.idea.intentions.SelfTargetingRangeIntention import org.jetbrains.kotlin.idea.core.moveCaret import org.jetbrains.kotlin.idea.refactoring.createKotlinFile import org.jetbrains.kotlin.idea.refactoring.move.moveDeclarations.ui.MoveKotlinTopLevelDeclarationsDialog -import org.jetbrains.kotlin.idea.refactoring.runRefactoringWithPostprocessing import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClassOrObject @@ -108,9 +106,6 @@ class MoveDeclarationToSeparateFileIntention : } ) - val move = { MoveKotlinDeclarationsProcessor(descriptor).run() } - val optimizeImports = { OptimizeImportsProcessor(project, file).run() } - - move.runRefactoringWithPostprocessing(project, MoveKotlinDeclarationsProcessor.REFACTORING_ID, optimizeImports) + MoveKotlinDeclarationsProcessor(descriptor).run() } } \ No newline at end of file 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 bdd3d56eeae..d2505ad7946 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 @@ -41,6 +41,7 @@ import com.intellij.util.containers.MultiMap import gnu.trove.THashMap import gnu.trove.TObjectHashingStrategy import org.jetbrains.kotlin.asJava.elements.KtLightDeclaration +import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.asJava.toLightElements import org.jetbrains.kotlin.idea.codeInsight.shorten.addToBeShortenedDescendantsToWaitingSet import org.jetbrains.kotlin.idea.core.deleteSingle @@ -48,6 +49,9 @@ import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName import org.jetbrains.kotlin.idea.refactoring.move.* import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories.MoveKotlinClassHandler import org.jetbrains.kotlin.idea.search.projectScope +import org.jetbrains.kotlin.idea.util.projectStructure.getModule +import org.jetbrains.kotlin.idea.util.projectStructure.module +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext @@ -149,8 +153,18 @@ class MoveKotlinDeclarationsProcessor( val newContainerName = descriptor.moveTarget.targetContainerFqName?.asString() ?: "" + fun canSkipUsages(element: PsiElement): Boolean { + val ktDeclaration = element.namedUnwrappedElement as? KtNamedDeclaration ?: return false + if (ktDeclaration.hasModifier(KtTokens.PRIVATE_KEYWORD)) return false + val (oldContainer, newContainer) = descriptor.delegate.getContainerChangeInfo(ktDeclaration, descriptor.moveTarget) + val targetModule = descriptor.moveTarget.targetFile?.getModule(project) ?: return false + return oldContainer == newContainer && ktDeclaration.module == targetModule + } + fun collectUsages(kotlinToLightElements: Map>, result: MutableCollection) { kotlinToLightElements.values.flatten().flatMapTo(result) { lightElement -> + if (canSkipUsages(lightElement)) return@flatMapTo emptyList() + val newFqName = StringUtil.getQualifiedName(newContainerName, lightElement.name) val foundReferences = HashSet() diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt index 494e6e15152..c7e1671c5da 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveUtils.kt @@ -70,12 +70,20 @@ sealed class ContainerInfo { override fun matches(descriptor: DeclarationDescriptor): Boolean { return descriptor is PackageFragmentDescriptor && descriptor.fqName == fqName } + + override fun equals(other: Any?) = other is Package && other.fqName == fqName + + override fun hashCode() = fqName.hashCode() } class Class(override val fqName: FqName) : ContainerInfo() { override fun matches(descriptor: DeclarationDescriptor): Boolean { return descriptor is ClassDescriptor && descriptor.importableFqName == fqName } + + override fun equals(other: Any?) = other is Class && other.fqName == fqName + + override fun hashCode() = fqName.hashCode() } } diff --git a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt index e2f012cb7c5..56d1aca64ac 100644 --- a/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt +++ b/idea/src/org/jetbrains/kotlin/idea/util/projectStructureUtil.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.idea.util.projectStructure import com.intellij.openapi.module.Module import com.intellij.openapi.module.ModuleManager +import com.intellij.openapi.module.ModuleUtilCore import com.intellij.openapi.project.Project import com.intellij.openapi.projectRoots.Sdk import com.intellij.openapi.roots.ModuleRootManager @@ -25,6 +26,8 @@ import com.intellij.openapi.roots.OrderEnumerator import com.intellij.openapi.roots.OrderRootType import com.intellij.openapi.roots.libraries.Library import com.intellij.openapi.vfs.VfsUtil +import com.intellij.openapi.vfs.VirtualFile +import com.intellij.psi.PsiElement import java.io.File fun Project.allModules() = ModuleManager.getInstance(this).modules.toList() @@ -67,6 +70,7 @@ fun Library.ModifiableModel.replaceFileRoot(oldFile: File, newFile: File) { replaceInRootType(OrderRootType.SOURCES) } +fun VirtualFile.getModule(project: Project) = ModuleUtilCore.findModuleForFile(this, project) - - +val PsiElement.module + get() = ModuleUtilCore.findModuleForPsiElement(this) \ No newline at end of file