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 c49b4840b67..811eaac4c74 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2006, 2010 Wind River Systems, Inc. and others. + * Copyright (c) 2006, 2011 Wind River Systems, Inc. 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 @@ -206,6 +206,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, private boolean fExpectSemicolonAfterDeclaration= true; private MultiStatus fStatus; + private int fOpenAngleBrackets; public CodeFormatterVisitor(DefaultCodeFormatterOptions preferences, int offset, int length) { @@ -941,7 +942,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, align.fSpaceBeforeComma= preferences.insert_space_before_comma_in_template_parameters; formatList(Arrays.asList(templateParameters), align, false, false); } - scribe.printNextToken(Token.tGT, preferences.insert_space_before_closing_angle_bracket_in_template_parameters); + scribe.printNextToken(new int[] { Token.tGT, Token.tSHIFTR }, preferences.insert_space_before_closing_angle_bracket_in_template_parameters); if (preferences.insert_space_after_closing_angle_bracket_in_template_parameters) { scribe.space(); } @@ -1314,7 +1315,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, align.fSpaceBeforeComma= preferences.insert_space_before_comma_in_template_parameters; formatList(Arrays.asList(templateParameters), align, false, false); } - scribe.printNextToken(Token.tGT, preferences.insert_space_before_closing_angle_bracket_in_template_parameters); + scribe.printNextToken(new int[] { Token.tGT, Token.tSHIFTR }, preferences.insert_space_before_closing_angle_bracket_in_template_parameters); if (preferences.insert_space_after_closing_angle_bracket_in_template_parameters) { scribe.space(); } @@ -2736,6 +2737,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, if (preferences.insert_space_after_opening_angle_bracket_in_template_arguments) { scribe.space(); } + int angleBrackets = fOpenAngleBrackets++; final IASTNode[] templateArguments= node.getTemplateArguments(); if (templateArguments.length > 0) { final ListAlignment align= new ListAlignment(Alignment.M_COMPACT_SPLIT); @@ -2743,7 +2745,21 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor, align.fSpaceBeforeComma= preferences.insert_space_before_comma_in_template_arguments; formatList(Arrays.asList(templateArguments), align, false, false); } - scribe.printNextToken(Token.tGT, preferences.insert_space_before_closing_angle_bracket_in_template_arguments); + if (peekNextToken() == Token.tSHIFTR) { + if (fOpenAngleBrackets == angleBrackets + 2) { + fOpenAngleBrackets -= 2; + scribe.printNextToken(Token.tSHIFTR, preferences.insert_space_before_closing_angle_bracket_in_template_arguments); + } else { + scribe.printComment(); + if (preferences.insert_space_before_closing_angle_bracket_in_template_arguments) { + scribe.space(); + } + return PROCESS_SKIP; + } + } else { + --fOpenAngleBrackets; + scribe.printNextToken(Token.tGT, preferences.insert_space_before_closing_angle_bracket_in_template_arguments); + } int nextToken= peekNextToken(); if (node.getPropertyInParent() != ICPPASTQualifiedName.SEGMENT_NAME || nextToken == Token.tGT) { if (preferences.insert_space_after_closing_angle_bracket_in_template_arguments) { 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 1b437f894a5..35bba4eccd0 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 @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2007, 2010 Wind River Systems, Inc. and others. + * Copyright (c) 2007, 2011 Wind River Systems, Inc. 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 @@ -1538,4 +1538,18 @@ public class CodeFormatterTest extends BaseUITestCase { assertFormatterResult(); } + //int main() { + // std::vector> test; + // // some comment + // return 0; + //} + + //int main() { + // std::vector> test; + // // some comment + // return 0; + //} + public void testDoubleClosingAngleBrackets_Bug333816() throws Exception { + assertFormatterResult(); + } }