From fe599463ac89089b473ba6d4d2f221bbccf1a232 Mon Sep 17 00:00:00 2001 From: Toshiaki Kameyama Date: Thu, 20 Jul 2017 07:29:56 +0900 Subject: [PATCH] KT-18978 Intention Move to class body generates incorrect code for vararg val/var (#1188) Intention Move to class body generates incorrect code for vararg val/var #KT-18978 Fixed --- .../intentions/MovePropertyToClassBodyIntention.kt | 4 ++++ .../intentions/movePropertyToClassBody/vararg.kt | 1 + .../movePropertyToClassBody/vararg.kt.after | 3 +++ .../movePropertyToClassBody/varargWithAnnotation.kt | 4 ++++ .../varargWithAnnotation.kt.after | 6 ++++++ .../idea/intentions/IntentionTestGenerated.java | 12 ++++++++++++ 6 files changed, 30 insertions(+) create mode 100644 idea/testData/intentions/movePropertyToClassBody/vararg.kt create mode 100644 idea/testData/intentions/movePropertyToClassBody/vararg.kt.after create mode 100644 idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt create mode 100644 idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt.after diff --git a/idea/src/org/jetbrains/kotlin/idea/intentions/MovePropertyToClassBodyIntention.kt b/idea/src/org/jetbrains/kotlin/idea/intentions/MovePropertyToClassBodyIntention.kt index cdfb7db4704..0b0d6b6a3d1 100644 --- a/idea/src/org/jetbrains/kotlin/idea/intentions/MovePropertyToClassBodyIntention.kt +++ b/idea/src/org/jetbrains/kotlin/idea/intentions/MovePropertyToClassBodyIntention.kt @@ -21,6 +21,7 @@ import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget import org.jetbrains.kotlin.descriptors.annotations.KotlinTarget import org.jetbrains.kotlin.idea.caches.resolve.analyze +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.isPropertyParameter import org.jetbrains.kotlin.resolve.AnnotationChecker @@ -42,6 +43,7 @@ class MovePropertyToClassBodyIntention : SelfTargetingIntention(KtP val firstProperty = parentClass.getProperties().firstOrNull() parentClass.addDeclarationBefore(propertyDeclaration, firstProperty).apply { val propertyModifierList = element.modifierList?.copy() as? KtModifierList + propertyModifierList?.getModifier(KtTokens.VARARG_KEYWORD)?.delete() propertyModifierList?.let { modifierList?.replace(it) ?: addBefore(it, firstChild) } modifierList?.annotationEntries?.forEach { if (!it.isAppliedToProperty()) { @@ -59,12 +61,14 @@ class MovePropertyToClassBodyIntention : SelfTargetingIntention(KtP ?.takeIf { it.isNotEmpty() } ?.joinToString(separator = " ") { it.textWithoutUseSite() } + val hasVararg = element.hasModifier(KtTokens.VARARG_KEYWORD) if (parameterAnnotationsText != null) { element.modifierList?.replace(KtPsiFactory(element).createModifierList(parameterAnnotationsText)) } else { element.modifierList?.delete() } + if (hasVararg) element.addModifier(KtTokens.VARARG_KEYWORD) } fun KtAnnotationEntry.isAppliedToProperty(): Boolean { diff --git a/idea/testData/intentions/movePropertyToClassBody/vararg.kt b/idea/testData/intentions/movePropertyToClassBody/vararg.kt new file mode 100644 index 00000000000..8bca044a7f6 --- /dev/null +++ b/idea/testData/intentions/movePropertyToClassBody/vararg.kt @@ -0,0 +1 @@ +class TestClass(vararg var words: String) \ No newline at end of file diff --git a/idea/testData/intentions/movePropertyToClassBody/vararg.kt.after b/idea/testData/intentions/movePropertyToClassBody/vararg.kt.after new file mode 100644 index 00000000000..cebc49ab94c --- /dev/null +++ b/idea/testData/intentions/movePropertyToClassBody/vararg.kt.after @@ -0,0 +1,3 @@ +class TestClass(vararg words: String) { + var words = words +} \ No newline at end of file diff --git a/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt b/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt new file mode 100644 index 00000000000..e69b4388730 --- /dev/null +++ b/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt @@ -0,0 +1,4 @@ +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class ParameterAnnotation(val a: Int = 0) + +class TestClass(private vararg @ParameterAnnotation(42) val words: String = arrayOf()) \ No newline at end of file diff --git a/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt.after b/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt.after new file mode 100644 index 00000000000..68639110910 --- /dev/null +++ b/idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt.after @@ -0,0 +1,6 @@ +@Target(AnnotationTarget.VALUE_PARAMETER) +annotation class ParameterAnnotation(val a: Int = 0) + +class TestClass(vararg @ParameterAnnotation(42) words: String = arrayOf()) { + private val words = words +} \ 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 713262a2170..aad5809fd2e 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/intentions/IntentionTestGenerated.java @@ -11362,6 +11362,18 @@ public class IntentionTestGenerated extends AbstractIntentionTest { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/movePropertyToClassBody/simple.kt"); doTest(fileName); } + + @TestMetadata("vararg.kt") + public void testVararg() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/movePropertyToClassBody/vararg.kt"); + doTest(fileName); + } + + @TestMetadata("varargWithAnnotation.kt") + public void testVarargWithAnnotation() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/intentions/movePropertyToClassBody/varargWithAnnotation.kt"); + doTest(fileName); + } } @TestMetadata("idea/testData/intentions/movePropertyToConstructor")