From f23c29cd759e70e931da0e6d98da2fd86de7d0db Mon Sep 17 00:00:00 2001 From: Denis Zhdanov Date: Thu, 27 May 2010 11:21:35 +0400 Subject: [PATCH] IDEA-55306 Align when multiline for parenthesized expressions works weirdly for anonymous classes as parameters Dedicated formatting option for multiline method brackets alignment is introduced. 'Align multiline parenthesized expressions' used before that but it caused wierd formatting at some use-cases. --- .../psi/formatter/java/AbstractJavaBlock.java | 9 ++++++++- .../psi/formatter/java/AlignMultiLine_after.java | 2 +- .../testData/psi/formatter/java/IfElse_after.java | 2 +- .../formatter/java/JavaFormatterAlignmentTest.java | 14 +++++++++++++- .../intellij/psi/codeStyle/CodeStyleSettings.java | 1 + .../codeStyle/CodeStyleIndentAndBracesPanel.java | 7 +++++++ .../src/messages/ApplicationBundle.properties | 1 + 7 files changed, 32 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java index b6ca0fee6d8b..7ebe012eb2de 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/AbstractJavaBlock.java @@ -953,7 +953,14 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo AlignmentStrategy alignmentStrategy = AlignmentStrategy.wrap(createAlignment(doAlign, null), ElementType.COMMA); setChildIndent(internalIndent); setChildAlignment(alignmentStrategy.getAlignment(null)); - Alignment bracketAlignment = mySettings.ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION ? Alignment.createAlignment() : null; + boolean methodParametersBlock = true; + ASTNode lBracketParent = child.getTreeParent(); + if (lBracketParent != null) { + ASTNode methodCandidate = lBracketParent.getTreeParent(); + methodParametersBlock = methodCandidate != null && (methodCandidate.getElementType() == JavaElementType.METHOD + || methodCandidate.getElementType() == JavaElementType.METHOD_CALL_EXPRESSION); + } + Alignment bracketAlignment = methodParametersBlock && mySettings.ALIGN_MULTILINE_METHOD_BRACKETS ? Alignment.createAlignment() : null; boolean isAfterIncomplete = false; diff --git a/java/java-tests/testData/psi/formatter/java/AlignMultiLine_after.java b/java/java-tests/testData/psi/formatter/java/AlignMultiLine_after.java index 0df2999f30e3..16f3917242ca 100644 --- a/java/java-tests/testData/psi/formatter/java/AlignMultiLine_after.java +++ b/java/java-tests/testData/psi/formatter/java/AlignMultiLine_after.java @@ -3,6 +3,6 @@ class Foo { public void foo() { int someVariable = (y + z - ); + ); } } \ No newline at end of file diff --git a/java/java-tests/testData/psi/formatter/java/IfElse_after.java b/java/java-tests/testData/psi/formatter/java/IfElse_after.java index 12a4d8e82910..30731341d60c 100644 --- a/java/java-tests/testData/psi/formatter/java/IfElse_after.java +++ b/java/java-tests/testData/psi/formatter/java/IfElse_after.java @@ -14,7 +14,7 @@ public class Foo { if (x < 0) { int someVariable = (y + z - ); + ); someVariable = x = x + y; diff --git a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java index dc770eddce3b..85d00cb23db1 100644 --- a/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java +++ b/java/java-tests/testSrc/com/intellij/psi/formatter/java/JavaFormatterAlignmentTest.java @@ -109,7 +109,8 @@ public class JavaFormatterAlignmentTest extends AbstractJavaFormatterTest { public void testMethodBrackets() throws Exception { // Inspired by IDEA-53013 - getSettings().ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION = true; + getSettings().ALIGN_MULTILINE_METHOD_BRACKETS = true; + getSettings().ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION = false; getSettings().ALIGN_MULTILINE_PARAMETERS = true; getSettings().ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; getSettings().CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = true; @@ -136,6 +137,17 @@ public class JavaFormatterAlignmentTest extends AbstractJavaFormatterTest { " );\n" + "}" ); + + // Inspired by IDEA-55306 + getSettings().ALIGN_MULTILINE_METHOD_BRACKETS = false; + getSettings().CALL_PARAMETERS_RPAREN_ON_NEXT_LINE = false; + String method = + "executeCommand(new Command() {\n" + + " public Boolean run() throws ExecutionException {\n" + + " return doInterrupt();\n" + + " }\n" + + "});"; + doMethodTest(method, method); } public void testVariableDeclarationAlignment() { diff --git a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java index 29dbaf3d4f42..a3a4de778af6 100644 --- a/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java +++ b/platform/lang-api/src/com/intellij/psi/codeStyle/CodeStyleSettings.java @@ -426,6 +426,7 @@ public class CodeStyleSettings implements Cloneable, JDOMExternalizable { public boolean ALIGN_MULTILINE_THROWS_LIST = false; public boolean ALIGN_MULTILINE_EXTENDS_LIST = false; + public boolean ALIGN_MULTILINE_METHOD_BRACKETS = false; public boolean ALIGN_MULTILINE_PARENTHESIZED_EXPRESSION = false; public boolean ALIGN_MULTILINE_ARRAY_INITIALIZER_EXPRESSION = false; diff --git a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleIndentAndBracesPanel.java b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleIndentAndBracesPanel.java index 3189739d00fe..eddae7a798ae 100644 --- a/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleIndentAndBracesPanel.java +++ b/platform/lang-impl/src/com/intellij/application/options/codeStyle/CodeStyleIndentAndBracesPanel.java @@ -73,6 +73,7 @@ public class CodeStyleIndentAndBracesPanel extends MultilanguageCodeStyleAbstrac private JCheckBox myAlignChainedMethods; private JCheckBox myAlignDeclarationParameters; private JCheckBox myAlignCallParameters; + private JCheckBox myAlignMethodBrackets; private JCheckBox myAlignExtendsList; private JCheckBox myAlignForStatement; private JCheckBox myAlignThrowsList; @@ -206,6 +207,9 @@ public class CodeStyleIndentAndBracesPanel extends MultilanguageCodeStyleAbstrac myAlignCallParameters = createCheckBox(ApplicationBundle.message("checkbox.align.multiline.call.arguments")); optionGroup.add(myAlignCallParameters); + myAlignMethodBrackets = createCheckBox(ApplicationBundle.message("checkbox.align.multiline.method.brackets")); + optionGroup.add(myAlignMethodBrackets); + myAlignExtendsList = createCheckBox(ApplicationBundle.message("checkbox.align.multiline.extends.list")); optionGroup.add(myAlignExtendsList); @@ -325,6 +329,7 @@ public class CodeStyleIndentAndBracesPanel extends MultilanguageCodeStyleAbstrac isModified |= isModified(myAlignAssignment, settings.ALIGN_MULTILINE_ASSIGNMENT); isModified |= isModified(myAlignBinaryExpression, settings.ALIGN_MULTILINE_BINARY_OPERATION); isModified |= isModified(myAlignCallParameters, settings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS); + isModified |= isModified(myAlignMethodBrackets, settings.ALIGN_MULTILINE_METHOD_BRACKETS); isModified |= isModified(myAlignDeclarationParameters, settings.ALIGN_MULTILINE_PARAMETERS); isModified |= isModified(myAlignExtendsList, settings.ALIGN_MULTILINE_EXTENDS_LIST); isModified |= isModified(myAlignForStatement, settings.ALIGN_MULTILINE_FOR); @@ -370,6 +375,7 @@ public class CodeStyleIndentAndBracesPanel extends MultilanguageCodeStyleAbstrac myAlignAssignment.setSelected(settings.ALIGN_MULTILINE_ASSIGNMENT); myAlignBinaryExpression.setSelected(settings.ALIGN_MULTILINE_BINARY_OPERATION); myAlignCallParameters.setSelected(settings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS); + myAlignMethodBrackets.setSelected(settings.ALIGN_MULTILINE_METHOD_BRACKETS); myAlignChainedMethods.setSelected(settings.ALIGN_MULTILINE_CHAINED_METHODS); myAlignDeclarationParameters.setSelected(settings.ALIGN_MULTILINE_PARAMETERS); myAlignExtendsList.setSelected(settings.ALIGN_MULTILINE_EXTENDS_LIST); @@ -410,6 +416,7 @@ public class CodeStyleIndentAndBracesPanel extends MultilanguageCodeStyleAbstrac settings.ALIGN_MULTILINE_ASSIGNMENT = myAlignAssignment.isSelected(); settings.ALIGN_MULTILINE_BINARY_OPERATION = myAlignBinaryExpression.isSelected(); settings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = myAlignCallParameters.isSelected(); + settings.ALIGN_MULTILINE_METHOD_BRACKETS = myAlignMethodBrackets.isSelected(); settings.ALIGN_MULTILINE_CHAINED_METHODS = myAlignChainedMethods.isSelected(); settings.ALIGN_MULTILINE_PARAMETERS = myAlignDeclarationParameters.isSelected(); settings.ALIGN_MULTILINE_EXTENDS_LIST = myAlignExtendsList.isSelected(); diff --git a/platform/platform-resources-en/src/messages/ApplicationBundle.properties b/platform/platform-resources-en/src/messages/ApplicationBundle.properties index 120012d412c8..da4bde9abbf9 100644 --- a/platform/platform-resources-en/src/messages/ApplicationBundle.properties +++ b/platform/platform-resources-en/src/messages/ApplicationBundle.properties @@ -144,6 +144,7 @@ title.align.when.multiline=Align When Multiline checkbox.align.multiline.chained.methods=Chained methods checkbox.align.multiline.method.parameters=Method parameters checkbox.align.multiline.call.arguments=Call arguments +checkbox.align.multiline.method.brackets=Method brackets checkbox.align.multiline.extends.list=Extends list checkbox.align.multiline.throws.list=Throws list checkbox.align.multiline.fields.variables.groups=Fields/variables groups