From 6208c69c7270442596be0b8b63f41d27e4df6338 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Thu, 21 Dec 2017 14:22:20 +0100 Subject: [PATCH] Add option for wrapping closing paren in multiline if conditions --- .../idea/core/formatter/KotlinCodeStyleSettings.java | 1 + .../idea/formatter/KotlinStyleGuideCodeStyle.kt | 1 + .../kotlin/idea/formatter/kotlinSpacingRules.kt | 12 ++++++++++++ .../KotlinLanguageCodeStyleSettingsProvider.kt | 4 ++++ idea/testData/formatter/IfRParen.after.kt | 10 ++++++++++ idea/testData/formatter/IfRParen.kt | 9 +++++++++ .../kotlin/formatter/FormatterTestGenerated.java | 6 ++++++ 7 files changed, 43 insertions(+) create mode 100644 idea/testData/formatter/IfRParen.after.kt create mode 100644 idea/testData/formatter/IfRParen.kt diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/core/formatter/KotlinCodeStyleSettings.java b/idea/formatter/src/org/jetbrains/kotlin/idea/core/formatter/KotlinCodeStyleSettings.java index 5e8a7763aa5..5226a490031 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/core/formatter/KotlinCodeStyleSettings.java +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/core/formatter/KotlinCodeStyleSettings.java @@ -49,6 +49,7 @@ public class KotlinCodeStyleSettings extends CustomCodeStyleSettings { public int BLANK_LINES_AROUND_BLOCK_WHEN_BRANCHES = 0; public int WRAP_EXPRESSION_BODY_FUNCTIONS = 0; public int WRAP_ELVIS_EXPRESSIONS = 1; + public boolean IF_RPAREN_ON_NEW_LINE = false; public KotlinCodeStyleSettings(CodeStyleSettings container) { super("JetCodeStyleSettings", container); diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt index 058c230eb69..87f0543bcaa 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinStyleGuideCodeStyle.kt @@ -30,6 +30,7 @@ class KotlinStyleGuideCodeStyle : PredefinedCodeStyle("Kotlin style guide", Kotl CONTINUATION_INDENT_IN_SUPERTYPE_LISTS = false CONTINUATION_INDENT_IN_IF_CONDITIONS = false WRAP_EXPRESSION_BODY_FUNCTIONS = CodeStyleSettings.WRAP_AS_NEEDED + IF_RPAREN_ON_NEW_LINE = true } settings.kotlinCommonSettings.apply { diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt index 8d7fd73a19d..743f5b25c63 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/kotlinSpacingRules.kt @@ -185,6 +185,18 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing createSpacing(0) } } + + inPosition(left = CONDITION, right = RPAR).customRule { parent, _, _ -> + if (kotlinCustomSettings.IF_RPAREN_ON_NEW_LINE) { + Spacing.createDependentLFSpacing(0, 0, + excludeLambdasAndObjects(parent), + commonCodeStyleSettings.KEEP_LINE_BREAKS, + commonCodeStyleSettings.KEEP_BLANK_LINES_IN_CODE) + } + else { + createSpacing(0) + } + } } simple { diff --git a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinLanguageCodeStyleSettingsProvider.kt b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinLanguageCodeStyleSettingsProvider.kt index 70ce104161c..1d409579a52 100644 --- a/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinLanguageCodeStyleSettingsProvider.kt +++ b/idea/src/org/jetbrains/kotlin/idea/formatter/KotlinLanguageCodeStyleSettingsProvider.kt @@ -65,6 +65,10 @@ class KotlinLanguageCodeStyleSettingsProvider : LanguageCodeStyleSettingsProvide foo.toUpperCase().trim() .length val barLen = bar?.length() ?: x ?: -1 + if (foo.length > 0 && + barLen > 0) { + println("> 0") + } } } diff --git a/idea/testData/formatter/IfRParen.after.kt b/idea/testData/formatter/IfRParen.after.kt new file mode 100644 index 00000000000..64f292cef0a --- /dev/null +++ b/idea/testData/formatter/IfRParen.after.kt @@ -0,0 +1,10 @@ +fun x() { + if (foo.length > 0 && + barLen > 0 + ) { + println("> 0") + } +} + +// SET_TRUE: IF_RPAREN_ON_NEW_LINE +// SET_FALSE: CONTINUATION_INDENT_IN_IF_CONDITIONS diff --git a/idea/testData/formatter/IfRParen.kt b/idea/testData/formatter/IfRParen.kt new file mode 100644 index 00000000000..715959e37fa --- /dev/null +++ b/idea/testData/formatter/IfRParen.kt @@ -0,0 +1,9 @@ +fun x() { + if (foo.length > 0 && + barLen > 0) { + println("> 0") + } +} + +// SET_TRUE: IF_RPAREN_ON_NEW_LINE +// SET_FALSE: CONTINUATION_INDENT_IN_IF_CONDITIONS diff --git a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java index dfed15559e1..c644e2d2f40 100644 --- a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java @@ -494,6 +494,12 @@ public class FormatterTestGenerated extends AbstractFormatterTest { doTest(fileName); } + @TestMetadata("IfRParen.after.kt") + public void testIfRParen() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/IfRParen.after.kt"); + doTest(fileName); + } + @TestMetadata("IfSpacing.after.kt") public void testIfSpacing() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/IfSpacing.after.kt");