Fix problem with alignment in assignments and other binary expressions
This commit is contained in:
@@ -53,7 +53,11 @@ public class JetBlock extends AbstractBlock {
|
|||||||
|
|
||||||
private List<Block> mySubBlocks;
|
private List<Block> mySubBlocks;
|
||||||
|
|
||||||
|
private static final TokenSet BINARY_EXPRESSIONS = TokenSet.create(BINARY_EXPRESSION, BINARY_WITH_TYPE, IS_EXPRESSION);
|
||||||
private static final TokenSet QUALIFIED_OPERATION = TokenSet.create(DOT, SAFE_ACCESS);
|
private static final TokenSet QUALIFIED_OPERATION = TokenSet.create(DOT, SAFE_ACCESS);
|
||||||
|
private static final TokenSet ALIGN_FOR_BINARY_OPERATIONS =
|
||||||
|
TokenSet.create(MUL, DIV, PERC, PLUS, MINUS, ELVIS, LT, GT, LTEQ, GTEQ, ANDAND, OROR);
|
||||||
|
|
||||||
private static final TokenSet CODE_BLOCKS = TokenSet.create(
|
private static final TokenSet CODE_BLOCKS = TokenSet.create(
|
||||||
BLOCK,
|
BLOCK,
|
||||||
CLASS_BODY,
|
CLASS_BODY,
|
||||||
@@ -229,7 +233,7 @@ public class JetBlock extends AbstractBlock {
|
|||||||
else if (parentType == WHEN) {
|
else if (parentType == WHEN) {
|
||||||
return getAlignmentForCaseBranch(jetSettings.ALIGN_IN_COLUMNS_CASE_BRANCH);
|
return getAlignmentForCaseBranch(jetSettings.ALIGN_IN_COLUMNS_CASE_BRANCH);
|
||||||
}
|
}
|
||||||
else if (parentType == BINARY_EXPRESSION) {
|
else if (BINARY_EXPRESSIONS.contains(parentType) && ALIGN_FOR_BINARY_OPERATIONS.contains(getOperationType(getNode()))) {
|
||||||
return NodeAlignmentStrategy.fromTypes(AlignmentStrategy.wrap(
|
return NodeAlignmentStrategy.fromTypes(AlignmentStrategy.wrap(
|
||||||
createAlignment(jetCommonSettings.ALIGN_MULTILINE_BINARY_OPERATION, getAlignment())));
|
createAlignment(jetCommonSettings.ALIGN_MULTILINE_BINARY_OPERATION, getAlignment())));
|
||||||
}
|
}
|
||||||
@@ -352,7 +356,7 @@ public class JetBlock extends AbstractBlock {
|
|||||||
.set(Indent.getContinuationIndent(false)),
|
.set(Indent.getContinuationIndent(false)),
|
||||||
|
|
||||||
strategy("Binary expressions")
|
strategy("Binary expressions")
|
||||||
.in(BINARY_EXPRESSION)
|
.in(BINARY_EXPRESSIONS)
|
||||||
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
.set(Indent.getContinuationWithoutFirstIndent(false)),
|
||||||
|
|
||||||
strategy("Parenthesized expression")
|
strategy("Parenthesized expression")
|
||||||
@@ -434,4 +438,10 @@ public class JetBlock extends AbstractBlock {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static IElementType getOperationType(ASTNode node) {
|
||||||
|
ASTNode operationNode = node.findChildByType(OPERATION_REFERENCE);
|
||||||
|
return operationNode != null ? operationNode.getFirstChildNode().getElementType() : null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,10 +19,12 @@ package org.jetbrains.jet.plugin.formatter;
|
|||||||
import com.intellij.formatting.Indent;
|
import com.intellij.formatting.Indent;
|
||||||
import com.intellij.lang.ASTNode;
|
import com.intellij.lang.ASTNode;
|
||||||
import com.intellij.psi.tree.IElementType;
|
import com.intellij.psi.tree.IElementType;
|
||||||
|
import com.intellij.psi.tree.TokenSet;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -77,6 +79,16 @@ public abstract class NodeIndentStrategy {
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public PositionStrategy in(@NotNull TokenSet parents) {
|
||||||
|
IElementType[] types = parents.getTypes();
|
||||||
|
if (types.length == 0) {
|
||||||
|
throw new IllegalArgumentException("Empty token set is unexpected");
|
||||||
|
}
|
||||||
|
|
||||||
|
fillTypes(in, types[0], Arrays.copyOfRange(types, 1, types.length));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
public PositionStrategy in(@NotNull IElementType parentType, @NotNull IElementType... orParentTypes) {
|
public PositionStrategy in(@NotNull IElementType parentType, @NotNull IElementType... orParentTypes) {
|
||||||
fillTypes(in, parentType, orParentTypes);
|
fillTypes(in, parentType, orParentTypes);
|
||||||
return this;
|
return this;
|
||||||
|
|||||||
@@ -0,0 +1,41 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 12
|
||||||
|
|
||||||
|
a =
|
||||||
|
12
|
||||||
|
|
||||||
|
a +=
|
||||||
|
12
|
||||||
|
|
||||||
|
a -=
|
||||||
|
12
|
||||||
|
|
||||||
|
a *=
|
||||||
|
12
|
||||||
|
|
||||||
|
a /=
|
||||||
|
12
|
||||||
|
|
||||||
|
a is
|
||||||
|
String
|
||||||
|
|
||||||
|
a !is
|
||||||
|
String
|
||||||
|
|
||||||
|
a as
|
||||||
|
String
|
||||||
|
|
||||||
|
a as?
|
||||||
|
String
|
||||||
|
|
||||||
|
a :
|
||||||
|
String
|
||||||
|
|
||||||
|
a in
|
||||||
|
1..2
|
||||||
|
|
||||||
|
a !in
|
||||||
|
1..2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 12
|
||||||
|
|
||||||
|
a =
|
||||||
|
12
|
||||||
|
|
||||||
|
a +=
|
||||||
|
12
|
||||||
|
|
||||||
|
a -=
|
||||||
|
12
|
||||||
|
|
||||||
|
a *=
|
||||||
|
12
|
||||||
|
|
||||||
|
a /=
|
||||||
|
12
|
||||||
|
|
||||||
|
a is
|
||||||
|
String
|
||||||
|
|
||||||
|
a !is
|
||||||
|
String
|
||||||
|
|
||||||
|
a as
|
||||||
|
String
|
||||||
|
|
||||||
|
a as?
|
||||||
|
String
|
||||||
|
|
||||||
|
a :
|
||||||
|
String
|
||||||
|
|
||||||
|
a in
|
||||||
|
1..2
|
||||||
|
|
||||||
|
a !in
|
||||||
|
1..2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 12
|
||||||
|
|
||||||
|
a =
|
||||||
|
12
|
||||||
|
|
||||||
|
a +=
|
||||||
|
12
|
||||||
|
|
||||||
|
a -=
|
||||||
|
12
|
||||||
|
|
||||||
|
a *=
|
||||||
|
12
|
||||||
|
|
||||||
|
a /=
|
||||||
|
12
|
||||||
|
|
||||||
|
a is
|
||||||
|
String
|
||||||
|
|
||||||
|
a !is
|
||||||
|
String
|
||||||
|
|
||||||
|
a as
|
||||||
|
String
|
||||||
|
|
||||||
|
a as?
|
||||||
|
String
|
||||||
|
|
||||||
|
a :
|
||||||
|
String
|
||||||
|
|
||||||
|
a in
|
||||||
|
1..2
|
||||||
|
|
||||||
|
a !in
|
||||||
|
1..2
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
fun test(a: Int?) {
|
||||||
|
a ?: 42
|
||||||
|
|
||||||
|
a ?: 42
|
||||||
|
|
||||||
|
a ?:
|
||||||
|
42
|
||||||
|
|
||||||
|
a
|
||||||
|
?: 42
|
||||||
|
|
||||||
|
val some = a ?:
|
||||||
|
b ?:
|
||||||
|
12
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -4,8 +4,14 @@ fun test(a: Int?) {
|
|||||||
a ?: 42
|
a ?: 42
|
||||||
|
|
||||||
a ?:
|
a ?:
|
||||||
42
|
42
|
||||||
|
|
||||||
a
|
a
|
||||||
?: 42
|
?: 42
|
||||||
}
|
|
||||||
|
val some = a ?:
|
||||||
|
b ?:
|
||||||
|
12
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -8,4 +8,10 @@ fun test(a: Int?) {
|
|||||||
|
|
||||||
a
|
a
|
||||||
?: 42
|
?: 42
|
||||||
}
|
|
||||||
|
val some = a ?:
|
||||||
|
b ?:
|
||||||
|
12
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a =
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a =
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a = <caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a as
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a as
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
var a = 1
|
||||||
|
a as <caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
1 is
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fun test() {
|
||||||
|
1 is
|
||||||
|
<caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -0,0 +1,5 @@
|
|||||||
|
fun test() {
|
||||||
|
1 is <caret>
|
||||||
|
}
|
||||||
|
|
||||||
|
// SET_TRUE: ALIGN_MULTILINE_BINARY_OPERATION
|
||||||
@@ -54,6 +54,11 @@ public class JetFormatterTestGenerated extends AbstractJetFormatterTest {
|
|||||||
doTest("idea/testData/formatter/BinaryExpressionsBoolean.after.kt");
|
doTest("idea/testData/formatter/BinaryExpressionsBoolean.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("BinaryExpressionsWithoutAlignment.after.kt")
|
||||||
|
public void testBinaryExpressionsWithoutAlignment() throws Exception {
|
||||||
|
doTest("idea/testData/formatter/BinaryExpressionsWithoutAlignment.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("BlockFor.after.kt")
|
@TestMetadata("BlockFor.after.kt")
|
||||||
public void testBlockFor() throws Exception {
|
public void testBlockFor() throws Exception {
|
||||||
doTest("idea/testData/formatter/BlockFor.after.kt");
|
doTest("idea/testData/formatter/BlockFor.after.kt");
|
||||||
@@ -479,6 +484,11 @@ public class JetFormatterTestGenerated extends AbstractJetFormatterTest {
|
|||||||
doTestInverted("idea/testData/formatter/BinaryExpressionsBoolean.after.inv.kt");
|
doTestInverted("idea/testData/formatter/BinaryExpressionsBoolean.after.inv.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("BinaryExpressionsWithoutAlignment.after.inv.kt")
|
||||||
|
public void testBinaryExpressionsWithoutAlignment() throws Exception {
|
||||||
|
doTestInverted("idea/testData/formatter/BinaryExpressionsWithoutAlignment.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("CatchFinallyOnNewLine.after.inv.kt")
|
@TestMetadata("CatchFinallyOnNewLine.after.inv.kt")
|
||||||
public void testCatchFinallyOnNewLine() throws Exception {
|
public void testCatchFinallyOnNewLine() throws Exception {
|
||||||
doTestInverted("idea/testData/formatter/CatchFinallyOnNewLine.after.inv.kt");
|
doTestInverted("idea/testData/formatter/CatchFinallyOnNewLine.after.inv.kt");
|
||||||
@@ -509,6 +519,11 @@ public class JetFormatterTestGenerated extends AbstractJetFormatterTest {
|
|||||||
doTestInverted("idea/testData/formatter/ElseOnNewLine.after.inv.kt");
|
doTestInverted("idea/testData/formatter/ElseOnNewLine.after.inv.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("Elvis.after.inv.kt")
|
||||||
|
public void testElvis() throws Exception {
|
||||||
|
doTestInverted("idea/testData/formatter/Elvis.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("EmptyBlocks.after.inv.kt")
|
@TestMetadata("EmptyBlocks.after.inv.kt")
|
||||||
public void testEmptyBlocks() throws Exception {
|
public void testEmptyBlocks() throws Exception {
|
||||||
doTestInverted("idea/testData/formatter/EmptyBlocks.after.inv.kt");
|
doTestInverted("idea/testData/formatter/EmptyBlocks.after.inv.kt");
|
||||||
|
|||||||
@@ -61,7 +61,19 @@ public class JetTypingIndentationTestBaseGenerated extends AbstractJetTypingInde
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testAllFilesPresentInDirectSettings() throws Exception {
|
public void testAllFilesPresentInDirectSettings() throws Exception {
|
||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/indentationOnNewline"), Pattern.compile("^([^\\.]+)\\.after\\.kt.*$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage",
|
||||||
|
new File("idea/testData/indentationOnNewline"),
|
||||||
|
Pattern.compile("^([^\\.]+)\\.after\\.kt.*$"), true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AssignmentAfterEq.after.kt")
|
||||||
|
public void testAssignmentAfterEq() throws Exception {
|
||||||
|
doNewlineTest("idea/testData/indentationOnNewline/AssignmentAfterEq.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("BinaryWithTypeExpressions.after.kt")
|
||||||
|
public void testBinaryWithTypeExpressions() throws Exception {
|
||||||
|
doNewlineTest("idea/testData/indentationOnNewline/BinaryWithTypeExpressions.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@TestMetadata("ConsecutiveCallsAfterDot.after.kt")
|
@TestMetadata("ConsecutiveCallsAfterDot.after.kt")
|
||||||
@@ -204,6 +216,11 @@ public class JetTypingIndentationTestBaseGenerated extends AbstractJetTypingInde
|
|||||||
doNewlineTest("idea/testData/indentationOnNewline/InMultilineLambdaAfterArrow.after.kt");
|
doNewlineTest("idea/testData/indentationOnNewline/InMultilineLambdaAfterArrow.after.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("IsExpressionAfterIs.after.kt")
|
||||||
|
public void testIsExpressionAfterIs() throws Exception {
|
||||||
|
doNewlineTest("idea/testData/indentationOnNewline/IsExpressionAfterIs.after.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("MultideclarationAfterEq.after.kt")
|
@TestMetadata("MultideclarationAfterEq.after.kt")
|
||||||
public void testMultideclarationAfterEq() throws Exception {
|
public void testMultideclarationAfterEq() throws Exception {
|
||||||
doNewlineTest("idea/testData/indentationOnNewline/MultideclarationAfterEq.after.kt");
|
doNewlineTest("idea/testData/indentationOnNewline/MultideclarationAfterEq.after.kt");
|
||||||
@@ -282,6 +299,16 @@ public class JetTypingIndentationTestBaseGenerated extends AbstractJetTypingInde
|
|||||||
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/indentationOnNewline"), Pattern.compile("^([^\\.]+)\\.after\\.inv\\.kt.*$"), true);
|
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.TestsPackage", new File("idea/testData/indentationOnNewline"), Pattern.compile("^([^\\.]+)\\.after\\.inv\\.kt.*$"), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("AssignmentAfterEq.after.inv.kt")
|
||||||
|
public void testAssignmentAfterEq() throws Exception {
|
||||||
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/AssignmentAfterEq.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
|
@TestMetadata("BinaryWithTypeExpressions.after.inv.kt")
|
||||||
|
public void testBinaryWithTypeExpressions() throws Exception {
|
||||||
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/BinaryWithTypeExpressions.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("InBinaryExpressionInMiddle.after.inv.kt")
|
@TestMetadata("InBinaryExpressionInMiddle.after.inv.kt")
|
||||||
public void testInBinaryExpressionInMiddle() throws Exception {
|
public void testInBinaryExpressionInMiddle() throws Exception {
|
||||||
doNewlineTestWithInvert("idea/testData/indentationOnNewline/InBinaryExpressionInMiddle.after.inv.kt");
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/InBinaryExpressionInMiddle.after.inv.kt");
|
||||||
@@ -337,6 +364,11 @@ public class JetTypingIndentationTestBaseGenerated extends AbstractJetTypingInde
|
|||||||
doNewlineTestWithInvert("idea/testData/indentationOnNewline/InExpressionsParenthesesBeforeOperand.after.inv.kt");
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/InExpressionsParenthesesBeforeOperand.after.inv.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("IsExpressionAfterIs.after.inv.kt")
|
||||||
|
public void testIsExpressionAfterIs() throws Exception {
|
||||||
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/IsExpressionAfterIs.after.inv.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("SettingAlignMultilineParametersInCalls.after.inv.kt")
|
@TestMetadata("SettingAlignMultilineParametersInCalls.after.inv.kt")
|
||||||
public void testSettingAlignMultilineParametersInCalls() throws Exception {
|
public void testSettingAlignMultilineParametersInCalls() throws Exception {
|
||||||
doNewlineTestWithInvert("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.after.inv.kt");
|
doNewlineTestWithInvert("idea/testData/indentationOnNewline/SettingAlignMultilineParametersInCalls.after.inv.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user