diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/AddNewLineAfterAnnotationsFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddNewLineAfterAnnotationsFix.kt new file mode 100644 index 00000000000..5da8ae93e1a --- /dev/null +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/AddNewLineAfterAnnotationsFix.kt @@ -0,0 +1,42 @@ +/* + * Copyright 2010-2016 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea.quickfix + +import com.intellij.openapi.editor.Editor +import com.intellij.openapi.project.Project +import org.jetbrains.kotlin.diagnostics.Diagnostic +import org.jetbrains.kotlin.idea.quickfix.quickfixUtil.createIntentionForFirstParentOfType +import org.jetbrains.kotlin.psi.KtAnnotatedExpression +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtPsiFactory + +class AddNewLineAfterAnnotationsFix(element: KtAnnotatedExpression) : KotlinQuickFixAction(element) { + override fun getText() = "Add new line after annotations" + override fun getFamilyName() = text + + override fun invoke(project: Project, editor: Editor?, file: KtFile) { + val baseExpression = element.baseExpression ?: return + val annotationsText = element.text.substring(0, baseExpression.startOffsetInParent) + val newExpression = KtPsiFactory(project).createBlock(annotationsText + "\n" + baseExpression.text).statements[0] + element.replace(newExpression) + } + + companion object Factory : KotlinSingleIntentionActionFactory() { + override fun createAction(diagnostic: Diagnostic) = + diagnostic.createIntentionForFirstParentOfType(::AddNewLineAfterAnnotationsFix) + } +} diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt index 749799a3ecc..2b783019807 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/QuickFixRegistrar.kt @@ -432,5 +432,7 @@ class QuickFixRegistrar : QuickFixContributor { TOO_MANY_CHARACTERS_IN_CHARACTER_LITERAL.registerFactory(TooLongCharLiteralToStringFix) UNUSED_VALUE.registerFactory(RemoveUnusedValueFix) + + ANNOTATIONS_ON_BLOCK_LEVEL_EXPRESSION_ON_THE_SAME_LINE.registerFactory(AddNewLineAfterAnnotationsFix) } } diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt b/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt new file mode 100644 index 00000000000..2a5ba49d39e --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt @@ -0,0 +1,9 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +fun foo(y: Int) { + var x = 1 + @Ann x += 2 +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt.after b/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt.after new file mode 100644 index 00000000000..506b6db3096 --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt.after @@ -0,0 +1,10 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +fun foo(y: Int) { + var x = 1 + @Ann + x += 2 +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt b/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt new file mode 100644 index 00000000000..61dcb71f757 --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt @@ -0,0 +1,12 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann2(val x: String) + +fun foo(y: Int) { + var x = 1 + @Ann @Ann2("") x += 2 +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt.after b/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt.after new file mode 100644 index 00000000000..cf794d7876a --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt.after @@ -0,0 +1,13 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann2(val x: String) + +fun foo(y: Int) { + var x = 1 + @Ann @Ann2("") + x += 2 +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt b/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt new file mode 100644 index 00000000000..ecba19ebdb9 --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt @@ -0,0 +1,9 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +fun foo(y: IntArray) { + // Currently it calls reformatting of base expression, but it seems to be a minor issue + @Ann y [ 0 + 9 * 4] = y[y [1]] +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt.after b/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt.after new file mode 100644 index 00000000000..2b0cd2e5e6a --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt.after @@ -0,0 +1,10 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +fun foo(y: IntArray) { + // Currently it calls reformatting of base expression, but it seems to be a minor issue + @Ann + y [0 + 9 * 4] = y[y [1]] +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt b/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt new file mode 100644 index 00000000000..1a4aaaa55f3 --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt @@ -0,0 +1,13 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann2(val x: String) + +fun foo(y: Int) { + var x = 1 + @Ann // abc + @Ann2("") /* abc2*/ x += 2 +} diff --git a/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt.after b/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt.after new file mode 100644 index 00000000000..b2e4e5dc814 --- /dev/null +++ b/idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt.after @@ -0,0 +1,14 @@ +// "Add new line after annotations" "true" + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann + +@Target(AnnotationTarget.EXPRESSION) +annotation class Ann2(val x: String) + +fun foo(y: Int) { + var x = 1 + @Ann // abc + @Ann2("") /* abc2*/ + x += 2 +} diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java index 2240a0b2231..3a8134d4019 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/QuickFixTestGenerated.java @@ -398,6 +398,39 @@ public class QuickFixTestGenerated extends AbstractQuickFixTest { } } + @TestMetadata("idea/testData/quickfix/addNewLineAfterAnnotations") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class AddNewLineAfterAnnotations extends AbstractQuickFixTest { + public void testAllFilesPresentInAddNewLineAfterAnnotations() throws Exception { + KotlinTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("idea/testData/quickfix/addNewLineAfterAnnotations"), Pattern.compile("^([\\w\\-_]+)\\.kt$"), true); + } + + @TestMetadata("basic.kt") + public void testBasic() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addNewLineAfterAnnotations/basic.kt"); + doTest(fileName); + } + + @TestMetadata("manyAnnotations.kt") + public void testManyAnnotations() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addNewLineAfterAnnotations/manyAnnotations.kt"); + doTest(fileName); + } + + @TestMetadata("poorlyFormattedExpression.kt") + public void testPoorlyFormattedExpression() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addNewLineAfterAnnotations/poorlyFormattedExpression.kt"); + doTest(fileName); + } + + @TestMetadata("preserveComments.kt") + public void testPreserveComments() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/quickfix/addNewLineAfterAnnotations/preserveComments.kt"); + doTest(fileName); + } + } + @TestMetadata("idea/testData/quickfix/addNoinline") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class)