From ca643bbb15e62dc82f5d51d911a98f10e3814bdc Mon Sep 17 00:00:00 2001 From: Anton Leherbauer Date: Fri, 13 Aug 2010 10:55:44 +0000 Subject: [PATCH] Bug 314958 - Editor does not format array initializers correctly --- .../formatter/CodeFormatterVisitor.java | 48 +++++++++++++++++-- .../cdt/ui/tests/text/CodeFormatterTest.java | 28 +++++++---- .../corext/util/CodeFormatterUtil.java | 6 +-- 3 files changed, 67 insertions(+), 15 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java index 5127d7fba7e..54ea38b0cba 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java @@ -93,6 +93,7 @@ import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; import org.eclipse.cdt.core.dom.ast.c.ICASTArrayModifier; import org.eclipse.cdt.core.dom.ast.c.ICASTCompositeTypeSpecifier; import org.eclipse.cdt.core.dom.ast.c.ICASTDesignatedInitializer; +import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; import org.eclipse.cdt.core.dom.ast.c.ICASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression; @@ -412,9 +413,9 @@ public class CodeFormatterVisitor extends CPPASTVisitor { if (node instanceof IASTEqualsInitializer) { visit((IASTEqualsInitializer) node); } else if (node instanceof IASTInitializerList) { - visit((IASTInitializerList)node); + visit((IASTInitializerList) node); } else if (node instanceof ICASTDesignatedInitializer) { - formatRaw(node); + visit((ICASTDesignatedInitializer) node); } else { formatRaw(node); } @@ -1973,6 +1974,47 @@ public class CodeFormatterVisitor extends CPPASTVisitor { return PROCESS_SKIP; } + private int visit(ICASTDesignatedInitializer node) { + scribe.printComment(); + ICASTDesignator[] designators = node.getDesignators(); + for (ICASTDesignator designator : designators) { + designator.accept(this); + if (scribe.printComment()) { + scribe.space(); + } + } + + if (peekNextToken() == Token.tASSIGN) { + scribe.printNextToken(Token.tASSIGN, preferences.insert_space_before_assignment_operator); + if (preferences.insert_space_after_assignment_operator) { + scribe.space(); + } + } + + Alignment expressionAlignment= scribe.createAlignment( + "designatedInitializer", //$NON-NLS-1$ + Alignment.M_COMPACT_SPLIT, + 1, + scribe.scanner.getCurrentPosition()); + + scribe.enterAlignment(expressionAlignment); + boolean ok = false; + do { + try { + scribe.alignFragment(expressionAlignment, 0); + + IASTInitializerClause initializer = node.getOperand(); + initializer.accept(this); + + ok = true; + } catch (AlignmentException e) { + scribe.redoAlignment(e); + } + } while (!ok); + scribe.exitAlignment(expressionAlignment, true); + return PROCESS_SKIP; + } + private int visit(IASTInitializerList node) { scribe.printComment(); @@ -2215,7 +2257,7 @@ public class CodeFormatterVisitor extends CPPASTVisitor { scribe.space(); } - node.getSubscriptExpression().accept(this); + node.getArgument().accept(this); scribe.printNextToken(Token.tRBRACKET, preferences.insert_space_before_closing_bracket); return PROCESS_SKIP; diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java index 867bbf608d3..9a743ed8ede 100644 --- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java +++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java @@ -23,6 +23,7 @@ import org.eclipse.jface.text.TextUtilities; import org.eclipse.text.edits.TextEdit; import org.eclipse.cdt.core.CCorePlugin; +import org.eclipse.cdt.core.dom.ast.gnu.c.GCCLanguage; import org.eclipse.cdt.core.formatter.CodeFormatter; import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.cdt.ui.tests.BaseUITestCase; @@ -38,7 +39,7 @@ import org.eclipse.cdt.internal.formatter.align.Alignment; */ public class CodeFormatterTest extends BaseUITestCase { - private Map fOptions; + private Map fOptions; private Map fDefaultOptions; public static TestSuite suite() { @@ -49,7 +50,7 @@ public class CodeFormatterTest extends BaseUITestCase { protected void setUp() throws Exception { super.setUp(); fDefaultOptions= DefaultCodeFormatterOptions.getDefaultSettings().getMap(); - fOptions= new HashMap(fDefaultOptions); + fOptions= new HashMap(fDefaultOptions); } @Override @@ -243,7 +244,7 @@ public class CodeFormatterTest extends BaseUITestCase { // A(); // }; public void testWhiteSmithsAccessSpecifierIndentation1_Bug204575() throws Exception { - fOptions= DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap()); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_ACCESS_SPECIFIER_COMPARE_TO_TYPE_HEADER, DefaultCodeFormatterConstants.FALSE); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_BODY_DECLARATIONS_COMPARE_TO_ACCESS_SPECIFIER, DefaultCodeFormatterConstants.TRUE); assertFormatterResult(); @@ -260,7 +261,7 @@ public class CodeFormatterTest extends BaseUITestCase { // A(); // }; public void testWhiteSmithsAccessSpecifierIndentation2_Bug204575() throws Exception { - fOptions= DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap()); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_ACCESS_SPECIFIER_COMPARE_TO_TYPE_HEADER, DefaultCodeFormatterConstants.TRUE); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_BODY_DECLARATIONS_COMPARE_TO_ACCESS_SPECIFIER, DefaultCodeFormatterConstants.FALSE); assertFormatterResult(); @@ -277,7 +278,7 @@ public class CodeFormatterTest extends BaseUITestCase { // A(); // }; public void testWhiteSmithsAccessSpecifierIndentation3_Bug204575() throws Exception { - fOptions= DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap()); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_ACCESS_SPECIFIER_COMPARE_TO_TYPE_HEADER, DefaultCodeFormatterConstants.TRUE); fOptions.put(DefaultCodeFormatterConstants.FORMATTER_INDENT_BODY_DECLARATIONS_COMPARE_TO_ACCESS_SPECIFIER, DefaultCodeFormatterConstants.TRUE); assertFormatterResult(); @@ -564,7 +565,7 @@ public class CodeFormatterTest extends BaseUITestCase { // // Types: // }; public void testGNUCodingStyleConformance_Bug192764() throws Exception { - fOptions= DefaultCodeFormatterOptions.getGNUSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getGNUSettings().getMap()); assertFormatterResult(); } @@ -604,7 +605,7 @@ public class CodeFormatterTest extends BaseUITestCase { // E1 = 1 // }; public void testPreserveWhitespace2_Bug225326() throws Exception { - fOptions= DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap()); assertFormatterResult(); } @@ -628,7 +629,7 @@ public class CodeFormatterTest extends BaseUITestCase { // //CActiveScheduler* scheduler = new (ELeave) CActiveScheduler(); public void testFormatterRegressions_Bug225858() throws Exception { - fOptions= DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getWhitesmithsSettings().getMap()); assertFormatterResult(); } @@ -1001,7 +1002,7 @@ public class CodeFormatterTest extends BaseUITestCase { // } //} public void testCompoundStatementAsMacroGNU_Bug244928() throws Exception { - fOptions= DefaultCodeFormatterOptions.getGNUSettings().getMap(); + fOptions.putAll(DefaultCodeFormatterOptions.getGNUSettings().getMap()); assertFormatterResult(); } @@ -1356,4 +1357,13 @@ public class CodeFormatterTest extends BaseUITestCase { public void testCastAsMacro_Bug285901() throws Exception { assertFormatterResult(); } + + //PARENT_T sample={.a=1,.b={a[2]=1,.b.c=2}}; + + //PARENT_T sample = { .a = 1, .b = { a[2] = 1, .b.c = 2 } }; + public void testDesignatedInitializer_Bug314958() throws Exception { + fOptions.put(DefaultCodeFormatterConstants.FORMATTER_LANGUAGE, GCCLanguage.getDefault()); + assertFormatterResult(); + } + } diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CodeFormatterUtil.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CodeFormatterUtil.java index 346a0c5d28b..c7021879c3e 100644 --- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CodeFormatterUtil.java +++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/corext/util/CodeFormatterUtil.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2000, 2008 IBM Corporation and others. + * Copyright (c) 2000, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -117,7 +117,7 @@ public class CodeFormatterUtil { * @throws IllegalArgumentException If the offset and length are not inside the string, a * IllegalArgumentException is thrown. */ - public static TextEdit format(int kind, String source, int offset, int length, int indentationLevel, String lineSeparator, Map options) { + public static TextEdit format(int kind, String source, int offset, int length, int indentationLevel, String lineSeparator, Map options) { if (offset < 0 || length < 0 || offset + length > source.length()) { throw new IllegalArgumentException("offset or length outside of string. offset: " + offset + ", length: " + length + ", string size: " + source.length()); //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$ } @@ -128,7 +128,7 @@ public class CodeFormatterUtil { return null; } - public static TextEdit format(int kind, String source, int indentationLevel, String lineSeparator, Map options) { + public static TextEdit format(int kind, String source, int indentationLevel, String lineSeparator, Map options) { String prefix= ""; //$NON-NLS-1$ String suffix= ""; //$NON-NLS-1$ switch (kind) {