From b40a888f1d9088d9cb75e471783258f127f979ac Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Tue, 26 Nov 2019 12:33:13 +0700 Subject: [PATCH] Formatter: fix line break between declarations with annotations #KT-35093 Fixed #KT-35106 Fixed --- .../jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt | 3 +-- .../jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt | 6 +++--- .../formatter/EmptyLineBetweeAbstractFunctions.after.kt | 4 ++++ idea/testData/formatter/EmptyLineBetweeAbstractFunctions.kt | 3 +++ .../createExpect/withAnnotations/header/My.kt.after | 1 + nj2k/testData/newJ2k/annotations/annotationArrayArgument.kt | 1 + nj2k/testData/newJ2k/annotations/annotationInterface2.kt | 1 + nj2k/testData/newJ2k/annotations/annotationInterface4.kt | 1 + nj2k/testData/newJ2k/annotations/annotationUsages.kt | 3 +++ nj2k/testData/newJ2k/annotations/javaClassArgument.kt | 1 + nj2k/testData/newJ2k/annotations/javaClassArrayArgument.kt | 1 + .../constructors/secondaryConstructorWithDefaultValues.kt | 1 + nj2k/testData/newJ2k/field/volatileTransientAndStrictFp.kt | 1 + nj2k/testData/newJ2k/issues/kt-21189.kt | 1 + 14 files changed, 23 insertions(+), 5 deletions(-) diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt index 909a1b31874..b5b8ff2d544 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt @@ -105,8 +105,7 @@ class KotlinSpacingBuilder(val commonCodeStyleSettings: CommonCodeStyleSettings, val leftEndsWithComment = lastChild is PsiComment && lastChild.tokenType == KtTokens.EOL_COMMENT val dependentSpacingRule = DependentSpacingRule(Trigger.HAS_LINE_FEEDS).registerData(Anchor.MIN_LINE_FEEDS, emptyLines + 1) val textRange = left.node - ?.children() - ?.firstOrNull { it.elementType !in KtTokens.WHITE_SPACE_OR_COMMENT_BIT_SET } + ?.startOfDeclaration() ?.startOffset ?.let { TextRange.create(it, left.textRange.endOffset) } ?: left.textRange diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt index 88e0f1ebf5e..076e5fac084 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt @@ -95,9 +95,9 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing _: ASTBlock, right: ASTBlock ): Spacing? { - val firstChild = right.node?.firstChildNode as? PsiComment ?: return null - val whiteSpace = firstChild.nextSibling as? PsiWhiteSpace ?: return null - return if (StringUtil.containsLineBreak(firstChild.text) || StringUtil.containsLineBreak(whiteSpace.text)) { + val node = right.node ?: return null + val elementStart = node.startOfDeclaration() ?: return null + return if (StringUtil.containsLineBreak(node.text.subSequence(0, elementStart.startOffset - node.startOffset).trimStart())) { createSpacing(0, minLineFeeds = 2) } else null diff --git a/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.after.kt b/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.after.kt index f7910d02873..583a1c039a2 100644 --- a/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.after.kt +++ b/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.after.kt @@ -13,6 +13,10 @@ interface Some { */ fun f6() fun f7() + + @NotNull + fun f8() + fun f9() } abstract class Abstract() { diff --git a/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.kt b/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.kt index 6a8de4790b4..61c5e3088b7 100644 --- a/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.kt +++ b/idea/testData/formatter/EmptyLineBetweeAbstractFunctions.kt @@ -11,6 +11,9 @@ interface Some { */ fun f6() fun f7() + @NotNull + fun f8() + fun f9() } abstract class Abstract() { diff --git a/idea/testData/multiModuleQuickFix/createExpect/withAnnotations/header/My.kt.after b/idea/testData/multiModuleQuickFix/createExpect/withAnnotations/header/My.kt.after index 4e8afc53ff5..f759a2c760a 100644 --- a/idea/testData/multiModuleQuickFix/createExpect/withAnnotations/header/My.kt.after +++ b/idea/testData/multiModuleQuickFix/createExpect/withAnnotations/header/My.kt.after @@ -4,6 +4,7 @@ annotation class CommonAnnotation expect class My { tailrec fun foo(arg: Int): Int + @CommonAnnotation fun initialize() diff --git a/nj2k/testData/newJ2k/annotations/annotationArrayArgument.kt b/nj2k/testData/newJ2k/annotations/annotationArrayArgument.kt index fa1f7c61151..965209b2b9d 100644 --- a/nj2k/testData/newJ2k/annotations/annotationArrayArgument.kt +++ b/nj2k/testData/newJ2k/annotations/annotationArrayArgument.kt @@ -3,6 +3,7 @@ import kotlin.reflect.KClass annotation class Ann(vararg val value: Inner, val test1: Array = [InnerParam(C::class)]) annotation class Inner annotation class InnerParam(val value: KClass<*>) + @Ann(value = [Inner(), Inner()], test1 = [InnerParam(C::class)]) class C diff --git a/nj2k/testData/newJ2k/annotations/annotationInterface2.kt b/nj2k/testData/newJ2k/annotations/annotationInterface2.kt index 67e78c2d409..ac868380a14 100644 --- a/nj2k/testData/newJ2k/annotations/annotationInterface2.kt +++ b/nj2k/testData/newJ2k/annotations/annotationInterface2.kt @@ -1,3 +1,4 @@ internal annotation class Anon(val s: String = "a", val stringArray: Array = ["a", "b"], val intArray: IntArray) + @Anon(intArray = [1, 2]) internal class A \ No newline at end of file diff --git a/nj2k/testData/newJ2k/annotations/annotationInterface4.kt b/nj2k/testData/newJ2k/annotations/annotationInterface4.kt index 13157a8496b..205546bda33 100644 --- a/nj2k/testData/newJ2k/annotations/annotationInterface4.kt +++ b/nj2k/testData/newJ2k/annotations/annotationInterface4.kt @@ -1,4 +1,5 @@ internal annotation class Anon(vararg val value: String, val x: Int = 1) + @Anon("a", "b") internal interface I1 diff --git a/nj2k/testData/newJ2k/annotations/annotationUsages.kt b/nj2k/testData/newJ2k/annotations/annotationUsages.kt index ddd43f8b561..b25865f442f 100644 --- a/nj2k/testData/newJ2k/annotations/annotationUsages.kt +++ b/nj2k/testData/newJ2k/annotations/annotationUsages.kt @@ -23,10 +23,13 @@ internal class C { @Anon5(1) @Deprecated("") private val field1 = 0 + @Anon5(1) private val field2 = 0 + @Anon5(1) var field3 = 0 + @Anon5(1) var field4 = 0 diff --git a/nj2k/testData/newJ2k/annotations/javaClassArgument.kt b/nj2k/testData/newJ2k/annotations/javaClassArgument.kt index 6aef972f666..4a73d0ea5dc 100644 --- a/nj2k/testData/newJ2k/annotations/javaClassArgument.kt +++ b/nj2k/testData/newJ2k/annotations/javaClassArgument.kt @@ -1,5 +1,6 @@ import kotlin.reflect.KClass internal annotation class Ann(val value: KClass<*>, val other: KClass<*>) + @Ann(other = String::class, value = Any::class) internal class C \ No newline at end of file diff --git a/nj2k/testData/newJ2k/annotations/javaClassArrayArgument.kt b/nj2k/testData/newJ2k/annotations/javaClassArrayArgument.kt index 15f3fbba4e0..4c1feb3cef4 100644 --- a/nj2k/testData/newJ2k/annotations/javaClassArrayArgument.kt +++ b/nj2k/testData/newJ2k/annotations/javaClassArrayArgument.kt @@ -1,6 +1,7 @@ import kotlin.reflect.KClass internal annotation class Ann(vararg val value: KClass<*>) + @Ann(String::class, Any::class) internal class C diff --git a/nj2k/testData/newJ2k/constructors/secondaryConstructorWithDefaultValues.kt b/nj2k/testData/newJ2k/constructors/secondaryConstructorWithDefaultValues.kt index 9a8a7c730ce..51a8e60348a 100644 --- a/nj2k/testData/newJ2k/constructors/secondaryConstructorWithDefaultValues.kt +++ b/nj2k/testData/newJ2k/constructors/secondaryConstructorWithDefaultValues.kt @@ -3,6 +3,7 @@ internal class A { private var x = 0 constructor() {} + @JvmOverloads constructor(p: Int, s: String, x: Int = 1) { this.s = s diff --git a/nj2k/testData/newJ2k/field/volatileTransientAndStrictFp.kt b/nj2k/testData/newJ2k/field/volatileTransientAndStrictFp.kt index 13d33ac05bb..447477f100c 100644 --- a/nj2k/testData/newJ2k/field/volatileTransientAndStrictFp.kt +++ b/nj2k/testData/newJ2k/field/volatileTransientAndStrictFp.kt @@ -3,6 +3,7 @@ internal class A { @Deprecated("") @Volatile var field1 = 0 + @Transient var field2 = 1 diff --git a/nj2k/testData/newJ2k/issues/kt-21189.kt b/nj2k/testData/newJ2k/issues/kt-21189.kt index ed823fa054f..b25b10738b3 100644 --- a/nj2k/testData/newJ2k/issues/kt-21189.kt +++ b/nj2k/testData/newJ2k/issues/kt-21189.kt @@ -1,5 +1,6 @@ object ArrayInitializerBugKt { private val GREETING = byteArrayOf('H'.toByte(), 'e'.toByte(), 'l'.toByte(), 'l'.toByte(), 'o'.toByte(), ','.toByte(), ' '.toByte(), 'b'.toByte(), 'u'.toByte(), 'g'.toByte(), '!'.toByte()) + @JvmStatic fun main(args: Array) { val greeting = String(GREETING)