From 782aa9451380324fde7e2ddce33008c487a8ecf1 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Fri, 14 Sep 2018 14:52:46 +0300 Subject: [PATCH] Bad indentation after annotation in incomplete declaration (KT-22322) Same behavior is for any modifier in incomplete declaration. #KT-22322 Fixed --- .../kotlin/idea/formatter/KotlinCommonBlock.kt | 15 +++++++++++++++ .../kotlin/idea/formatter/KotlinBlock.kt | 4 +++- .../AnnotationInDeclaration.after.kt | 6 ++++++ .../AnnotationInDeclaration.kt | 5 +++++ ...ModifierListInUnfinishedDeclaration.after.kt | 4 ++++ .../ModifierListInUnfinishedDeclaration.kt | 3 +++ .../TypingIndentationTestBaseGenerated.java | 17 +++++++++++++++++ 7 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 idea/testData/indentationOnNewline/AnnotationInDeclaration.after.kt create mode 100644 idea/testData/indentationOnNewline/AnnotationInDeclaration.kt create mode 100644 idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt create mode 100644 idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt index b33c7044a48..534542687a5 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinCommonBlock.kt @@ -94,6 +94,16 @@ abstract class KotlinCommonBlock( fun isLeaf(): Boolean = node.firstChildNode == null + fun isIncomplete(): Boolean { + if (isIncompleteInSuper()) { + return true + } + + // An incomplete declaration is the reason when modifier list can become a class body child, otherwise + // it's going to be a declaration child. + return node.elementType == MODIFIER_LIST && node.treeParent?.elementType == CLASS_BODY + } + fun buildChildren(): List { if (mySubBlocks != null) { return mySubBlocks!! @@ -451,6 +461,11 @@ abstract class KotlinCommonBlock( return blockList.asSequence() } + if (this.node.elementType == CLASS_BODY && node.elementType == MODIFIER_LIST) { + // Some unfinished declaration + println() + } + return sequenceOf(buildSubBlock(node, childrenAlignmentStrategy, wrappingStrategy)) } diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinBlock.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinBlock.kt index b3e41b5951e..9a1aaae2fc9 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinBlock.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinBlock.kt @@ -50,7 +50,7 @@ class KotlinBlock( override fun getAlignment(): Alignment? = alignment - override fun isIncompleteInSuper(): Boolean = this@KotlinBlock.isIncomplete + override fun isIncompleteInSuper(): Boolean = super@KotlinBlock.isIncomplete() override fun getSuperChildAttributes(newChildIndex: Int): ChildAttributes = super@KotlinBlock.getChildAttributes(newChildIndex) @@ -96,6 +96,8 @@ class KotlinBlock( override fun isLeaf(): Boolean = kotlinDelegationBlock.isLeaf() override fun getTextRange() = kotlinDelegationBlock.getTextRange() + + override fun isIncomplete(): Boolean = kotlinDelegationBlock.isIncomplete() } object KotlinSpacingBuilderUtilImpl : KotlinSpacingBuilderUtil { diff --git a/idea/testData/indentationOnNewline/AnnotationInDeclaration.after.kt b/idea/testData/indentationOnNewline/AnnotationInDeclaration.after.kt new file mode 100644 index 00000000000..aa92c80a58e --- /dev/null +++ b/idea/testData/indentationOnNewline/AnnotationInDeclaration.after.kt @@ -0,0 +1,6 @@ +class Foo { + companion object { + @JvmStatic + + } +} \ No newline at end of file diff --git a/idea/testData/indentationOnNewline/AnnotationInDeclaration.kt b/idea/testData/indentationOnNewline/AnnotationInDeclaration.kt new file mode 100644 index 00000000000..5e9b1ae481f --- /dev/null +++ b/idea/testData/indentationOnNewline/AnnotationInDeclaration.kt @@ -0,0 +1,5 @@ +class Foo { + companion object { + @JvmStatic + } +} \ No newline at end of file diff --git a/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt b/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt new file mode 100644 index 00000000000..9489bb04e5d --- /dev/null +++ b/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt @@ -0,0 +1,4 @@ +object A { + private + +} \ No newline at end of file diff --git a/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt b/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt new file mode 100644 index 00000000000..31800deccf1 --- /dev/null +++ b/idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.kt @@ -0,0 +1,3 @@ +object A { + private +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/formatter/TypingIndentationTestBaseGenerated.java b/idea/tests/org/jetbrains/kotlin/formatter/TypingIndentationTestBaseGenerated.java index 51ea9f46e58..fdac1eac895 100644 --- a/idea/tests/org/jetbrains/kotlin/formatter/TypingIndentationTestBaseGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/formatter/TypingIndentationTestBaseGenerated.java @@ -61,6 +61,11 @@ public class TypingIndentationTestBaseGenerated extends AbstractTypingIndentatio runTest("idea/testData/indentationOnNewline/Annotation.after.kt"); } + @TestMetadata("AnnotationInDeclaration.after.kt") + public void testAnnotationInDeclaration() throws Exception { + runTest("idea/testData/indentationOnNewline/AnnotationInDeclaration.after.kt"); + } + @TestMetadata("ArgumentListNormalIndent.after.kt") public void testArgumentListNormalIndent() throws Exception { runTest("idea/testData/indentationOnNewline/ArgumentListNormalIndent.after.kt"); @@ -231,6 +236,18 @@ public class TypingIndentationTestBaseGenerated extends AbstractTypingIndentatio runTest("idea/testData/indentationOnNewline/KT20783.after.kt"); } + @TestMetadata("LambdaInCallWithAllightMultilineParameters.after.kt") + public void testLambdaInCallWithAllightMultilineParameters() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/indentationOnNewline/LambdaInCallWithAllightMultilineParameters.after.kt"); + doNewlineTest(fileName); + } + + @TestMetadata("ModifierListInUnfinishedDeclaration.after.kt") + public void testModifierListInUnfinishedDeclaration() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/indentationOnNewline/ModifierListInUnfinishedDeclaration.after.kt"); + doNewlineTest(fileName); + } + @TestMetadata("MultideclarationAfterEq.after.kt") public void testMultideclarationAfterEq() throws Exception { runTest("idea/testData/indentationOnNewline/MultideclarationAfterEq.after.kt");