diff --git a/idea/resources/META-INF/extensions/ide.xml b/idea/resources/META-INF/extensions/ide.xml
index 0a023d83e2e..d1689dd661a 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/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)
}