"Blank lines after class header" option supported

This commit is contained in:
Dmitry Jemerov
2017-06-22 15:33:01 +02:00
parent 6a96ade02c
commit 5c8a90fe85
5 changed files with 84 additions and 3 deletions
@@ -17,10 +17,12 @@
package org.jetbrains.kotlin.idea.formatter package org.jetbrains.kotlin.idea.formatter
import com.intellij.formatting.ASTBlock import com.intellij.formatting.ASTBlock
import com.intellij.formatting.DependentSpacingRule
import com.intellij.formatting.Spacing import com.intellij.formatting.Spacing
import com.intellij.formatting.SpacingBuilder import com.intellij.formatting.SpacingBuilder
import com.intellij.formatting.SpacingBuilder.RuleBuilder import com.intellij.formatting.SpacingBuilder.RuleBuilder
import com.intellij.lang.ASTNode import com.intellij.lang.ASTNode
import com.intellij.openapi.util.TextRange
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
import com.intellij.psi.codeStyle.CodeStyleSettings import com.intellij.psi.codeStyle.CodeStyleSettings
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
@@ -32,6 +34,7 @@ import org.jetbrains.kotlin.idea.formatter.KotlinSpacingBuilder.CustomSpacingBui
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.lexer.KtTokens.* import org.jetbrains.kotlin.lexer.KtTokens.*
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.isObjectLiteral
import org.jetbrains.kotlin.psi.psiUtil.textRangeWithoutComments import org.jetbrains.kotlin.psi.psiUtil.textRangeWithoutComments
val MODIFIERS_LIST_ENTRIES = TokenSet.orSet(TokenSet.create(ANNOTATION_ENTRY, ANNOTATION), MODIFIER_KEYWORDS) val MODIFIERS_LIST_ENTRIES = TokenSet.orSet(TokenSet.create(ANNOTATION_ENTRY, ANNOTATION), MODIFIER_KEYWORDS)
@@ -78,6 +81,25 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing
} else null } else null
} }
inPosition(parent = CLASS_BODY, left = LBRACE).customRule { parent, left, right ->
if (right.node.elementType == RBRACE) {
return@customRule createSpacing(0)
}
val classBody = parent.node.psi as KtClassBody
val parentPsi = classBody.parent as? KtClassOrObject ?: return@customRule null
if (commonCodeStyleSettings.BLANK_LINES_AFTER_CLASS_HEADER == 0 || parentPsi.isObjectLiteral()) {
null
}
else {
Spacing.createDependentLFSpacing(
0, 0,
TextRange(parentPsi.textRange.startOffset, left.node.psi.textRange.startOffset),
settings.KEEP_LINE_BREAKS, settings.KEEP_BLANK_LINES_IN_DECLARATIONS,
DependentSpacingRule(DependentSpacingRule.Trigger.HAS_LINE_FEEDS)
.registerData(DependentSpacingRule.Anchor.MIN_LINE_FEEDS, commonCodeStyleSettings.BLANK_LINES_AFTER_CLASS_HEADER + 1))
}
}
val parameterWithDocCommentRule = { val parameterWithDocCommentRule = {
_: ASTBlock, _: ASTBlock, right: ASTBlock -> _: ASTBlock, _: ASTBlock, right: ASTBlock ->
if (right.node.firstChildNode.elementType == KtTokens.DOC_COMMENT) { if (right.node.firstChildNode.elementType == KtTokens.DOC_COMMENT) {
@@ -130,8 +152,6 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing
after(DOC_COMMENT).lineBreakInCode() after(DOC_COMMENT).lineBreakInCode()
// =============== Spacing ================ // =============== Spacing ================
betweenInside(LBRACE, RBRACE, CLASS_BODY).spaces(0)
before(COMMA).spaceIf(kotlinCommonSettings.SPACE_BEFORE_COMMA) before(COMMA).spaceIf(kotlinCommonSettings.SPACE_BEFORE_COMMA)
after(COMMA).spaceIf(kotlinCommonSettings.SPACE_AFTER_COMMA) after(COMMA).spaceIf(kotlinCommonSettings.SPACE_AFTER_COMMA)
@@ -252,7 +252,8 @@ class KotlinLanguageCodeStyleSettingsProvider : LanguageCodeStyleSettingsProvide
LanguageCodeStyleSettingsProvider.SettingsType.BLANK_LINES_SETTINGS -> { LanguageCodeStyleSettingsProvider.SettingsType.BLANK_LINES_SETTINGS -> {
consumer.showStandardOptions( consumer.showStandardOptions(
"KEEP_BLANK_LINES_IN_CODE", "KEEP_BLANK_LINES_IN_CODE",
"KEEP_BLANK_LINES_IN_DECLARATIONS" "KEEP_BLANK_LINES_IN_DECLARATIONS",
"BLANK_LINES_AFTER_CLASS_HEADER"
) )
showCustomOption(KotlinCodeStyleSettings::BLANK_LINES_AROUND_BLOCK_WHEN_BRANCHES, showCustomOption(KotlinCodeStyleSettings::BLANK_LINES_AROUND_BLOCK_WHEN_BRANCHES,
"Around 'when' branches with {}", "Around 'when' branches with {}",
@@ -0,0 +1,28 @@
class Foo {
fun bar() {
}
}
object Bar {
fun xyzzy() {
}
}
val f = object {
fun foo() {}
}
class FooM
: IFoo {
fun bar()
}
class FooC(
val x: String
) {
fun bar()
}
// SET_INT: BLANK_LINES_AFTER_CLASS_HEADER = 1
+26
View File
@@ -0,0 +1,26 @@
class Foo {
fun bar() {
}
}
object Bar {
fun xyzzy() {
}
}
val f = object {
fun foo() {}
}
class FooM
: IFoo {
fun bar()
}
class FooC(
val x: String
) {
fun bar()
}
// SET_INT: BLANK_LINES_AFTER_CLASS_HEADER = 1
@@ -92,6 +92,12 @@ public class FormatterTestGenerated extends AbstractFormatterTest {
doTest(fileName); doTest(fileName);
} }
@TestMetadata("BlankLinesAfterClassHeader.after.kt")
public void testBlankLinesAfterClassHeader() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/BlankLinesAfterClassHeader.after.kt");
doTest(fileName);
}
@TestMetadata("BlockFor.after.kt") @TestMetadata("BlockFor.after.kt")
public void testBlockFor() throws Exception { public void testBlockFor() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/BlockFor.after.kt"); String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/BlockFor.after.kt");