Formatter: empty lines between declarations

This commit is contained in:
Nikolay Krasko
2014-10-21 17:26:17 +04:00
parent 6090eb5563
commit 0cd95b5514
11 changed files with 310 additions and 8 deletions
@@ -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)
@@ -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()
@@ -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
@@ -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
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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
}
@@ -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");
@@ -1,4 +1,5 @@
enum class E {
I
private val name: String? = null
}
@@ -4,6 +4,7 @@ enum class Color {
RED
YELLOW
BLUE
override fun toString(): String {
return "COLOR"
}