From 9eb2615ac353b84eacf274bb0989402028e16687 Mon Sep 17 00:00:00 2001 From: Nikolay Krasko Date: Sun, 11 May 2014 00:09:29 +0400 Subject: [PATCH] Don't remove linebreak after smb. else's statement } --- .../plugin/formatter/kotlinSpacingRules.kt | 29 ++++++++++++++----- .../formatter/ElseOnNewLine.after.inv.kt | 16 ++++++++++ .../testData/formatter/ElseOnNewLine.after.kt | 17 +++++++++++ idea/testData/formatter/ElseOnNewLine.kt | 16 ++++++++++ .../formatter/WhileLineBreak.after.inv.kt | 6 ++++ .../formatter/WhileLineBreak.after.kt | 7 +++++ idea/testData/formatter/WhileLineBreak.kt | 6 ++++ 7 files changed, 90 insertions(+), 7 deletions(-) diff --git a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt index 0ba493823b1..b3359c18b7f 100644 --- a/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt +++ b/idea/src/org/jetbrains/jet/plugin/formatter/kotlinSpacingRules.kt @@ -131,7 +131,11 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { } custom { - fun CustomSpacingBuilder.ruleForKeywordOnNewLine(shouldBeOnNewLine: Boolean, keyword: IElementType, parent: IElementType) { + fun CustomSpacingBuilder.ruleForKeywordOnNewLine( + shouldBeOnNewLine: Boolean, + keyword: IElementType, + parent: IElementType, + afterBlockFilter: (wordParent: ASTNode, block: ASTNode) -> Boolean = { keywordParent, block -> true }) { if (shouldBeOnNewLine) { inPosition(parent = parent, right = keyword) .lineBreakIfLineBreakInParent(numSpacesOtherwise = 1, allowBlankLines = false) @@ -139,16 +143,27 @@ fun createSpacingBuilder(settings: CodeStyleSettings): KotlinSpacingBuilder { else { inPosition(parent = parent, right = keyword).customRule { parent, left, right -> - // do not remove linebreak if expression to the left is not a block - val previousNonWhitespaceLeaf = FormatterUtil.getPreviousNonWhitespaceLeaf(right.getNode()) - val keepLineBreaks = previousNonWhitespaceLeaf == null || previousNonWhitespaceLeaf.getElementType() != RBRACE - Spacing.createSpacing(1, 1, 0, keepLineBreaks, 0) + + val previousLeaf = FormatterUtil.getPreviousNonWhitespaceLeaf(right.getNode()) + val leftBlock = if ( + previousLeaf != null && + previousLeaf.getElementType() == RBRACE && + previousLeaf.getTreeParent()?.getElementType() == BLOCK) { + previousLeaf.getTreeParent()!! + } else null + + val removeLineBreaks = leftBlock != null && afterBlockFilter(right.getNode()?.getTreeParent()!!, leftBlock) + Spacing.createSpacing(1, 1, 0, !removeLineBreaks, 0) } } } - ruleForKeywordOnNewLine(jetCommonSettings.ELSE_ON_NEW_LINE, keyword = ELSE_KEYWORD, parent = IF) - ruleForKeywordOnNewLine(jetCommonSettings.WHILE_ON_NEW_LINE, keyword = WHILE_KEYWORD, parent = DO_WHILE) + ruleForKeywordOnNewLine(jetCommonSettings.ELSE_ON_NEW_LINE, keyword = ELSE_KEYWORD, parent = IF) { keywordParent, block -> + block.getTreeParent()?.getElementType() == THEN && block.getTreeParent()?.getTreeParent() == keywordParent + } + ruleForKeywordOnNewLine(jetCommonSettings.WHILE_ON_NEW_LINE, keyword = WHILE_KEYWORD, parent = DO_WHILE) { keywordParent, block -> + block.getTreeParent()?.getElementType() == BODY && block.getTreeParent()?.getTreeParent() == keywordParent + } ruleForKeywordOnNewLine(jetCommonSettings.CATCH_ON_NEW_LINE, keyword = CATCH, parent = TRY) ruleForKeywordOnNewLine(jetCommonSettings.FINALLY_ON_NEW_LINE, keyword = FINALLY, parent = TRY) diff --git a/idea/testData/formatter/ElseOnNewLine.after.inv.kt b/idea/testData/formatter/ElseOnNewLine.after.inv.kt index 1ca5bb29fa8..cd789cdde8a 100644 --- a/idea/testData/formatter/ElseOnNewLine.after.inv.kt +++ b/idea/testData/formatter/ElseOnNewLine.after.inv.kt @@ -28,6 +28,22 @@ fun f() { 5 else 5 + + if (true) + if (true) { + 4 + } else { + 4 + } + else + 5 + + if (true) + while (true) { + 4 + } + else + 5 } // SET_TRUE: ELSE_ON_NEW_LINE \ No newline at end of file diff --git a/idea/testData/formatter/ElseOnNewLine.after.kt b/idea/testData/formatter/ElseOnNewLine.after.kt index b825764c755..b6b22644a89 100644 --- a/idea/testData/formatter/ElseOnNewLine.after.kt +++ b/idea/testData/formatter/ElseOnNewLine.after.kt @@ -34,6 +34,23 @@ fun f() { 5 else 5 + + if (true) + if (true) { + 4 + } + else { + 4 + } + else + 5 + + if (true) + while (true) { + 4 + } + else + 5 } // SET_TRUE: ELSE_ON_NEW_LINE \ No newline at end of file diff --git a/idea/testData/formatter/ElseOnNewLine.kt b/idea/testData/formatter/ElseOnNewLine.kt index ec198f5bde3..8ba17f04d70 100644 --- a/idea/testData/formatter/ElseOnNewLine.kt +++ b/idea/testData/formatter/ElseOnNewLine.kt @@ -34,6 +34,22 @@ fun f() { 5 else 5 + + if (true) + if (true) { + 4 + } else { + 4 + } + else + 5 + + if (true) + while (true) { + 4 + } + else + 5 } // SET_TRUE: ELSE_ON_NEW_LINE \ No newline at end of file diff --git a/idea/testData/formatter/WhileLineBreak.after.inv.kt b/idea/testData/formatter/WhileLineBreak.after.inv.kt index ca8311dc86f..f7855671a9d 100644 --- a/idea/testData/formatter/WhileLineBreak.after.inv.kt +++ b/idea/testData/formatter/WhileLineBreak.after.inv.kt @@ -17,6 +17,12 @@ fun main(args: Array) { while (true) //blabla { } + + do + if (true) { + + } + while (true) } // SET_TRUE: LBRACE_ON_NEXT_LINE \ No newline at end of file diff --git a/idea/testData/formatter/WhileLineBreak.after.kt b/idea/testData/formatter/WhileLineBreak.after.kt index f6ba8d00564..31b4fb125e0 100644 --- a/idea/testData/formatter/WhileLineBreak.after.kt +++ b/idea/testData/formatter/WhileLineBreak.after.kt @@ -21,6 +21,13 @@ fun main(args: Array) while (true) //blabla { } + + do + if (true) + { + + } + while (true) } // SET_TRUE: LBRACE_ON_NEXT_LINE \ No newline at end of file diff --git a/idea/testData/formatter/WhileLineBreak.kt b/idea/testData/formatter/WhileLineBreak.kt index 12ee26b44fd..adfd0c6fb51 100644 --- a/idea/testData/formatter/WhileLineBreak.kt +++ b/idea/testData/formatter/WhileLineBreak.kt @@ -21,6 +21,12 @@ fun main(args: Array) { while (true) //blabla { } + + do + if (true) { + + } + while (true) } // SET_TRUE: LBRACE_ON_NEXT_LINE \ No newline at end of file