diff --git a/python/src/com/jetbrains/python/formatter/PyBlock.java b/python/src/com/jetbrains/python/formatter/PyBlock.java index ba52b5aa8e00..89dbfb394f9e 100644 --- a/python/src/com/jetbrains/python/formatter/PyBlock.java +++ b/python/src/com/jetbrains/python/formatter/PyBlock.java @@ -28,6 +28,7 @@ import static com.jetbrains.python.psi.PyUtil.sure; * @author yole */ public class PyBlock implements ASTBlock { + private final PyBlock myParent; private final Alignment _alignment; private final Indent _indent; private final ASTNode _node; @@ -54,11 +55,13 @@ public class PyBlock implements ASTBlock { PyTokenTypes.LBRACE, PyTokenTypes.RBRACE, PyTokenTypes.LBRACKET, PyTokenTypes.RBRACKET); - public PyBlock(final ASTNode node, + public PyBlock(final PyBlock parent, + final ASTNode node, final Alignment alignment, final Indent indent, final Wrap wrap, final PyBlockContext context) { + myParent = parent; _alignment = alignment; _indent = indent; _node = node; @@ -134,8 +137,13 @@ public class PyBlock implements ASTBlock { } } else if (parentType == PyElementTypes.BINARY_EXPRESSION && - PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens().contains(childType)) { - childAlignment = getAlignmentForChildren(); + (PythonDialectsTokenSetProvider.INSTANCE.getExpressionTokens().contains(childType) || PyTokenTypes.OPERATIONS.contains(childType))) { + if (grandparentType == PyElementTypes.BINARY_EXPRESSION && myParent != null) { + childAlignment = myParent.getAlignmentForChildren(); + } + else { + childAlignment = getAlignmentForChildren(); + } } if (parentType == PyElementTypes.LIST_LITERAL_EXPRESSION) { @@ -190,7 +198,7 @@ public class PyBlock implements ASTBlock { childIndent = Indent.getNormalIndent(); } - return new PyBlock(child, childAlignment, childIndent, wrap, myContext); + return new PyBlock(this, child, childAlignment, childIndent, wrap, myContext); } private static boolean isEmptyList(PsiElement psi) { diff --git a/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java b/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java index c5981bad1fe5..24a2156dd216 100644 --- a/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java +++ b/python/src/com/jetbrains/python/formatter/PythonFormattingModelBuilder.java @@ -35,7 +35,7 @@ public class PythonFormattingModelBuilder implements FormattingModelBuilderEx, C } final CommonCodeStyleSettings codeStyleSettings = settings.getCommonSettings(PythonLanguage.getInstance()); final PyBlockContext context = new PyBlockContext(codeStyleSettings, createSpacingBuilder(settings), mode); - final PyBlock block = new PyBlock(element.getNode(), null, Indent.getNoneIndent(), null, context); + final PyBlock block = new PyBlock(null, element.getNode(), null, Indent.getNoneIndent(), null, context); if (DUMP_FORMATTING_AST) { FormattingModelDumper.dumpFormattingModel(block, 2, System.out); } diff --git a/python/testData/formatter/alignInBinaryExpressions.py b/python/testData/formatter/alignInBinaryExpressions.py new file mode 100644 index 000000000000..457cd4688350 --- /dev/null +++ b/python/testData/formatter/alignInBinaryExpressions.py @@ -0,0 +1,3 @@ +term1 = BNF.lpar + expr + BNF.rpar\ +| if_expr\ +| numeric_value diff --git a/python/testData/formatter/alignInBinaryExpressions_after.py b/python/testData/formatter/alignInBinaryExpressions_after.py new file mode 100644 index 000000000000..086d6282b8e4 --- /dev/null +++ b/python/testData/formatter/alignInBinaryExpressions_after.py @@ -0,0 +1,3 @@ +term1 = BNF.lpar + expr + BNF.rpar\ + | if_expr\ + | numeric_value diff --git a/python/testSrc/com/jetbrains/python/PyFormatterTest.java b/python/testSrc/com/jetbrains/python/PyFormatterTest.java index 9b49b08d2a50..324b7d666b82 100644 --- a/python/testSrc/com/jetbrains/python/PyFormatterTest.java +++ b/python/testSrc/com/jetbrains/python/PyFormatterTest.java @@ -167,6 +167,10 @@ public class PyFormatterTest extends PyTestCase { doTest(); } + public void testAlignInBinaryExpressions() { + doTest(); + } + public void testPsiFormatting() { // IDEA-69724 String initial = "def method_name(\n" +