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)
}