diff --git a/idea/resources/META-INF/extensions/ide.xml b/idea/resources/META-INF/extensions/ide.xml index 635107e2f46..4e28e64f86f 100644 --- a/idea/resources/META-INF/extensions/ide.xml +++ b/idea/resources/META-INF/extensions/ide.xml @@ -73,6 +73,10 @@ + + + diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/ForeignUsagesRenameProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/ForeignUsagesRenameProcessor.kt new file mode 100644 index 00000000000..9399e9f675d --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/ForeignUsagesRenameProcessor.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2020 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea.refactoring.rename + +import com.intellij.lang.Language +import com.intellij.openapi.extensions.ExtensionPointName +import com.intellij.psi.PsiElement +import com.intellij.usageView.UsageInfo + +abstract class ForeignUsagesRenameProcessor { + companion object { + private val EP_NAME = ExtensionPointName("org.jetbrains.kotlin.foreignUsagesRenameProcessor") + + @JvmStatic + fun processAll(element: PsiElement, newName: String, usages: Array, fallbackHandler: (UsageInfo) -> Unit) { + val usagesByLanguage = usages.groupBy { it.element?.language } + for ((language, languageInfos) in usagesByLanguage) { + if (language != null && EP_NAME.extensions.any { it.process(element, newName, language, languageInfos) }) { + continue + } + languageInfos.forEach(fallbackHandler) + } + } + } + + abstract fun process(element: PsiElement, newName: String, language: Language, allUsages: Collection): Boolean +} \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFileProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFileProcessor.kt index 1c623a1c7b6..747db9b215d 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFileProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFileProcessor.kt @@ -11,13 +11,16 @@ import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiElement import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.SearchScope +import com.intellij.refactoring.listeners.RefactoringElementListener import com.intellij.refactoring.rename.RenamePsiFileProcessor +import com.intellij.usageView.UsageInfo import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.psi.KtFile +import java.util.ArrayList class RenameKotlinFileProcessor : RenamePsiFileProcessor() { class FileRenamingPsiClassWrapper( @@ -54,4 +57,14 @@ class RenameKotlinFileProcessor : RenamePsiFileProcessor() { } } } + + override fun renameElement(element: PsiElement, newName: String, usages: Array, listener: RefactoringElementListener?) { + val kotlinUsages = ArrayList(usages.size) + + ForeignUsagesRenameProcessor.processAll(element, newName, usages, fallbackHandler = { + kotlinUsages += it + }) + + super.renameElement(element, newName, kotlinUsages.toTypedArray(), listener) + } } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessorCompat.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessorCompat.kt index 45304175293..31c661b132c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessorCompat.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinFunctionProcessorCompat.kt @@ -217,10 +217,10 @@ abstract class RenameKotlinFunctionProcessorCompat : RenameKotlinPsiProcessor() override fun renameElement(element: PsiElement, newName: String, usages: Array, listener: RefactoringElementListener?) { val simpleUsages = ArrayList(usages.size) val ambiguousImportUsages = SmartList() - for (usage in usages) { + ForeignUsagesRenameProcessor.processAll(element, newName, usages, fallbackHandler = { usage -> if (usage is LostDefaultValuesInOverridingFunctionUsageInfo) { usage.apply() - continue + return@processAll } if (usage.isAmbiguousImportUsage()) { @@ -230,7 +230,7 @@ abstract class RenameKotlinFunctionProcessorCompat : RenameKotlinPsiProcessor() simpleUsages += usage } } - } + }) element.ambiguousImportUsages = ambiguousImportUsages RenameUtil.doRenameGenericNamedElement(element, newName, simpleUsages.toTypedArray(), listener) diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessorCompat.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessorCompat.kt index 49ab5dd8cdc..64591847e3b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessorCompat.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinPsiProcessorCompat.kt @@ -161,10 +161,10 @@ abstract class RenameKotlinPsiProcessorCompat : RenamePsiElementProcessor() { listener: RefactoringElementListener? ) { val simpleUsages = ArrayList(usages.size) - for (usage in usages) { - if (renameMangledUsageIfPossible(usage, element, newName)) continue + ForeignUsagesRenameProcessor.processAll(element, newName, usages, fallbackHandler = { usage -> + if (renameMangledUsageIfPossible(usage, element, newName)) return@processAll simpleUsages += usage - } + }) RenameUtil.doRenameGenericNamedElement(element, newName, simpleUsages.toTypedArray(), listener) }