From 385640c86f2b6fac5c108cfe86247dccdee19213 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Wed, 10 Aug 2016 17:10:56 +0300 Subject: [PATCH] Rename: Fix name quoting for automatic renamers #KT-13282 Fixed #KT-13283 Fixed --- ChangeLog.md | 1 + .../src/org/jetbrains/kotlin/idea/core/Utils.kt | 2 ++ .../idea/refactoring/rename/AutomaticVariableRenamer.kt | 3 ++- .../after/test/test.kt | 9 +++++++++ .../automaticVariableRenamerWithQuotation.test | 6 ++++++ .../before/test/test.kt | 9 +++++++++ .../idea/refactoring/rename/RenameTestGenerated.java | 6 ++++++ 7 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/after/test/test.kt create mode 100644 idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test create mode 100644 idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/before/test/test.kt diff --git a/ChangeLog.md b/ChangeLog.md index fe49fd98202..a40e848be02 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -262,6 +262,7 @@ Using 'this' as function argument in constructor of non-final class - [`KT-13054`](https://youtrack.jetbrains.com/issue/KT-13054) Introduce Variable: Skip leading/trailing comments inside selection - [`KT-13277`](https://youtrack.jetbrains.com/issue/KT-13277) Change Signature: Fix usage processing to prevent interfering with Python support plugin - [`KT-13254`](https://youtrack.jetbrains.com/issue/KT-13254) Rename: Conflict detection for type parameters +- [`KT-13282`](https://youtrack.jetbrains.com/issue/KT-13282), [`KT-13283`](https://youtrack.jetbrains.com/issue/KT-13283) Rename: Fix name quoting for automatic renamers ##### New features diff --git a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt index 3b0c23714fb..896fe7e4746 100644 --- a/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt +++ b/idea/idea-core/src/org/jetbrains/kotlin/idea/core/Utils.kt @@ -164,6 +164,8 @@ fun KtCallableDeclaration.canOmitDeclaredType(initializerOrBodyExpression: KtExp fun String.quoteIfNeeded(): String = if (KotlinNameSuggester.isIdentifier(this)) this else "`$this`" +fun String.unquote(): String = KtPsiUtil.unquoteIdentifier(this) + fun FqName.quoteSegmentsIfNeeded(): String { return pathSegments().map { it.asString().quoteIfNeeded() }.joinToString(".") } diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt index c4f30174a79..3092b0a2429 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/rename/AutomaticVariableRenamer.kt @@ -35,6 +35,7 @@ import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptor +import org.jetbrains.kotlin.idea.core.unquote import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isAncestor import org.jetbrains.kotlin.resolve.DescriptorUtils @@ -79,7 +80,7 @@ class AutomaticVariableRenamer( myElements.add(parameterOrVariable) } - suggestAllNames(klass.name, newClassName) + suggestAllNames(klass.name?.unquote(), newClassName.unquote()) } override fun getDialogTitle() = RefactoringBundle.message("rename.variables.title") diff --git a/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/after/test/test.kt b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/after/test/test.kt new file mode 100644 index 00000000000..4132eb16ac1 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/after/test/test.kt @@ -0,0 +1,9 @@ +class `A B` {} + +val THAT_A_B: `A B` = `A B`() +val A_B: `A B` = `A B`() + +fun localize(anA: `A B`, aPrefixedA: `A B`) { + val `a BVal`: `A B` = `A B`() + val `prefixedA BVal`: `A B` = `A B`() +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test new file mode 100644 index 00000000000..829da4acbc9 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test @@ -0,0 +1,6 @@ +{ + "type": "MARKED_ELEMENT", + "mainFile": "test/test.kt", + "newName": "A B", + "withRuntime": "true" +} \ No newline at end of file diff --git a/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/before/test/test.kt b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/before/test/test.kt new file mode 100644 index 00000000000..9305f876db1 --- /dev/null +++ b/idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/before/test/test.kt @@ -0,0 +1,9 @@ +class /*rename*/SomeName {} + +val THAT_SOME_NAME: SomeName = SomeName() +val SOME_NAME: SomeName = SomeName() + +fun localize(someNamePar: SomeName, prefixedSomeNamePar: SomeName) { + val someNameVal: SomeName = SomeName() + val prefixedSomeNameVal: SomeName = SomeName() +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java index a201de344ac..fe328c8a4af 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/refactoring/rename/RenameTestGenerated.java @@ -131,6 +131,12 @@ public class RenameTestGenerated extends AbstractRenameTest { doTest(fileName); } + @TestMetadata("automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test") + public void testAutomaticVariableRenamerWithQuotation_AutomaticVariableRenamerWithQuotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/automaticVariableRenamerWithQuotation/automaticVariableRenamerWithQuotation.test"); + doTest(fileName); + } + @TestMetadata("clashOfNestedWithOuterClass/clashOfNestedWithOuterClass.test") public void testClashOfNestedWithOuterClass_ClashOfNestedWithOuterClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/refactoring/rename/clashOfNestedWithOuterClass/clashOfNestedWithOuterClass.test");