Make assignment indent conforms with indent for expression bodies (KT-28484)
Do not make plain list of binary expression for assignment expressions. #KT-28484 Fixed
This commit is contained in:
@@ -434,9 +434,14 @@ abstract class KotlinCommonBlock(
|
|||||||
val childNodes = when {
|
val childNodes = when {
|
||||||
overrideChildren != null -> overrideChildren.asSequence()
|
overrideChildren != null -> overrideChildren.asSequence()
|
||||||
node.elementType == KtNodeTypes.BINARY_EXPRESSION -> {
|
node.elementType == KtNodeTypes.BINARY_EXPRESSION -> {
|
||||||
val binaryExpressionChildren = mutableListOf<ASTNode>()
|
val binaryExpression = node.psi as? KtBinaryExpression
|
||||||
collectBinaryExpressionChildren(node, binaryExpressionChildren)
|
if (binaryExpression != null && ALL_ASSIGNMENTS.contains(binaryExpression.operationToken)) {
|
||||||
binaryExpressionChildren.asSequence()
|
node.children()
|
||||||
|
} else {
|
||||||
|
val binaryExpressionChildren = mutableListOf<ASTNode>()
|
||||||
|
collectBinaryExpressionChildren(node, binaryExpressionChildren)
|
||||||
|
binaryExpressionChildren.asSequence()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else -> node.children()
|
else -> node.children()
|
||||||
}
|
}
|
||||||
@@ -725,6 +730,21 @@ private val INDENT_RULES = arrayOf(
|
|||||||
}
|
}
|
||||||
.continuationIf(KotlinCodeStyleSettings::CONTINUATION_INDENT_FOR_EXPRESSION_BODIES),
|
.continuationIf(KotlinCodeStyleSettings::CONTINUATION_INDENT_FOR_EXPRESSION_BODIES),
|
||||||
|
|
||||||
|
strategy("Assignment expressions")
|
||||||
|
.within(KtNodeTypes.BINARY_EXPRESSION)
|
||||||
|
.within {
|
||||||
|
val binaryExpression = it.psi as? KtBinaryExpression
|
||||||
|
?: return@within false
|
||||||
|
|
||||||
|
return@within KtTokens.ALL_ASSIGNMENTS.contains(binaryExpression.operationToken)
|
||||||
|
}
|
||||||
|
.forElement {
|
||||||
|
val psi = it.psi
|
||||||
|
val binaryExpression = psi?.parent as? KtBinaryExpression
|
||||||
|
binaryExpression?.right == psi
|
||||||
|
}
|
||||||
|
.continuationIf(KotlinCodeStyleSettings::CONTINUATION_INDENT_FOR_EXPRESSION_BODIES),
|
||||||
|
|
||||||
strategy("Indent for parts")
|
strategy("Indent for parts")
|
||||||
.within(KtNodeTypes.PROPERTY, KtNodeTypes.FUN, KtNodeTypes.DESTRUCTURING_DECLARATION, KtNodeTypes.SECONDARY_CONSTRUCTOR)
|
.within(KtNodeTypes.PROPERTY, KtNodeTypes.FUN, KtNodeTypes.DESTRUCTURING_DECLARATION, KtNodeTypes.SECONDARY_CONSTRUCTOR)
|
||||||
.notForType(
|
.notForType(
|
||||||
@@ -755,7 +775,9 @@ private val INDENT_RULES = arrayOf(
|
|||||||
|
|
||||||
strategy("Binary expressions")
|
strategy("Binary expressions")
|
||||||
.within(BINARY_EXPRESSIONS)
|
.within(BINARY_EXPRESSIONS)
|
||||||
.forElement { node -> !node.suppressBinaryExpressionIndent() }
|
.forElement { node ->
|
||||||
|
!node.suppressBinaryExpressionIndent()
|
||||||
|
}
|
||||||
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
||||||
|
|
||||||
strategy("Parenthesized expression")
|
strategy("Parenthesized expression")
|
||||||
|
|||||||
@@ -38,7 +38,10 @@ abstract class NodeIndentStrategy {
|
|||||||
private var indentCallback: (CodeStyleSettings) -> Indent = { Indent.getNoneIndent() }
|
private var indentCallback: (CodeStyleSettings) -> Indent = { Indent.getNoneIndent() }
|
||||||
|
|
||||||
private val within = ArrayList<IElementType>()
|
private val within = ArrayList<IElementType>()
|
||||||
|
private var withinCallback: ((ASTNode) -> Boolean)? = null
|
||||||
|
|
||||||
private val notIn = ArrayList<IElementType>()
|
private val notIn = ArrayList<IElementType>()
|
||||||
|
|
||||||
private val forElement = ArrayList<IElementType>()
|
private val forElement = ArrayList<IElementType>()
|
||||||
private val notForElement = ArrayList<IElementType>()
|
private val notForElement = ArrayList<IElementType>()
|
||||||
private var forElementCallback: ((ASTNode) -> Boolean)? = null
|
private var forElementCallback: ((ASTNode) -> Boolean)? = null
|
||||||
@@ -72,6 +75,11 @@ abstract class NodeIndentStrategy {
|
|||||||
return this
|
return this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun within(callback: (ASTNode) -> Boolean): PositionStrategy {
|
||||||
|
withinCallback = callback
|
||||||
|
return this
|
||||||
|
}
|
||||||
|
|
||||||
fun notWithin(parentType: IElementType, vararg orParentTypes: IElementType): PositionStrategy {
|
fun notWithin(parentType: IElementType, vararg orParentTypes: IElementType): PositionStrategy {
|
||||||
fillTypes(notIn, parentType, orParentTypes)
|
fillTypes(notIn, parentType, orParentTypes)
|
||||||
return this
|
return this
|
||||||
@@ -129,6 +137,10 @@ abstract class NodeIndentStrategy {
|
|||||||
if (notIn.contains(parent.elementType)) {
|
if (notIn.contains(parent.elementType)) {
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (withinCallback?.invoke(parent) == false) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!within.isEmpty()) {
|
if (!within.isEmpty()) {
|
||||||
|
|||||||
@@ -35,4 +35,5 @@ fun test() {
|
|||||||
1..2
|
1..2
|
||||||
}
|
}
|
||||||
|
|
||||||
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -2,19 +2,19 @@ fun test() {
|
|||||||
var a = 12
|
var a = 12
|
||||||
|
|
||||||
a =
|
a =
|
||||||
12
|
12
|
||||||
|
|
||||||
a +=
|
a +=
|
||||||
12
|
12
|
||||||
|
|
||||||
a -=
|
a -=
|
||||||
12
|
12
|
||||||
|
|
||||||
a *=
|
a *=
|
||||||
12
|
12
|
||||||
|
|
||||||
a /=
|
a /=
|
||||||
12
|
12
|
||||||
|
|
||||||
a is
|
a is
|
||||||
String
|
String
|
||||||
@@ -35,4 +35,5 @@ fun test() {
|
|||||||
1..2
|
1..2
|
||||||
}
|
}
|
||||||
|
|
||||||
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -35,4 +35,5 @@ fun test() {
|
|||||||
1..2
|
1..2
|
||||||
}
|
}
|
||||||
|
|
||||||
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
var a: Any? = null
|
||||||
|
var b: Any? = null
|
||||||
|
|
||||||
|
var i = 0
|
||||||
|
var j = 0
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
a1 =
|
||||||
|
1
|
||||||
|
|
||||||
|
a =
|
||||||
|
b
|
||||||
|
|
||||||
|
a =
|
||||||
|
"Some"
|
||||||
|
|
||||||
|
i +=
|
||||||
|
j * j
|
||||||
|
|
||||||
|
i =
|
||||||
|
j ?: 0
|
||||||
|
|
||||||
|
i -=
|
||||||
|
j
|
||||||
|
|
||||||
|
i *=
|
||||||
|
0
|
||||||
|
|
||||||
|
i %=
|
||||||
|
5
|
||||||
|
|
||||||
|
i /=
|
||||||
|
2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
var a: Any? = null
|
||||||
|
var b: Any? = null
|
||||||
|
|
||||||
|
var i = 0
|
||||||
|
var j = 0
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
a1 =
|
||||||
|
1
|
||||||
|
|
||||||
|
a =
|
||||||
|
b
|
||||||
|
|
||||||
|
a =
|
||||||
|
"Some"
|
||||||
|
|
||||||
|
i +=
|
||||||
|
j * j
|
||||||
|
|
||||||
|
i =
|
||||||
|
j ?: 0
|
||||||
|
|
||||||
|
i -=
|
||||||
|
j
|
||||||
|
|
||||||
|
i *=
|
||||||
|
0
|
||||||
|
|
||||||
|
i %=
|
||||||
|
5
|
||||||
|
|
||||||
|
i /=
|
||||||
|
2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
var a: Any? = null
|
||||||
|
var b: Any? = null
|
||||||
|
|
||||||
|
var i = 0
|
||||||
|
var j = 0
|
||||||
|
|
||||||
|
fun test() {
|
||||||
|
a1 =
|
||||||
|
1
|
||||||
|
|
||||||
|
a =
|
||||||
|
b
|
||||||
|
|
||||||
|
a =
|
||||||
|
"Some"
|
||||||
|
|
||||||
|
i +=
|
||||||
|
j * j
|
||||||
|
|
||||||
|
i =
|
||||||
|
j ?: 0
|
||||||
|
|
||||||
|
i -=
|
||||||
|
j
|
||||||
|
|
||||||
|
i *=
|
||||||
|
0
|
||||||
|
|
||||||
|
i %=
|
||||||
|
5
|
||||||
|
|
||||||
|
i /=
|
||||||
|
2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_FALSE: CONTINUATION_INDENT_FOR_EXPRESSION_BODIES
|
||||||
@@ -171,6 +171,11 @@ public class FormatterTestGenerated extends AbstractFormatterTest {
|
|||||||
runTest("idea/testData/formatter/CommentInFunctionLiteral.after.kt");
|
runTest("idea/testData/formatter/CommentInFunctionLiteral.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ContinuationIndentInAssigments.after.kt")
|
||||||
|
public void testContinuationIndentInAssigments() throws Exception {
|
||||||
|
runTest("idea/testData/formatter/ContinuationIndentInAssigments.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("ContinuationIndentInParameterLists.after.kt")
|
@TestMetadata("ContinuationIndentInParameterLists.after.kt")
|
||||||
public void testContinuationIndentInParameterLists() throws Exception {
|
public void testContinuationIndentInParameterLists() throws Exception {
|
||||||
runTest("idea/testData/formatter/ContinuationIndentInParameterLists.after.kt");
|
runTest("idea/testData/formatter/ContinuationIndentInParameterLists.after.kt");
|
||||||
@@ -1136,6 +1141,11 @@ public class FormatterTestGenerated extends AbstractFormatterTest {
|
|||||||
runTest("idea/testData/formatter/ContinuationIndentForExpressionBodies.after.inv.kt");
|
runTest("idea/testData/formatter/ContinuationIndentForExpressionBodies.after.inv.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("ContinuationIndentInAssigments.after.inv.kt")
|
||||||
|
public void testContinuationIndentInAssigments() throws Exception {
|
||||||
|
runTest("idea/testData/formatter/ContinuationIndentInAssigments.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("DelegationList.after.inv.kt")
|
@TestMetadata("DelegationList.after.inv.kt")
|
||||||
public void testDelegationList() throws Exception {
|
public void testDelegationList() throws Exception {
|
||||||
runTest("idea/testData/formatter/DelegationList.after.inv.kt");
|
runTest("idea/testData/formatter/DelegationList.after.inv.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user