diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/KotlinSpacingBuilder.kt b/idea/src/org/jetbrains/jet/plugin/formatter/KotlinSpacingBuilder.kt index 26238306b75..298da4d0d53 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/KotlinSpacingBuilder.kt +++ b/idea/src/org/jetbrains/jet/plugin/formatter/KotlinSpacingBuilder.kt @@ -80,12 +80,12 @@ class KotlinSpacingBuilder(val codeStyleSettings: CodeStyleSettings) { } } - fun emptyLinesIfLineBreakInLeft(emptyLines: Int) { + fun emptyLinesIfLineBreakInLeft(emptyLines: Int, numberOfLineFeedsOtherwise: Int = 1, numSpacesOtherwise: Int = 0) { newRule {(parent: ASTBlock, left: ASTBlock, right: ASTBlock) -> val dependentSpacingRule = DependentSpacingRule(Trigger.HAS_LINE_FEEDS).registerData(Anchor.MIN_LINE_FEEDS, emptyLines + 1) LineFeedDependantSpacing( - 0, 0, - minimumLineFeeds = 1, + numSpacesOtherwise, numSpacesOtherwise, + minimumLineFeeds = numberOfLineFeedsOtherwise, keepLineBreaks = codeStyleSettings.KEEP_LINE_BREAKS, keepBlankLines = codeStyleSettings.KEEP_BLANK_LINES_IN_DECLARATIONS, dependency = left.getTextRange(), rule = dependentSpacingRule) diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt index 502b2ad8667..09b73724791 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt @@ -50,6 +50,8 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { val jetCommonSettings = settings.getCommonSettings(JetLanguage.INSTANCE)!! return rules(settings) { + val DECLARATIONS = TokenSet.create(PROPERTY, FUN, CLASS, OBJECT_DECLARATION, ENUM_ENTRY) + custom { inPosition(left = CLASS, right = CLASS).emptyLinesIfLineBreakInLeft(1) inPosition(left = FUN, right = FUN).emptyLinesIfLineBreakInLeft(1) @@ -58,6 +60,9 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { // Case left for alternative constructors inPosition(left = FUN, right = CLASS).emptyLinesIfLineBreakInLeft(1) + + inPosition(left = ENUM_ENTRY, right = ENUM_ENTRY).emptyLinesIfLineBreakInLeft( + emptyLines = 0, numSpacesOtherwise = 1, numberOfLineFeedsOtherwise = 0) } simple { @@ -69,9 +74,19 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { before(DOC_COMMENT).lineBreakInCode() between(PROPERTY, PROPERTY).lineBreakInCode() - between(CLASS, FUN).blankLines(1) - between(CLASS, PROPERTY).blankLines(1) - between(PROPERTY, CLASS).blankLines(1) + // CLASS - CLASS is exception + between(CLASS, DECLARATIONS).blankLines(1) + + // FUN - FUN, FUN - PROPERTY, FUN - CLASS are exceptions + between(FUN, DECLARATIONS).blankLines(1) + + // PROPERTY - PROPERTY, PROPERTY - FUN are exceptions + between(PROPERTY, DECLARATIONS).blankLines(1) + + between(OBJECT_DECLARATION, DECLARATIONS).blankLines(1) + + // ENUM_ENTRY - ENUM_ENTRY is exception + between(ENUM_ENTRY, DECLARATIONS).blankLines(1) before(FUN).lineBreakInCode() before(PROPERTY).lineBreakInCode() diff --git a/idea/testData/formatter/DelegationList.after.inv.kt b/idea/testData/formatter/DelegationList.after.inv.kt index d661309ffac..77d5b0e2206 100644 --- a/idea/testData/formatter/DelegationList.after.inv.kt +++ b/idea/testData/formatter/DelegationList.after.inv.kt @@ -33,7 +33,8 @@ enum class Test : A1 { Test() THIRD_ITEM : Test(), - C1() FORTH_ITEM : Test() + C1() + FORTH_ITEM : Test() } // SET_TRUE: ALIGN_MULTILINE_EXTENDS_LIST \ No newline at end of file diff --git a/idea/testData/formatter/DelegationList.after.kt b/idea/testData/formatter/DelegationList.after.kt index 919487355b8..9adf3e5cb81 100644 --- a/idea/testData/formatter/DelegationList.after.kt +++ b/idea/testData/formatter/DelegationList.after.kt @@ -33,7 +33,8 @@ enum class Test : A1 { Test() THIRD_ITEM : Test(), - C1() FORTH_ITEM : Test() + C1() + FORTH_ITEM : Test() } // SET_TRUE: ALIGN_MULTILINE_EXTENDS_LIST \ No newline at end of file diff --git a/idea/testData/formatter/EmptyLineAfterObjectDeclaration.after.kt b/idea/testData/formatter/EmptyLineAfterObjectDeclaration.after.kt new file mode 100644 index 00000000000..dd634b2729d --- /dev/null +++ b/idea/testData/formatter/EmptyLineAfterObjectDeclaration.after.kt @@ -0,0 +1,117 @@ +object O1 + +object O2 + +// ----- + +object O3 + +fun f1() = 1 + +// ----- + +object O4 + +val p1 = 1 + +// ----- + +object O5 + +class C1 + +// ----- + +object O6 + +trait T1 + +// ----- + +enum class E1 { + object O7 + + ENTRY +} + +// ----- + +object O8 {} + +object O9 + +// ----- + +object O10 {} + +fun f2() = 1 + +// ----- + +object O11 {} + +val p2 = 1 + +// ----- + +object O12 {} + +class C2 + +// ----- + +object O13 {} + +trait T2 + +// ----- + +enum class E2 { + object O14 {} + + ENTRY +} + +// ----- + +object O15 { +} + +object O16 + +// ----- + +object O17 { +} + +fun f3() = 1 + +// ----- + +object O18 { +} + +val p3 = 1 + +// ----- + +object O19 { +} + +class C3 + +// ----- + +object O20 { +} + +trait T3 + +// ----- + +enum class E3 { + object O21 { + } + + ENTRY +} diff --git a/idea/testData/formatter/EmptyLineAfterObjectDeclaration.kt b/idea/testData/formatter/EmptyLineAfterObjectDeclaration.kt new file mode 100644 index 00000000000..163e44eeba1 --- /dev/null +++ b/idea/testData/formatter/EmptyLineAfterObjectDeclaration.kt @@ -0,0 +1,99 @@ +object O1 +object O2 + +// ----- + +object O3 +fun f1() = 1 + +// ----- + +object O4 +val p1 = 1 + +// ----- + +object O5 +class C1 + +// ----- + +object O6 +trait T1 + +// ----- + +enum class E1 { + object O7 + ENTRY +} + +// ----- + +object O8 {} +object O9 + +// ----- + +object O10 {} +fun f2() = 1 + +// ----- + +object O11 {} +val p2 = 1 + +// ----- + +object O12 {} +class C2 + +// ----- + +object O13 {} +trait T2 + +// ----- + +enum class E2 { + object O14 {} + ENTRY +} + +// ----- + +object O15 { +} +object O16 + +// ----- + +object O17 { +} +fun f3() = 1 + +// ----- + +object O18 { +} +val p3 = 1 + +// ----- + +object O19 { +} +class C3 + +// ----- + +object O20 { +} +trait T3 + +// ----- + +enum class E3 { + object O21 { + } + ENTRY +} diff --git a/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt new file mode 100644 index 00000000000..e4bf2fbf7d6 --- /dev/null +++ b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt @@ -0,0 +1,30 @@ +enum class E1 { F S T +} + +enum class E2 { + F S T +} + +enum class E3 { + F S T +} + +enum class E4 { + F { + } + S T +} + +enum class E5 { F S {} T +} + +enum class E6 { + F S T {} +} + +enum class E7 { + F { + + } + S T +} \ No newline at end of file diff --git a/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt b/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt new file mode 100644 index 00000000000..890c22932ed --- /dev/null +++ b/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt @@ -0,0 +1,25 @@ +enum class E1 { F S T } + +enum class E2 { + F S T +} + +enum class E3 { + F S T} + +enum class E4 { + F { + } + S T} + +enum class E5 { F S {} T } + +enum class E6 { +F S T {} +} + +enum class E7 { + F { + + } S T +} \ No newline at end of file diff --git a/idea/tests/org/jetbrains/jet/formatter/JetFormatterTestGenerated.java b/idea/tests/org/jetbrains/jet/formatter/JetFormatterTestGenerated.java index 625c7b282d7..634a812eec8 100644 --- a/idea/tests/org/jetbrains/jet/formatter/JetFormatterTestGenerated.java +++ b/idea/tests/org/jetbrains/jet/formatter/JetFormatterTestGenerated.java @@ -148,6 +148,12 @@ public class JetFormatterTestGenerated extends AbstractJetFormatterTest { doTest(fileName); } + @TestMetadata("EmptyLineAfterObjectDeclaration.after.kt") + public void testEmptyLineAfterObjectDeclaration() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineAfterObjectDeclaration.after.kt"); + doTest(fileName); + } + @TestMetadata("EmptyLineAfterPackage.after.kt") public void testEmptyLineAfterPackage() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineAfterPackage.after.kt"); @@ -172,6 +178,12 @@ public class JetFormatterTestGenerated extends AbstractJetFormatterTest { doTest(fileName); } + @TestMetadata("EmptyLineBetweenEnumEntries.after.kt") + public void testEmptyLineBetweenEnumEntries() throws Exception { + String fileName = JetTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt"); + doTest(fileName); + } + @TestMetadata("EmptyLineBetweenFunAndProperty.after.kt") public void testEmptyLineBetweenFunAndProperty() throws Exception { String fileName = JetTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineBetweenFunAndProperty.after.kt"); diff --git a/j2k/tests/testData/ast/enum/enumWithNameField.kt b/j2k/tests/testData/ast/enum/enumWithNameField.kt index c8d58143b78..367dd4d3235 100644 --- a/j2k/tests/testData/ast/enum/enumWithNameField.kt +++ b/j2k/tests/testData/ast/enum/enumWithNameField.kt @@ -1,4 +1,5 @@ enum class E { I + private val name: String? = null } \ No newline at end of file diff --git a/j2k/tests/testData/ast/enum/overrideToString.kt b/j2k/tests/testData/ast/enum/overrideToString.kt index 90eae56b973..78d0d11e532 100644 --- a/j2k/tests/testData/ast/enum/overrideToString.kt +++ b/j2k/tests/testData/ast/enum/overrideToString.kt @@ -4,6 +4,7 @@ enum class Color { RED YELLOW BLUE + override fun toString(): String { return "COLOR" }