From d456aa6ba8baeac75ac53ea606154fce1e8f1cc1 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 20 Apr 2016 17:25:42 +0300 Subject: [PATCH] Rename: Fix Find Usages/Rename for parameter references in XML files #KT-11967 Fixed --- ChangeLog.md | 1 + .../ideaExtensions/KotlinReferencesSearcher.kt | 8 ++++++-- .../org/jetbrains/kotlin/idea/search/searchUtil.kt | 11 +++++++++++ .../rename/RenameKotlinParameterProcessor.kt | 7 +++++++ .../kotlinPrivateMethodUsages.results.txt | 2 +- .../kotlinPrivatePropertyUsages.results.txt | 3 ++- .../kotlinPrivatePropertyUsages2.results.txt | 2 +- .../factoryMethodParam/after/spring-config.xml | 8 ++++++++ .../core/rename/factoryMethodParam/after/test.kt | 6 ++++++ .../factoryMethodParam/before/spring-config.xml | 8 ++++++++ .../core/rename/factoryMethodParam/before/test.kt | 6 ++++++ .../factoryMethodParam/factoryMethodParam.test | 8 ++++++++ .../after/spring-config.xml | 8 ++++++++ .../rename/factoryMethodParamByXmlRef/after/test.kt | 6 ++++++ .../before/spring-config.xml | 8 ++++++++ .../rename/factoryMethodParamByXmlRef/before/test.kt | 6 ++++++ .../factoryMethodParamByXmlRef.test | 9 +++++++++ .../tests/rename/SpringRenameTestGenerated.java | 12 ++++++++++++ 18 files changed, 114 insertions(+), 5 deletions(-) create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParam/after/spring-config.xml create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParam/after/test.kt create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParam/before/spring-config.xml create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParam/before/test.kt create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParam/factoryMethodParam.test create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/spring-config.xml create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/test.kt create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/spring-config.xml create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/test.kt create mode 100644 ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test diff --git a/ChangeLog.md b/ChangeLog.md index 8bf8d33f80f..dedc5d022a4 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -36,6 +36,7 @@ Issues fixed: - [KT-11817](https://youtrack.jetbrains.com/issue/KT-11817) Fixed rename of Kotlin enum constants through Java references - [KT-11816](https://youtrack.jetbrains.com/issue/KT-11816) Fixed usages search for Safe Delete on simple enum entries - [KT-11282](https://youtrack.jetbrains.com/issue/KT-11282) Delete interface reference from super-type list when applying Safe Delete to Java interface +- [KT-11967](https://youtrack.jetbrains.com/issue/KT-11967) Fix Find Usages/Rename for parameter references in XML files #### Debugger diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt index 229e8dc83dc..c1789057105 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/search/ideaExtensions/KotlinReferencesSearcher.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.references.KtSimpleNameReference import org.jetbrains.kotlin.idea.search.KOTLIN_NAMED_ARGUMENT_SEARCH_CONTEXT import org.jetbrains.kotlin.idea.search.allScope +import org.jetbrains.kotlin.idea.search.effectiveSearchScope import org.jetbrains.kotlin.idea.search.usagesSearch.* import org.jetbrains.kotlin.idea.stubindex.KotlinSourceFilterScope import org.jetbrains.kotlin.idea.util.application.runReadAction @@ -69,7 +70,10 @@ class KotlinReferencesSearcher : QueryExecutorBase scope.union(queryParameters.effectiveSearchScope(e)) } + } val refFilter: (PsiReference) -> Boolean = when { unwrappedElement is KtParameter -> ({ ref: PsiReference -> !ref.isNamedArgumentReference()/* they are processed later*/ }) @@ -314,7 +318,7 @@ class KotlinReferencesSearcher : QueryExecutorBase this } +} + +// Copied from SearchParameters.getEffectiveSearchScope() +fun ReferencesSearch.SearchParameters.effectiveSearchScope(element: PsiElement): SearchScope { + if (element == elementToSearch) return effectiveSearchScope + if (isIgnoreAccessScope) return scopeDeterminedByUser + val accessScope = PsiSearchHelper.SERVICE.getInstance(element.project).getUseScope(element) + return scopeDeterminedByUser.intersectWith(accessScope) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt index 556b803c5b8..7d0a7d466ca 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/RenameKotlinParameterProcessor.kt @@ -19,6 +19,7 @@ package org.jetbrains.kotlin.idea.refactoring.rename import com.intellij.psi.PsiElement import com.intellij.refactoring.listeners.RefactoringElementListener import com.intellij.usageView.UsageInfo +import com.intellij.util.xml.impl.GenericDomValueReference import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor import org.jetbrains.kotlin.idea.refactoring.changeSignature.KotlinChangeSignatureConfiguration @@ -36,6 +37,12 @@ class RenameKotlinParameterProcessor : RenameKotlinPsiProcessor() { } override fun renameElement(element: PsiElement, newName: String, usages: Array, listener: RefactoringElementListener?) { + // Workaround for usages in XML files + // TODO: Do not use Change Signature for parameter rename as it's less efficient and loses some usages + for (usage in usages) { + (usage.reference as? GenericDomValueReference<*>)?.handleElementRename(newName) + } + val function = (element as KtParameter).parent.parent as KtNamedFunction val paramIndex = function.valueParameters.indexOf(element) assert(paramIndex != -1, { "couldn't find parameter in parent ${element.getElementTextWithContext()}" }) diff --git a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt index e52980ff7e0..3de7eba2bf8 100644 --- a/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findFunctionUsages/kotlinPrivateMethodUsages.results.txt @@ -1 +1 @@ -Function call 8 open fun processRequest() = doProcessRequest() +Function call 8 open fun processRequest() = doProcessRequest() \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt index b0943c212ed..d2ad55d118a 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages.results.txt @@ -1 +1,2 @@ -Value read 8 open fun processRequest() = foo +Value read 12 override fun processRequest() = "foo" + foo +Value read 8 open fun processRequest() = foo \ No newline at end of file diff --git a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt index 6257575f49d..aa25fe08ec2 100644 --- a/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt +++ b/idea/testData/findUsages/kotlin/findPropertyUsages/kotlinPrivatePropertyUsages2.results.txt @@ -1,3 +1,3 @@ [kotlinPrivatePropertyUsages2.0.kt] Named argument 9 public class ServerEx(): Server(foo = "!") { [kotlinPrivatePropertyUsages2.0.kt] Value read 6 open fun processRequest() = foo -[kotlinPrivatePropertyUsages2.1.kt] Named argument 5 println(Server(foo = "!").foo) +[kotlinPrivatePropertyUsages2.1.kt] Named argument 5 println(Server(foo = "!").foo) \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParam/after/spring-config.xml b/ultimate/testData/spring/core/rename/factoryMethodParam/after/spring-config.xml new file mode 100644 index 00000000000..6887d61aef2 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParam/after/spring-config.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParam/after/test.kt b/ultimate/testData/spring/core/rename/factoryMethodParam/after/test.kt new file mode 100644 index 00000000000..309157c0c95 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParam/after/test.kt @@ -0,0 +1,6 @@ +package a + +class Construction(param: Int) +object FactoryObject { + @JvmStatic fun buildObject(param2: Int) = Construction(param2) +} \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParam/before/spring-config.xml b/ultimate/testData/spring/core/rename/factoryMethodParam/before/spring-config.xml new file mode 100644 index 00000000000..3e02bffeb50 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParam/before/spring-config.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParam/before/test.kt b/ultimate/testData/spring/core/rename/factoryMethodParam/before/test.kt new file mode 100644 index 00000000000..f6efaebb764 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParam/before/test.kt @@ -0,0 +1,6 @@ +package a + +class Construction(param: Int) +object FactoryObject { + @JvmStatic fun buildObject(/*rename*/param: Int) = Construction(param) +} \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParam/factoryMethodParam.test b/ultimate/testData/spring/core/rename/factoryMethodParam/factoryMethodParam.test new file mode 100644 index 00000000000..b6f5eeba880 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParam/factoryMethodParam.test @@ -0,0 +1,8 @@ +{ + "fixtureClasses": ["org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension"], + "type": "MARKED_ELEMENT", + "mainFile": "test.kt", + "springFileSet": ["spring-config.xml"], + "newName": "param2", + "withRuntime": "true" +} \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/spring-config.xml b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/spring-config.xml new file mode 100644 index 00000000000..6887d61aef2 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/spring-config.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/test.kt b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/test.kt new file mode 100644 index 00000000000..309157c0c95 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/after/test.kt @@ -0,0 +1,6 @@ +package a + +class Construction(param: Int) +object FactoryObject { + @JvmStatic fun buildObject(param2: Int) = Construction(param2) +} \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/spring-config.xml b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/spring-config.xml new file mode 100644 index 00000000000..2f76fa257ff --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/spring-config.xml @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/test.kt b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/test.kt new file mode 100644 index 00000000000..6cf3cf26394 --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/before/test.kt @@ -0,0 +1,6 @@ +package a + +class Construction(param: Int) +object FactoryObject { + @JvmStatic fun buildObject(param: Int) = Construction(param) +} \ No newline at end of file diff --git a/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test new file mode 100644 index 00000000000..447065ea15e --- /dev/null +++ b/ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test @@ -0,0 +1,9 @@ +{ + "fixtureClasses": ["org.jetbrains.kotlin.idea.spring.tests.SpringTestFixtureExtension"], + "type": "MARKED_ELEMENT", + "mainFile": "spring-config.xml", + "springFileSet": ["spring-config.xml"], + "newName": "param2", + "byRef": "true", + "withRuntime": "true" +} \ No newline at end of file diff --git a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/rename/SpringRenameTestGenerated.java b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/rename/SpringRenameTestGenerated.java index 7275dde4a3d..8f1e767e2da 100644 --- a/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/rename/SpringRenameTestGenerated.java +++ b/ultimate/tests/org/jetbrains/kotlin/idea/spring/tests/rename/SpringRenameTestGenerated.java @@ -47,6 +47,18 @@ public class SpringRenameTestGenerated extends AbstractSpringRenameTest { doTest(fileName); } + @TestMetadata("factoryMethodParam/factoryMethodParam.test") + public void testFactoryMethodParam_FactoryMethodParam() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("ultimate/testData/spring/core/rename/factoryMethodParam/factoryMethodParam.test"); + doTest(fileName); + } + + @TestMetadata("factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test") + public void testFactoryMethodParamByXmlRef_FactoryMethodParamByXmlRef() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("ultimate/testData/spring/core/rename/factoryMethodParamByXmlRef/factoryMethodParamByXmlRef.test"); + doTest(fileName); + } + @TestMetadata("isPropertyWithXmlRefsBySpelRef/isPropertyWithXmlRefBySpelRef.test") public void testIsPropertyWithXmlRefsBySpelRef_IsPropertyWithXmlRefBySpelRef() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("ultimate/testData/spring/core/rename/isPropertyWithXmlRefsBySpelRef/isPropertyWithXmlRefBySpelRef.test");