From ba993ba0fe4e8172464a02e824fb25404af08220 Mon Sep 17 00:00:00 2001 From: Vyacheslav Karpukhin Date: Wed, 29 Apr 2020 20:56:46 +0200 Subject: [PATCH] Provide an extension point that allows plugins to handle renaming of references in other languages --- idea/resources/META-INF/extensions/ide.xml | 4 +++ .../rename/ForeignUsagesRenameProcessor.kt | 30 +++++++++++++++++++ .../RenameKotlinFunctionProcessorCompat.kt | 6 ++-- .../rename/RenameKotlinPsiProcessorCompat.kt | 6 ++-- 4 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 idea/src/org/jetbrains/kotlin/idea/refactoring/rename/ForeignUsagesRenameProcessor.kt 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) }