Option to wrap elvis expressions

#KT-21720 Fixed
This commit is contained in:
Dmitry Jemerov
2017-12-08 15:31:27 +01:00
parent d1daca2560
commit eacd010e7e
10 changed files with 49 additions and 16 deletions
@@ -47,6 +47,7 @@ public class KotlinCodeStyleSettings extends CustomCodeStyleSettings {
public boolean CONTINUATION_INDENT_IN_SUPERTYPE_LISTS = true;
public int BLANK_LINES_AROUND_BLOCK_WHEN_BRANCHES = 0;
public int WRAP_EXPRESSION_BODY_FUNCTIONS = 0;
public int WRAP_ELVIS_EXPRESSIONS = 1;
public KotlinCodeStyleSettings(CodeStyleSettings container) {
super("JetCodeStyleSettings", container);
@@ -439,6 +439,16 @@ abstract class KotlinCommonBlock(
}
}
}
if (nodePsi.operationToken == KtTokens.ELVIS) {
return object : WrappingStrategy {
override fun getWrap(childElement: ASTNode): Wrap? {
if (childElement.elementType == KtNodeTypes.OPERATION_REFERENCE) {
return Wrap.createWrap(settings.kotlinCustomSettings.WRAP_ELVIS_EXPRESSIONS, true)
}
return null
}
}
}
return WrappingStrategy.NoWrapping
}
}
@@ -50,6 +50,9 @@ fun SpacingBuilder.afterInside(element: IElementType, tokenSet: TokenSet, spacin
tokenSet.types.forEach { inType -> afterInside(element, inType).spacingFun() }
}
fun SpacingBuilder.RuleBuilder.spacesNoLineBreak(spaces: Int) =
spacing(spaces, spaces, 0, false, 0)
fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacingBuilderUtil): KotlinSpacingBuilder {
val kotlinCommonSettings = settings.kotlinCommonSettings
val kotlinCustomSettings = settings.kotlinCustomSettings
@@ -199,7 +202,7 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing
val spacesAroundAssignment = if (kotlinCommonSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS) 1 else 0
beforeInside(EQ, PROPERTY).spacing(spacesAroundAssignment, spacesAroundAssignment, 0, false, 0)
beforeInside(EQ, PROPERTY).spacesNoLineBreak(spacesAroundAssignment)
beforeInside(EQ, FUN).spacing(spacesAroundAssignment, spacesAroundAssignment, 0, false, 0)
around(TokenSet.create(EQ, MULTEQ, DIVEQ, PLUSEQ, MINUSEQ, PERCEQ)).spaceIf(kotlinCommonSettings.SPACE_AROUND_ASSIGNMENT_OPERATORS)
@@ -209,7 +212,8 @@ fun createSpacingBuilder(settings: CodeStyleSettings, builderUtil: KotlinSpacing
aroundInside(TokenSet.create(PLUS, MINUS), BINARY_EXPRESSION).spaceIf(kotlinCommonSettings.SPACE_AROUND_ADDITIVE_OPERATORS)
aroundInside(TokenSet.create(MUL, DIV, PERC), BINARY_EXPRESSION).spaceIf(kotlinCommonSettings.SPACE_AROUND_MULTIPLICATIVE_OPERATORS)
around(TokenSet.create(PLUSPLUS, MINUSMINUS, EXCLEXCL, MINUS, PLUS, EXCL)).spaceIf(kotlinCommonSettings.SPACE_AROUND_UNARY_OPERATOR)
around(ELVIS).spaces(1)
before(ELVIS).spaces(1)
after(ELVIS).spacesNoLineBreak(1)
around(RANGE).spaceIf(kotlinCustomSettings.SPACE_AROUND_RANGE)
after(MODIFIER_LIST).spaces(1)
@@ -55,10 +55,12 @@ class KotlinLanguageCodeStyleSettingsProvider : LanguageCodeStyleSettingsProvide
fun multilineMethod(
foo: String,
bar: String
bar: String?,
x: Int?
) {
foo.toUpperCase().trim()
.length
val barLen = bar?.length() ?: x ?: -1
}
}
@@ -300,6 +302,11 @@ class KotlinLanguageCodeStyleSettingsProvider : LanguageCodeStyleSettingsProvide
"Use continuation indent",
"Expression body functions"
)
showCustomOption(
KotlinCodeStyleSettings::WRAP_ELVIS_EXPRESSIONS,
"Elvis expressions",
options = *arrayOf(CodeStyleSettingsCustomizable.WRAP_OPTIONS_FOR_SINGLETON, CodeStyleSettingsCustomizable.WRAP_VALUES_FOR_SINGLETON)
)
}
LanguageCodeStyleSettingsProvider.SettingsType.BLANK_LINES_SETTINGS -> {
consumer.showStandardOptions(
+4 -5
View File
@@ -3,15 +3,14 @@ fun test(a: Int?) {
a ?: 42
a ?:
42
a ?: 42
a
?: 42
val some = a ?:
b ?:
12
val some = a
?: b
?: 12
}
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
+4 -5
View File
@@ -3,15 +3,14 @@ fun test(a: Int?) {
a ?: 42
a ?:
42
a ?: 42
a
?: 42
val some = a ?:
b ?:
12
val some = a
?: b
?: 12
}
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
+3 -3
View File
@@ -9,9 +9,9 @@ fun test(a: Int?) {
a
?: 42
val some = a ?:
b ?:
12
val some = a
?: b
?: 12
}
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
+4
View File
@@ -0,0 +1,4 @@
val x = "abc"
?: "def"
// SET_INT: WRAP_ELVIS_EXPRESSIONS = 2
+3
View File
@@ -0,0 +1,3 @@
val x = "abc" ?: "def"
// SET_INT: WRAP_ELVIS_EXPRESSIONS = 2
@@ -284,6 +284,12 @@ public class FormatterTestGenerated extends AbstractFormatterTest {
doTest(fileName);
}
@TestMetadata("ElvisWrap.after.kt")
public void testElvisWrap() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/ElvisWrap.after.kt");
doTest(fileName);
}
@TestMetadata("EmptyLineAfterObjectDeclaration.after.kt")
public void testEmptyLineAfterObjectDeclaration() throws Exception {
String fileName = KotlinTestUtils.navigationMetadata("idea/testData/formatter/EmptyLineAfterObjectDeclaration.after.kt");