From a0f385dd27135b2080b697c2a34711fc49e74ad6 Mon Sep 17 00:00:00 2001 From: peter Date: Tue, 23 Feb 2010 21:52:51 +0000 Subject: [PATCH] fix groovy closure formatting when 'align call arguments' is enabled (IDEA-49293) --- .../formatter/GroovyBlockGenerator.java | 67 ++++++++----------- .../GroovyFormattingModelBuilder.java | 4 +- .../groovy/lang/formatter/FormatterTest.java | 5 ++ .../formatter/closureParametersAligned.test | 7 ++ 4 files changed, 43 insertions(+), 40 deletions(-) create mode 100644 plugins/groovy/testdata/groovy/formatter/closureParametersAligned.test diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java index 9d1592b903c9..12a23d5dc015 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyBlockGenerator.java @@ -35,6 +35,7 @@ import org.jetbrains.plugins.groovy.lang.parser.GroovyElementTypes; import org.jetbrains.plugins.groovy.lang.psi.GroovyFileBase; import org.jetbrains.plugins.groovy.lang.psi.api.auxiliary.GrThrowsClause; import org.jetbrains.plugins.groovy.lang.psi.api.statements.arguments.GrArgumentList; +import org.jetbrains.plugins.groovy.lang.psi.api.statements.blocks.GrCodeBlock; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrBinaryExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.expressions.GrConditionalExpression; import org.jetbrains.plugins.groovy.lang.psi.api.statements.params.GrParameterList; @@ -50,10 +51,6 @@ import java.util.List; */ public class GroovyBlockGenerator implements GroovyElementTypes { - private static Alignment myAlignment; - private static Wrap myWrap; - private static CodeStyleSettings mySettings; - private static final TokenSet NESTED = TokenSet.create(REFERENCE_EXPRESSION, PATH_INDEX_PROPERTY, PATH_METHOD_CALL, @@ -61,19 +58,15 @@ public class GroovyBlockGenerator implements GroovyElementTypes { public static List generateSubBlocks(ASTNode node, - Alignment _myAlignment, - Wrap _myWrap, - CodeStyleSettings _mySettings, + Alignment myAlignment, + Wrap myWrap, + CodeStyleSettings mySettings, GroovyBlock block) { - myWrap = _myWrap; - mySettings = _mySettings; - myAlignment = _myAlignment; - //For binary expressions PsiElement blockPsi = block.getNode().getPsi(); if (blockPsi instanceof GrBinaryExpression && !(blockPsi.getParent() instanceof GrBinaryExpression)) { - return generateForBinaryExpr(node); + return generateForBinaryExpr(node, myWrap, mySettings); } //For multiline strings @@ -84,7 +77,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { if (text.length() > 6) { if (text.substring(0, 3).equals("'''") && text.substring(text.length() - 3).equals("'''") || text.substring(0, 3).equals("\"\"\"") & text.substring(text.length() - 3).equals("\"\"\"")) { - return generateForMultiLineString(block.getNode()); + return generateForMultiLineString(block.getNode(), myAlignment, myWrap, mySettings); } } } @@ -94,7 +87,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { String text = block.getNode().getText(); if (text.length() > 3) { if (text.substring(0, 3).equals("\"\"\"")) { - return generateForMultiLineGStringBegin(block.getNode()); + return generateForMultiLineGStringBegin(block.getNode(), myAlignment, myWrap, mySettings); } } @@ -103,7 +96,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { //for gstrings if (block.getNode().getElementType() == GSTRING) { final ArrayList subBlocks = new ArrayList(); - ASTNode children[] = getGroovyChildren(node); + ASTNode[] children = getGroovyChildren(node); ASTNode prevChildNode = null; for (ASTNode childNode : children) { if (childNode.getTextRange().getLength() > 0) { @@ -120,15 +113,15 @@ public class GroovyBlockGenerator implements GroovyElementTypes { blockPsi.getParent() != null && blockPsi.getParent().getNode() != null && !NESTED.contains(blockPsi.getParent().getNode().getElementType())) { - return generateForNestedExpr(node); + return generateForNestedExpr(node, myAlignment, myWrap, mySettings); } // For Parameter lists if (isListLikeClause(blockPsi)) { final ArrayList subBlocks = new ArrayList(); - ASTNode children[] = node.getChildren(null); + ASTNode[] children = node.getChildren(null); ASTNode prevChildNode = null; - final Alignment alignment = mustAlign(blockPsi) ? Alignment.createAlignment() : null; + final Alignment alignment = mustAlign(blockPsi, mySettings) ? Alignment.createAlignment() : null; for (ASTNode childNode : children) { if (canBeCorrectBlock(childNode)) { final Indent indent = GroovyIndentProcessor.getChildIndent(block, prevChildNode, childNode); @@ -141,19 +134,19 @@ public class GroovyBlockGenerator implements GroovyElementTypes { // For other cases final ArrayList subBlocks = new ArrayList(); - ASTNode children[] = getGroovyChildren(node); + ASTNode[] children = getGroovyChildren(node); ASTNode prevChildNode = null; for (ASTNode childNode : children) { if (canBeCorrectBlock(childNode)) { final Indent indent = GroovyIndentProcessor.getChildIndent(block, prevChildNode, childNode); - subBlocks.add(new GroovyBlock(childNode, myAlignment, indent, myWrap, mySettings)); + subBlocks.add(new GroovyBlock(childNode, blockPsi instanceof GrCodeBlock ? null : myAlignment, indent, myWrap, mySettings)); prevChildNode = childNode; } } return subBlocks; } - private static boolean mustAlign(PsiElement blockPsi) { + private static boolean mustAlign(PsiElement blockPsi, CodeStyleSettings mySettings) { return blockPsi instanceof GrParameterList && mySettings.ALIGN_MULTILINE_PARAMETERS || blockPsi instanceof GrExtendsClause && mySettings.ALIGN_MULTILINE_EXTENDS_LIST || blockPsi instanceof GrThrowsClause && mySettings.ALIGN_MULTILINE_THROWS_LIST || @@ -175,7 +168,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { } - private static List generateForMultiLineString(ASTNode node) { + private static List generateForMultiLineString(ASTNode node, Alignment myAlignment, Wrap myWrap, CodeStyleSettings mySettings) { final ArrayList subBlocks = new ArrayList(); final int start = node.getTextRange().getStartOffset(); final int end = node.getTextRange().getEndOffset(); @@ -201,7 +194,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { return subBlocks; } - private static List generateForMultiLineGStringBegin(ASTNode node) { + private static List generateForMultiLineGStringBegin(ASTNode node, Alignment myAlignment, Wrap myWrap, CodeStyleSettings mySettings) { final ArrayList subBlocks = new ArrayList(); final int start = node.getTextRange().getStartOffset(); final int end = node.getTextRange().getEndOffset(); @@ -262,13 +255,13 @@ public class GroovyBlockGenerator implements GroovyElementTypes { * @return * @param node */ - private static List generateForBinaryExpr(final ASTNode node) { + private static List generateForBinaryExpr(final ASTNode node, Wrap myWrap, CodeStyleSettings mySettings) { final ArrayList subBlocks = new ArrayList(); Alignment alignment = mySettings.ALIGN_MULTILINE_BINARY_OPERATION ? Alignment.createAlignment() : null; GrBinaryExpression myExpr = (GrBinaryExpression) node.getPsi(); - ASTNode children[] = node.getChildren(null); + ASTNode[] children = node.getChildren(null); if (myExpr.getLeftOperand() instanceof GrBinaryExpression) { - addBinaryChildrenRecursively(myExpr.getLeftOperand(), subBlocks, Indent.getContinuationWithoutFirstIndent(), alignment); + addBinaryChildrenRecursively(myExpr.getLeftOperand(), subBlocks, Indent.getContinuationWithoutFirstIndent(), alignment, myWrap, mySettings); } for (ASTNode childNode : children) { if (canBeCorrectBlock(childNode) && @@ -277,7 +270,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { } } if (myExpr.getRightOperand() instanceof GrBinaryExpression) { - addBinaryChildrenRecursively(myExpr.getRightOperand(), subBlocks, Indent.getContinuationWithoutFirstIndent(), alignment); + addBinaryChildrenRecursively(myExpr.getRightOperand(), subBlocks, Indent.getContinuationWithoutFirstIndent(), alignment, myWrap, mySettings); } return subBlocks; } @@ -293,14 +286,14 @@ public class GroovyBlockGenerator implements GroovyElementTypes { private static void addBinaryChildrenRecursively(PsiElement elem, List list, Indent indent, - Alignment alignment) { + Alignment alignment, Wrap myWrap, CodeStyleSettings mySettings) { if (elem == null) return; - ASTNode children[] = elem.getNode().getChildren(null); + ASTNode[] children = elem.getNode().getChildren(null); // For binary expressions if ((elem instanceof GrBinaryExpression)) { GrBinaryExpression myExpr = ((GrBinaryExpression) elem); if (myExpr.getLeftOperand() instanceof GrBinaryExpression) { - addBinaryChildrenRecursively(myExpr.getLeftOperand(), list, Indent.getContinuationWithoutFirstIndent(), alignment); + addBinaryChildrenRecursively(myExpr.getLeftOperand(), list, Indent.getContinuationWithoutFirstIndent(), alignment, myWrap, mySettings); } for (ASTNode childNode : children) { if (canBeCorrectBlock(childNode) && @@ -309,7 +302,7 @@ public class GroovyBlockGenerator implements GroovyElementTypes { } } if (myExpr.getRightOperand() instanceof GrBinaryExpression) { - addBinaryChildrenRecursively(myExpr.getRightOperand(), list, Indent.getContinuationWithoutFirstIndent(), alignment); + addBinaryChildrenRecursively(myExpr.getRightOperand(), list, Indent.getContinuationWithoutFirstIndent(), alignment, myWrap, mySettings); } } } @@ -321,11 +314,11 @@ public class GroovyBlockGenerator implements GroovyElementTypes { * @return * @param node */ - private static List generateForNestedExpr(final ASTNode node) { + private static List generateForNestedExpr(final ASTNode node, Alignment myAlignment, Wrap myWrap, CodeStyleSettings mySettings) { final ArrayList subBlocks = new ArrayList(); ASTNode children[] = node.getChildren(null); if (children.length > 0 && NESTED.contains(children[0].getElementType())) { - addNestedChildrenRecursively(children[0].getPsi(), subBlocks, Indent.getContinuationWithoutFirstIndent()); + addNestedChildrenRecursively(children[0].getPsi(), subBlocks, myAlignment, myWrap, mySettings); } else if (canBeCorrectBlock(children[0])) { subBlocks.add(new GroovyBlock(children[0], myAlignment, Indent.getContinuationWithoutFirstIndent(), myWrap, mySettings)); } @@ -345,15 +338,13 @@ public class GroovyBlockGenerator implements GroovyElementTypes { * * @param elem * @param list - * @param indent */ private static void addNestedChildrenRecursively(PsiElement elem, - List list, - Indent indent) { - ASTNode children[] = elem.getNode().getChildren(null); + List list, Alignment myAlignment, Wrap myWrap, CodeStyleSettings mySettings) { + ASTNode[] children = elem.getNode().getChildren(null); // For path expressions if (children.length > 0 && NESTED.contains(children[0].getElementType())) { - addNestedChildrenRecursively(children[0].getPsi(), list, Indent.getContinuationWithoutFirstIndent()); + addNestedChildrenRecursively(children[0].getPsi(), list, myAlignment, myWrap, mySettings); } else if (canBeCorrectBlock(children[0])) { list.add(new GroovyBlock(children[0], myAlignment, Indent.getContinuationWithoutFirstIndent(), myWrap, mySettings)); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyFormattingModelBuilder.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyFormattingModelBuilder.java index 012d2b82197b..838eea2e3aa6 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyFormattingModelBuilder.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/formatter/GroovyFormattingModelBuilder.java @@ -41,8 +41,8 @@ public class GroovyFormattingModelBuilder implements FormattingModelBuilder { assert containingFile != null : element.getContainingFile(); ASTNode astNode = containingFile.getNode(); assert astNode != null; - return FormattingModelProvider.createFormattingModelForPsiFile(containingFile, - new GroovyBlock(astNode, null, Indent.getAbsoluteNoneIndent(), null, settings), settings); + final GroovyBlock block = new GroovyBlock(astNode, null, Indent.getAbsoluteNoneIndent(), null, settings); + return FormattingModelProvider.createFormattingModelForPsiFile(containingFile, block, settings); } @Nullable diff --git a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java index 682367467e52..083c6cdc08a8 100644 --- a/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java +++ b/plugins/groovy/test/org/jetbrains/plugins/groovy/lang/formatter/FormatterTest.java @@ -126,6 +126,11 @@ public class FormatterTest extends GroovyFormatterTestCase { } public void testCaseInSwitchIndented() throws Throwable { doTest(); } + public void testClosureParametersAligned() throws Throwable { + myTempSettings.ALIGN_MULTILINE_PARAMETERS_IN_CALLS = true; + doTest(); + } + public void doTest() throws Throwable { final List data = TestUtils.readInput(getTestDataPath() + getTestName(true) + ".test"); checkFormatting(data.get(0), data.get(1)); diff --git a/plugins/groovy/testdata/groovy/formatter/closureParametersAligned.test b/plugins/groovy/testdata/groovy/formatter/closureParametersAligned.test new file mode 100644 index 000000000000..b245aafb06b2 --- /dev/null +++ b/plugins/groovy/testdata/groovy/formatter/closureParametersAligned.test @@ -0,0 +1,7 @@ + foo({ + println "a" + }) +----- +foo({ + println "a" +}) \ No newline at end of file