From b59ac4105d53fa34efaffe97d5028a2a149e356b Mon Sep 17 00:00:00 2001 From: Yaroslav Lepenkin Date: Tue, 25 Aug 2015 11:45:52 +0300 Subject: [PATCH] Pass alignment strategy into PsiCodeBlock blocks, in order to align consecutive variable declarations inside code blocks (if/for/try/...). Fixes IDEA-143834 --- .../psi/formatter/java/AbstractJavaBlock.java | 5 +- .../psi/formatter/java/CodeBlockBlock.java | 30 +------- .../java/JavaFormatterAlignmentTest.java | 76 +++++++++++++++++++ 3 files changed, 83 insertions(+), 28 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 c26f17712cdc..d4f1a12ccba8 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 @@ -1213,14 +1213,15 @@ public abstract class AbstractJavaBlock extends AbstractBlock implements JavaBlo return null; } - private ChildAlignmentStrategyProvider getStrategyProvider() { + protected ChildAlignmentStrategyProvider getStrategyProvider() { if (mySettings.ALIGN_GROUP_FIELD_DECLARATIONS && myNode.getElementType() == JavaElementType.CLASS) { return new SubsequentFieldAligner(mySettings); } ASTNode parent = myNode.getTreeParent(); IElementType parentType = parent != null ? parent.getElementType() : null; - if (mySettings.ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS && parentType == JavaElementType.METHOD) { + if (mySettings.ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS + && (parentType == JavaElementType.METHOD || myNode instanceof PsiCodeBlock)) { return new SubsequentVariablesAligner(); } diff --git a/java/java-impl/src/com/intellij/psi/formatter/java/CodeBlockBlock.java b/java/java-impl/src/com/intellij/psi/formatter/java/CodeBlockBlock.java index 20d387fad3c1..845f8bf3a603 100644 --- a/java/java-impl/src/com/intellij/psi/formatter/java/CodeBlockBlock.java +++ b/java/java-impl/src/com/intellij/psi/formatter/java/CodeBlockBlock.java @@ -18,11 +18,7 @@ package com.intellij.psi.formatter.java; import com.intellij.formatting.*; import com.intellij.formatting.alignment.AlignmentStrategy; import com.intellij.lang.ASTNode; -import com.intellij.openapi.util.text.StringUtil; -import com.intellij.psi.JavaTokenType; -import com.intellij.psi.PsiClass; -import com.intellij.psi.PsiSyntheticClass; -import com.intellij.psi.TokenType; +import com.intellij.psi.*; import com.intellij.psi.codeStyle.CommonCodeStyleSettings; import com.intellij.psi.codeStyle.JavaCodeStyleSettings; import com.intellij.psi.formatter.FormatterUtil; @@ -115,8 +111,10 @@ public class CodeBlockBlock extends AbstractJavaBlock { state = INSIDE_BODY; } + ChildAlignmentStrategyProvider provider = getStrategyProvider(); while (child != null) { if (!FormatterUtil.containsWhiteSpacesOnly(child) && child.getTextLength() > 0) { + AlignmentStrategy alignmentStrategy = provider.getNextChildStrategy(child); final Indent indent = calcCurrentIndent(child, state); state = calcNewState(child, state); @@ -132,7 +130,7 @@ public class CodeBlockBlock extends AbstractJavaBlock { child = composeCodeBlock(result, child, indent, myChildrenIndent, childWrap); } else { - child = processChild(result, child, chooseAlignment(child, childAlignment), childWrap, indent); + child = processChild(result, child, alignmentStrategy, childWrap, indent); } } if (child != null) { @@ -141,26 +139,6 @@ public class CodeBlockBlock extends AbstractJavaBlock { } } - @Nullable - private Alignment chooseAlignment(@NotNull ASTNode child, @Nullable Alignment defaultAlignment) { - if (defaultAlignment != null) { - return defaultAlignment; - } - // Take special care about anonymous classes. - if (child.getElementType() != JavaTokenType.RBRACE) { - return defaultAlignment; - } - final ASTNode parent = child.getTreeParent(); - if (parent == null || parent.getElementType() != JavaElementType.ANONYMOUS_CLASS) { - return defaultAlignment; - } - final ASTNode whiteSpaceCandidate = parent.getTreePrev(); - if (whiteSpaceCandidate == null || whiteSpaceCandidate.getElementType() != TokenType.WHITE_SPACE) { - return defaultAlignment; - } - return StringUtil.countNewLines(whiteSpaceCandidate.getChars()) > 0 ? myAlignment : defaultAlignment; - } - @Nullable private ASTNode processCaseAndStatementAfter(final ArrayList result, ASTNode child, 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 939d28a8fdee..dadf7fbf590f 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 @@ -657,4 +657,80 @@ public class JavaFormatterAlignmentTest extends AbstractJavaFormatterTest { "}" ); } + + public void test_Align_ConsecutiveVars_InsideIfBlock() { + getSettings().ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS = true; + doMethodTest( + "if (a > 2) {\n" + + "int a=2;\n" + + "String name=\"Yarik\";\n" + + "}\n", + "if (a > 2) {\n" + + " int a = 2;\n" + + " String name = \"Yarik\";\n" + + "}\n" + ); + } + + public void test_Align_ConsecutiveVars_InsideForBlock() { + getSettings().ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS = true; + doMethodTest( + " for (int i = 0; i < 10; i++) {\n" + + " int a=2;\n" + + " String name=\"Xa\";\n" + + " }\n", + "for (int i = 0; i < 10; i++) {\n" + + " int a = 2;\n" + + " String name = \"Xa\";\n" + + "}\n" + ); + } + + public void test_Align_ConsecutiveVars_InsideTryBlock() { + getSettings().ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS = true; + doMethodTest( + " try {\n" + + " int x = getX();\n" + + " String name = \"Ha\";\n" + + " }\n" + + " catch (IOException exception) {\n" + + " int y = 12;\n" + + " String test = \"Test\";\n" + + " }\n" + + " finally {\n" + + " int z = 12;\n" + + " String zzzz = \"pnmhd\";\n" + + " }\n", + "try {\n" + + " int x = getX();\n" + + " String name = \"Ha\";\n" + + "} catch (IOException exception) {\n" + + " int y = 12;\n" + + " String test = \"Test\";\n" + + "} finally {\n" + + " int z = 12;\n" + + " String zzzz = \"pnmhd\";\n" + + "}\n" + ); + } + + public void test_Align_ConsecutiveVars_InsideCodeBlock() { + getSettings().ALIGN_CONSECUTIVE_VARIABLE_DECLARATIONS = true; + doMethodTest( + " System.out.println(\"AAAA\");\n" + + " int a = 2;\n" + + " \n" + + " {\n" + + " int x=2;\n" + + " String name=3;\n" + + " }\n", + "System.out.println(\"AAAA\");\n" + + "int a = 2;\n" + + "\n" + + "{\n" + + " int x = 2;\n" + + " String name = 3;\n" + + "}\n" + ); + } }