diff --git a/idea/src/META-INF/plugin.xml b/idea/src/META-INF/plugin.xml index a83595a0e2b..dd3277f94bf 100644 --- a/idea/src/META-INF/plugin.xml +++ b/idea/src/META-INF/plugin.xml @@ -336,6 +336,9 @@ + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinClassHandler.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinClassHandler.kt new file mode 100644 index 00000000000..8e6f725edf5 --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveFilesOrDirectories/MoveKotlinClassHandler.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories + +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiDirectory +import com.intellij.refactoring.move.moveClassesOrPackages.MoveClassHandler +import com.intellij.refactoring.util.MoveRenameUsageInfo +import com.intellij.usageView.UsageInfo +import org.jetbrains.kotlin.asJava.KtLightClass + +class MoveKotlinClassHandler : MoveClassHandler { + override fun doMoveClass(aClass: PsiClass, moveDestination: PsiDirectory): PsiClass? = null + override fun getName(clazz: PsiClass?): String? = null + + /** + * Ensure that Kotlin classes are not processed twice when moving Kotlin files + * (once through the Java move handler calling KtFile.getClasses() and another time through the Kotlin move handler) + */ + override fun preprocessUsages(results: MutableCollection) { + results.removeAll { usageInfo -> + usageInfo is MoveRenameUsageInfo && usageInfo.referencedElement is KtLightClass + } + } + + override fun prepareMove(aClass: PsiClass) { + } + + override fun finishMoveClass(aClass: PsiClass) { + } + +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt index 75006cf8981..5722c3777fe 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveTopLevelDeclarations/MoveKotlinTopLevelDeclarationsProcessor.kt @@ -47,10 +47,11 @@ import org.jetbrains.kotlin.idea.codeInsight.KotlinFileReferencesResolver import org.jetbrains.kotlin.idea.codeInsight.shorten.addToShorteningWaitSet import org.jetbrains.kotlin.idea.core.deleteSingle import org.jetbrains.kotlin.idea.core.getPackage -import org.jetbrains.kotlin.idea.refactoring.getUsageContext import org.jetbrains.kotlin.idea.refactoring.KotlinRefactoringBundle import org.jetbrains.kotlin.idea.refactoring.fqName.getKotlinFqName +import org.jetbrains.kotlin.idea.refactoring.getUsageContext import org.jetbrains.kotlin.idea.refactoring.move.* +import org.jetbrains.kotlin.idea.refactoring.move.moveFilesOrDirectories.MoveKotlinClassHandler import org.jetbrains.kotlin.idea.references.KtSimpleNameReference.ShorteningMode import org.jetbrains.kotlin.idea.search.projectScope import org.jetbrains.kotlin.psi.KtFile @@ -139,7 +140,9 @@ class MoveKotlinTopLevelDeclarationsProcessor( ) } - MoveClassHandler.EP_NAME.extensions.forEach { handler -> handler.preprocessUsages(results) } + MoveClassHandler.EP_NAME.extensions.forEach { handler -> + if (handler !is MoveKotlinClassHandler) handler.preprocessUsages(results) + } results }