From ad9bf1626ff75f9d03f2142f3c7e52b2330a614d Mon Sep 17 00:00:00 2001 From: shiraji Date: Fri, 13 Jan 2017 00:46:16 +0900 Subject: [PATCH] Fix the problem with ConvertPrimaryConstructorToSecondaryIntention for enum #KT-15406 Fixed --- ...tPrimaryConstructorToSecondaryIntention.kt | 38 ++++++++++++++++--- .../enum.kt | 3 ++ .../enum.kt.after | 5 +++ .../enumWIthFunction.kt | 7 ++++ .../enumWIthFunction.kt.after | 9 +++++ .../enumWithParams.kt | 3 ++ .../enumWithParams.kt.after | 11 ++++++ .../enumWithoutEntries.kt | 2 + .../enumWithoutEntries.kt.after | 4 ++ .../enumWithoutSemicolon.kt | 3 ++ .../enumWithoutSemicolon.kt.after | 5 +++ .../intentions/IntentionTestGenerated.java | 30 +++++++++++++++ 12 files changed, 114 insertions(+), 6 deletions(-) create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt.after create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt.after create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt.after create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt.after create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt create mode 100644 idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertPrimaryConstructorToSecondaryIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertPrimaryConstructorToSecondaryIntention.kt index 892a4a64932..0db57ed9e06 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertPrimaryConstructorToSecondaryIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/ConvertPrimaryConstructorToSecondaryIntention.kt @@ -17,11 +17,14 @@ package org.jetbrains.kotlin.idea.intentions import com.intellij.openapi.editor.Editor +import com.intellij.psi.PsiElement +import com.intellij.psi.impl.source.tree.LeafPsiElement import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ConstructorDescriptor import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.util.CommentSaver +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens.THIS_KEYWORD import org.jetbrains.kotlin.lexer.KtTokens.VARARG_KEYWORD import org.jetbrains.kotlin.psi.* @@ -29,6 +32,7 @@ import org.jetbrains.kotlin.psi.KtPsiFactory.CallableBuilder import org.jetbrains.kotlin.psi.KtPsiFactory.CallableBuilder.Target.CONSTRUCTOR import org.jetbrains.kotlin.psi.psiUtil.anyDescendantOfType import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.getChildrenOfType import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.descriptorUtil.parents @@ -118,9 +122,26 @@ class ConvertPrimaryConstructorToSecondaryIntention : SelfTargetingIntention" else typeText, valueParameter.isMutable, null) - klass.addDeclarationBefore(property, null) + if (anchorBefore == null) klass.addDeclarationBefore(property, null) else klass.addDeclarationAfter(property, anchorBefore) } - for (anonymousInitializer in klass.getAnonymousInitializers()) { - anonymousInitializer.delete() + } + + private fun addSemicolonIfNotExist(klass: KtClass, factory: KtPsiFactory, lastEnumEntry: KtEnumEntry?) { + if (lastEnumEntry == null) { + klass.getOrCreateBody().let { it.addAfter(factory.createSemicolon(), it.lBrace) } + } + else if (lastEnumEntry.getChildrenOfType().none { it.elementType == KtTokens.SEMICOLON }) { + lastEnumEntry.add(factory.createSemicolon()) } - element.delete() } } \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt new file mode 100644 index 00000000000..0522ab781e4 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt @@ -0,0 +1,3 @@ +enum class A(v: Int) { + E1(0), E2(1); +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt.after b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt.after new file mode 100644 index 00000000000..71ccafb4c15 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt.after @@ -0,0 +1,5 @@ +enum class A { + E1(0), E2(1); + + constructor(v: Int) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt new file mode 100644 index 00000000000..cf70f5a7df1 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt @@ -0,0 +1,7 @@ +enum class A(v: Int) { + E1(0), E2(1); + + fun foo() { + + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt.after b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt.after new file mode 100644 index 00000000000..2413a376050 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt.after @@ -0,0 +1,9 @@ +enum class A { + E1(0), E2(1); + + constructor(v: Int) + + fun foo() { + + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt new file mode 100644 index 00000000000..3b9b7bb7a66 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt @@ -0,0 +1,3 @@ +enum class A(val a: Int, val b: Int) { + E1(0, 0), E2(1, 1); +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt.after b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt.after new file mode 100644 index 00000000000..f386952414e --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt.after @@ -0,0 +1,11 @@ +enum class A { + E1(0, 0), E2(1, 1); + + val a: Int + val b: Int + + constructor(a: Int, b: Int) { + this.a = a + this.b = b + } +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt new file mode 100644 index 00000000000..d8f1a61acf6 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt @@ -0,0 +1,2 @@ +enum class A(v: Int) { +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt.after b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt.after new file mode 100644 index 00000000000..5a8af5d4bf8 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt.after @@ -0,0 +1,4 @@ +enum class A {; + + constructor(v: Int) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt new file mode 100644 index 00000000000..d0695a86c0b --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt @@ -0,0 +1,3 @@ +enum class A(v: Int) { + E1(0), E2(1) +} \ No newline at end of file diff --git a/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt.after b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt.after new file mode 100644 index 00000000000..71ccafb4c15 --- /dev/null +++ b/idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt.after @@ -0,0 +1,5 @@ +enum class A { + E1(0), E2(1); + + constructor(v: Int) +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java index e4b682bb3fc..13b881d0956 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -4826,6 +4826,36 @@ public class IntentionTestGenerated extends AbstractIntentionTest { doTest(fileName); } + @TestMetadata("enum.kt") + public void testEnum() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/enum.kt"); + doTest(fileName); + } + + @TestMetadata("enumWIthFunction.kt") + public void testEnumWIthFunction() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWIthFunction.kt"); + doTest(fileName); + } + + @TestMetadata("enumWithParams.kt") + public void testEnumWithParams() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithParams.kt"); + doTest(fileName); + } + + @TestMetadata("enumWithoutEntries.kt") + public void testEnumWithoutEntries() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutEntries.kt"); + doTest(fileName); + } + + @TestMetadata("enumWithoutSemicolon.kt") + public void testEnumWithoutSemicolon() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/enumWithoutSemicolon.kt"); + doTest(fileName); + } + @TestMetadata("independentProperty.kt") public void testIndependentProperty() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/convertPrimaryConstructorToSecondary/independentProperty.kt");