diff --git a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt index aef606474cc..2f03d8e10c6 100644 --- a/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt +++ b/idea/formatter/src/org/jetbrains/kotlin/idea/formatter/KotlinSpacingBuilder.kt @@ -21,6 +21,7 @@ import com.intellij.formatting.DependentSpacingRule.Anchor import com.intellij.formatting.DependentSpacingRule.Trigger import com.intellij.lang.ASTNode import com.intellij.openapi.util.TextRange +import com.intellij.psi.PsiComment import com.intellij.psi.codeStyle.CommonCodeStyleSettings import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.TokenSet @@ -80,10 +81,12 @@ class KotlinSpacingBuilder(val commonCodeStyleSettings: CommonCodeStyleSettings, fun emptyLinesIfLineBreakInLeft(emptyLines: Int, numberOfLineFeedsOtherwise: Int = 1, numSpacesOtherwise: Int = 0) { newRule { parent: ASTBlock, left: ASTBlock, right: ASTBlock -> + val lastChild = left.node?.psi?.lastChild + val leftEndsWithComment = lastChild is PsiComment && lastChild.tokenType == KtTokens.EOL_COMMENT val dependentSpacingRule = DependentSpacingRule(Trigger.HAS_LINE_FEEDS).registerData(Anchor.MIN_LINE_FEEDS, emptyLines + 1) spacingBuilderUtil.createLineFeedDependentSpacing(numSpacesOtherwise, numSpacesOtherwise, - numberOfLineFeedsOtherwise, + if (leftEndsWithComment) Math.max(1, numberOfLineFeedsOtherwise) else numberOfLineFeedsOtherwise, commonCodeStyleSettings.KEEP_LINE_BREAKS, commonCodeStyleSettings.KEEP_BLANK_LINES_IN_DECLARATIONS, left.textRange, diff --git a/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.inv.kt b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.inv.kt new file mode 100644 index 00000000000..db19117da6a --- /dev/null +++ b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.inv.kt @@ -0,0 +1,33 @@ +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 +} + +enum class E8 { + A, // A + B // B +} + +// SET_TRUE: KEEP_LINE_BREAKS \ No newline at end of file diff --git a/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt index b09ccd2a0fd..1a275c04e22 100644 --- a/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt +++ b/idea/testData/formatter/EmptyLineBetweenEnumEntries.after.kt @@ -25,4 +25,11 @@ enum class E7 { }, S, T -} \ No newline at end of file +} + +enum class E8 { + A, // A + B // B +} + +// SET_TRUE: KEEP_LINE_BREAKS \ No newline at end of file diff --git a/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt b/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt index 5fe0e10e560..94c2f0f2e87 100644 --- a/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt +++ b/idea/testData/formatter/EmptyLineBetweenEnumEntries.kt @@ -22,4 +22,11 @@ enum class E7 { F { }, S, T -} \ No newline at end of file +} + +enum class E8 { + A, // A + B // B +} + +// SET_TRUE: KEEP_LINE_BREAKS \ No newline at end of file diff --git a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java index bf56cd4582d..1feb8c66138 100644 --- a/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java +++ b/idea/tests/org/jetbrains/kotlin/formatter/FormatterTestGenerated.java @@ -986,6 +986,12 @@ public class FormatterTestGenerated extends AbstractFormatterTest { doTestInverted(fileName); } + @TestMetadata("EmptyLineBetweenEnumEntries.after.inv.kt") + public void testEmptyLineBetweenEnumEntries() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineBetweenEnumEntries.after.inv.kt"); + doTestInverted(fileName); + } + @TestMetadata("ForLineBreak.after.inv.kt") public void testForLineBreak() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/ForLineBreak.after.inv.kt"); diff --git a/idea/tests/org/jetbrains/kotlin/test/SettingsConfigurator.java b/idea/tests/org/jetbrains/kotlin/test/SettingsConfigurator.java index 78ca5513be3..1bf307c50e2 100644 --- a/idea/tests/org/jetbrains/kotlin/test/SettingsConfigurator.java +++ b/idea/tests/org/jetbrains/kotlin/test/SettingsConfigurator.java @@ -28,7 +28,7 @@ import java.util.Arrays; public class SettingsConfigurator { public static final String SET_TRUE_DIRECTIVE = "SET_TRUE:"; public static final String SET_FALSE_DIRECTIVE = "SET_FALSE:"; - public static final String SET_INT_DIRECTIVE = "SET_INT:"; + private static final String SET_INT_DIRECTIVE = "SET_INT:"; private final String[] settingsToTrue; private final String[] settingsToFalse; @@ -54,7 +54,7 @@ public class SettingsConfigurator { this.objects = objects; } - public static void setSettingValue(String settingName, Object value, Class valueType, Object... objects) { + private static void setSettingValue(String settingName, Object value, Class valueType, Object... objects) { for (Object object : objects) { if (setSettingWithField(settingName, object, value) || setSettingWithMethod(settingName, object, value, valueType)) { return; @@ -65,11 +65,11 @@ public class SettingsConfigurator { "There's no property or method with name '%s' in given objects: %s", settingName, Arrays.toString(objects))); } - public static void setBooleanSetting(String setting, Boolean value, Object... objects) { + private static void setBooleanSetting(String setting, Boolean value, Object... objects) { setSettingValue(setting, value, boolean.class, objects); } - public static void setIntSetting(String setting, Integer value, Object... objects) { + private static void setIntSetting(String setting, Integer value, Object... objects) { setSettingValue(setting, value, int.class, objects); }