From 983ad5535702dbffb34ea2823d9145f69cb9f107 Mon Sep 17 00:00:00 2001 From: Alexey Sedunov Date: Mon, 23 Jan 2017 14:55:36 +0300 Subject: [PATCH] Code Insight: Preserve identifier quotes in "Generate equals()/hashCode()/toString()" actions #KT-15883 Fixed --- .../KotlinGenerateEqualsAndHashcodeAction.kt | 6 ++++-- .../generate/KotlinGenerateToStringAction.kt | 18 +++++++++------- .../kotlin/idea/actions/generate/utils.kt | 4 ++++ .../generate/equalsWithHashCode/keepQuotes.kt | 3 +++ .../equalsWithHashCode/keepQuotes.kt.after | 21 +++++++++++++++++++ .../toString/multipeTemplates/keepQuotes.kt | 4 ++++ .../multipeTemplates/keepQuotes.kt.after | 10 +++++++++ .../toString/singleTemplate/keepQuotes.kt | 3 +++ .../singleTemplate/keepQuotes.kt.after | 5 +++++ ...eHashCodeAndEqualsActionTestGenerated.java | 6 ++++++ .../GenerateToStringActionTestGenerated.java | 12 +++++++++++ 11 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt create mode 100644 idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt.after create mode 100644 idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt create mode 100644 idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt.after create mode 100644 idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt create mode 100644 idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt index dbf77e74fe8..14f44938b08 100644 --- a/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt +++ b/idea/src/org/jetbrains/kotlin/idea/actions/generate/KotlinGenerateEqualsAndHashcodeAction.kt @@ -21,12 +21,14 @@ import com.intellij.openapi.application.ApplicationManager import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.Project +import com.intellij.psi.PsiNameIdentifierOwner import com.intellij.util.IncorrectOperationException import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.FunctionDescriptor import org.jetbrains.kotlin.descriptors.VariableDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyzeFully +import org.jetbrains.kotlin.idea.codeInsight.DescriptorToSourceUtilsIde import org.jetbrains.kotlin.idea.core.CollectingNameValidator import org.jetbrains.kotlin.idea.core.KotlinNameSuggester import org.jetbrains.kotlin.idea.core.insertMembersAfter @@ -154,7 +156,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase "!java.util.Arrays.equals($propName, $paramName.$propName)" @@ -178,7 +180,7 @@ class KotlinGenerateEqualsAndHashcodeAction : KotlinGenerateMemberActionBase, val generateSuperCall: Boolean, - val generator: Generator) + val generator: Generator, + val project: Project) enum class Generator(val text: String) { SINGLE_TEMPLATE("Single template") { @@ -67,7 +69,7 @@ class KotlinGenerateToStringAction : KotlinGenerateMemberActionBase false } } + }.filter { + KotlinNameSuggester.isIdentifier(it.name?.quoteIfNeeded()) } } diff --git a/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt b/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt new file mode 100644 index 00000000000..e929b1bcff2 --- /dev/null +++ b/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt @@ -0,0 +1,3 @@ +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt.after b/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt.after new file mode 100644 index 00000000000..3140e91c3aa --- /dev/null +++ b/idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt.after @@ -0,0 +1,21 @@ +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other?.javaClass != javaClass) return false + + other as Example + + if (`in` != other.`in`) return false + if (`cl ass` != other.`cl ass`) return false + if (`valid` != other.`valid`) return false + + return true + } + + override fun hashCode(): Int { + var result = `in`.hashCode() + result = 31 * result + `cl ass`.hashCode() + result = 31 * result + `valid`.hashCode() + return result + } +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt b/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt new file mode 100644 index 00000000000..3a41ee369bd --- /dev/null +++ b/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt @@ -0,0 +1,4 @@ +// GENERATOR: MULTIPLE_TEMPLATES +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt.after b/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt.after new file mode 100644 index 00000000000..e0fabf9c7ba --- /dev/null +++ b/idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt.after @@ -0,0 +1,10 @@ +// GENERATOR: MULTIPLE_TEMPLATES +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + override fun toString(): String { + return "Example(" + + "`in`='$`in`'," + + "`cl ass`='$`cl ass`'," + + "`valid`=$`valid`" + + ")" + } +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt b/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt new file mode 100644 index 00000000000..e929b1bcff2 --- /dev/null +++ b/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt @@ -0,0 +1,3 @@ +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + +} \ No newline at end of file diff --git a/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt.after b/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt.after new file mode 100644 index 00000000000..6741c4616f8 --- /dev/null +++ b/idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt.after @@ -0,0 +1,5 @@ +class Example(val `in`: String, val `cl ass`: String, val `valid`: Boolean) { + override fun toString(): String { + return "Example(`in`='$`in`', `cl ass`='$`cl ass`', `valid`=$`valid`)" + } +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java index 9f877e1358f..f65f757387c 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateHashCodeAndEqualsActionTestGenerated.java @@ -90,6 +90,12 @@ public class GenerateHashCodeAndEqualsActionTestGenerated extends AbstractGenera doTest(fileName); } + @TestMetadata("keepQuotes.kt") + public void testKeepQuotes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/keepQuotes.kt"); + doTest(fileName); + } + @TestMetadata("multipleVars.kt") public void testMultipleVars() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/equalsWithHashCode/multipleVars.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateToStringActionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateToStringActionTestGenerated.java index 3eb122f24c7..fa74eec1a73 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateToStringActionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/codeInsight/generate/GenerateToStringActionTestGenerated.java @@ -89,6 +89,12 @@ public class GenerateToStringActionTestGenerated extends AbstractGenerateToStrin doTest(fileName); } + @TestMetadata("keepQuotes.kt") + public void testKeepQuotes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/toString/multipeTemplates/keepQuotes.kt"); + doTest(fileName); + } + @TestMetadata("multipleVars.kt") public void testMultipleVars() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/toString/multipeTemplates/multipleVars.kt"); @@ -152,6 +158,12 @@ public class GenerateToStringActionTestGenerated extends AbstractGenerateToStrin doTest(fileName); } + @TestMetadata("keepQuotes.kt") + public void testKeepQuotes() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/toString/singleTemplate/keepQuotes.kt"); + doTest(fileName); + } + @TestMetadata("multipleVars.kt") public void testMultipleVars() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/codeInsight/generate/toString/singleTemplate/multipleVars.kt");