1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-26 02:15:31 +02:00

Bug 322776 - [formatter] Add option to not join already wrapped lines

Bug 325787 - [formatter] No option to define indentation policy for assignment expression
This commit is contained in:
Anton Leherbauer 2010-11-03 09:55:47 +00:00
parent defc8a8a4a
commit 8f01b54586
9 changed files with 302 additions and 169 deletions

View file

@ -109,26 +109,28 @@ public class DefaultCodeFormatterConstants {
* @see #createAlignmentValue(boolean, int, int)
*/
public static final String FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_METHOD_INVOCATION = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_arguments_in_method_invocation"; //$NON-NLS-1$
// /**
// * <pre>
// * FORMATTER / Option for alignment of assignment
// * - option id: "org.eclipse.cdt.core.formatter.alignment_for_assignment"
// * - possible values: values returned by <code>createAlignmentValue(boolean, int, int)</code> call
// * - default: createAlignmentValue(false, M_NO_ALIGNMENT, INDENT_DEFAULT)
// * </pre>
// * @see #createAlignmentValue(boolean, int, int)
// */
// public static final String FORMATTER_ALIGNMENT_FOR_ASSIGNMENT = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_assignment"; //$NON-NLS-1$
// /**
// * <pre>
// * FORMATTER / Option for alignment of binary expression
// * - option id: "org.eclipse.cdt.core.formatter.alignment_for_binary_expression"
// * - possible values: values returned by <code>createAlignmentValue(boolean, int, int)</code> call
// * - default: createAlignmentValue(false, WRAP_COMPACT, INDENT_DEFAULT)
// * </pre>
// * @see #createAlignmentValue(boolean, int, int)
// */
// public static final String FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_binary_expression"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option for alignment of assignment
* - option id: "org.eclipse.cdt.core.formatter.alignment_for_assignment"
* - possible values: values returned by <code>createAlignmentValue(boolean, int, int)</code> call
* - default: createAlignmentValue(false, M_NO_ALIGNMENT, INDENT_DEFAULT)
* </pre>
* @see #createAlignmentValue(boolean, int, int)
* @since 5.3
*/
public static final String FORMATTER_ALIGNMENT_FOR_ASSIGNMENT = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_assignment"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option for alignment of binary expression
* - option id: "org.eclipse.cdt.core.formatter.alignment_for_binary_expression"
* - possible values: values returned by <code>createAlignmentValue(boolean, int, int)</code> call
* - default: createAlignmentValue(false, WRAP_COMPACT, INDENT_DEFAULT)
* </pre>
* @see #createAlignmentValue(boolean, int, int)
* @since 5.3
*/
public static final String FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_binary_expression"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option for alignment of compact if
@ -2037,6 +2039,16 @@ public class DefaultCodeFormatterConstants {
* </pre>
*/
public static final String FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE = CCorePlugin.PLUGIN_ID + ".formatter.number_of_empty_lines_to_preserve"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option to specify whether the formatter can join wrapped lines or not
* - option id: "org.eclipse.cdt.core.formatter.join_wrapped_lines"
* - possible values: { TRUE, FALSE }
* - default: TRUE
* </pre>
* @since 5.3
*/
public static final String FORMATTER_JOIN_WRAPPED_LINES = CCorePlugin.PLUGIN_ID + ".formatter.join_wrapped_lines"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option to specify whether or not empty statement should be on a new line

View file

@ -472,7 +472,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
scribe.startNewLine();
} else {
// preserve newline if not explicitly requested
if (scribe.preserveNewLine()) {
if (scribe.printCommentPreservingNewLines()) {
scribe.space();
}
}
@ -1251,7 +1251,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
final List<IASTDeclarator> declarators= Arrays.asList(node.getDeclarators());
if (!declarators.isEmpty()) {
if (declarators.size() == 1 && declarators.get(0) instanceof IASTFunctionDeclarator) {
if (scribe.preserveNewLine()) {
if (scribe.printCommentPreservingNewLines()) {
scribe.space();
}
} else {
@ -1324,7 +1324,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
}
} else {
// preserve newline if not explicitly requested
scribe.preserveNewLine();
scribe.printCommentPreservingNewLines();
}
declaration.accept(this);
@ -1795,8 +1795,11 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
private int visit(IASTConditionalExpression node) {
node.getLogicalConditionExpression().accept(this);
Alignment conditionalExpressionAlignment =scribe.createAlignment(
scribe.printTrailingComment();
if (preferences.insert_space_before_question_in_conditional) {
scribe.space();
}
Alignment conditionalExpressionAlignment = scribe.createAlignment(
"conditionalExpression", //$NON-NLS-1$
preferences.alignment_for_conditional_expression,
2,
@ -1807,7 +1810,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
do {
try {
scribe.alignFragment(conditionalExpressionAlignment, 0);
scribe.printNextToken(Token.tQUESTION, preferences.insert_space_before_question_in_conditional);
scribe.printNextToken(Token.tQUESTION, false);
if (preferences.insert_space_after_question_in_conditional) {
scribe.space();
@ -1961,8 +1964,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
// declaration initializer
Alignment expressionAlignment= scribe.createAlignment(
"declarationInitializer", //$NON-NLS-1$
// need configurable alignment
Alignment.M_COMPACT_SPLIT,
preferences.alignment_for_assignment,
1,
scribe.scanner.getCurrentPosition());
@ -2003,7 +2005,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
Alignment expressionAlignment= scribe.createAlignment(
"designatedInitializer", //$NON-NLS-1$
Alignment.M_COMPACT_SPLIT,
preferences.alignment_for_assignment,
1,
scribe.scanner.getCurrentPosition());
@ -2141,21 +2143,26 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
}
private int visit(IASTBinaryExpression node) {
final IASTExpression op1= node.getOperand1();
// operand 1
op1.accept(this);
Alignment expressionAlignment= scribe.createAlignment(
"binaryExpression", //$NON-NLS-1$
// need configurable alignment
Alignment.M_COMPACT_SPLIT,
1,
scribe.scanner.getCurrentPosition());
if (isAssignment(node)) {
return formatAssignment(node);
}
Alignment expressionAlignment= scribe.createAlignment(
"binaryExpression", //$NON-NLS-1$
preferences.alignment_for_binary_expression,
2,
scribe.scanner.getCurrentPosition());
scribe.enterAlignment(expressionAlignment);
scribe.enterAlignment(expressionAlignment);
boolean ok = false;
do {
try {
scribe.alignFragment(expressionAlignment, 0);
final IASTExpression op1= node.getOperand1();
// operand 1
op1.accept(this);
scribe.printTrailingComment();
scribe.alignFragment(expressionAlignment, 1);
// operator
final int nextToken= peekNextToken();
@ -2167,22 +2174,6 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
case IASTBinaryExpression.op_pmarrow:
scribe.printNextToken(nextToken, false);
break;
case IASTBinaryExpression.op_assign:
case IASTBinaryExpression.op_binaryAndAssign:
case IASTBinaryExpression.op_binaryOrAssign:
case IASTBinaryExpression.op_binaryXorAssign:
case IASTBinaryExpression.op_divideAssign:
case IASTBinaryExpression.op_minusAssign:
case IASTBinaryExpression.op_moduloAssign:
case IASTBinaryExpression.op_multiplyAssign:
case IASTBinaryExpression.op_plusAssign:
case IASTBinaryExpression.op_shiftLeftAssign:
case IASTBinaryExpression.op_shiftRightAssign:
scribe.printNextToken(nextToken, forceSpace || preferences.insert_space_before_assignment_operator);
if (forceSpace || preferences.insert_space_after_assignment_operator) {
scribe.space();
}
break;
default:
scribe.printNextToken(nextToken, forceSpace || preferences.insert_space_before_binary_operator);
if (forceSpace || preferences.insert_space_after_binary_operator) {
@ -2203,6 +2194,64 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
return PROCESS_SKIP;
}
private int formatAssignment(IASTBinaryExpression node) {
final IASTExpression op1= node.getOperand1();
// operand 1
op1.accept(this);
Alignment expressionAlignment= scribe.createAlignment(
"assignmentExpression", //$NON-NLS-1$
preferences.alignment_for_assignment,
1,
scribe.scanner.getCurrentPosition());
scribe.enterAlignment(expressionAlignment);
boolean ok = false;
do {
try {
scribe.alignFragment(expressionAlignment, 0);
// operator
final int nextToken= peekNextToken();
// in case of C++ alternative operators, like 'and', 'not', etc. a space
boolean forceSpace= Character.isJavaIdentifierStart(peekNextChar());
scribe.printNextToken(nextToken, forceSpace || preferences.insert_space_before_assignment_operator);
if (forceSpace || preferences.insert_space_after_assignment_operator) {
scribe.space();
}
// operand 2
final IASTExpression op2= node.getOperand2();
op2.accept(this);
ok = true;
} catch (AlignmentException e) {
scribe.redoAlignment(e);
}
} while (!ok);
scribe.exitAlignment(expressionAlignment, true);
return PROCESS_SKIP;
}
private boolean isAssignment(IASTBinaryExpression node) {
switch (node.getOperator()) {
case IASTBinaryExpression.op_assign:
case IASTBinaryExpression.op_binaryAndAssign:
case IASTBinaryExpression.op_binaryOrAssign:
case IASTBinaryExpression.op_binaryXorAssign:
case IASTBinaryExpression.op_divideAssign:
case IASTBinaryExpression.op_minusAssign:
case IASTBinaryExpression.op_moduloAssign:
case IASTBinaryExpression.op_multiplyAssign:
case IASTBinaryExpression.op_plusAssign:
case IASTBinaryExpression.op_shiftLeftAssign:
case IASTBinaryExpression.op_shiftRightAssign:
return true;
}
return false;
}
private int visit(IASTLiteralExpression node) {
if (node.getKind() == IASTLiteralExpression.lk_string_literal) {
// handle concatenation of string literals
@ -3202,13 +3251,18 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
}
private void formatLeftCurlyBrace(final int line, final String bracePosition) {
// deal with (quite unexpected) comments right before lcurly
scribe.printComment();
if (DefaultCodeFormatterConstants.NEXT_LINE_ON_WRAP.equals(bracePosition)
&& (scribe.line > line || scribe.column >= preferences.page_width))
{
scribe.startNewLine();
}
scribe.formatBrace = true;
try {
// deal with (quite unexpected) comments right before lcurly
scribe.printComment();
if (DefaultCodeFormatterConstants.NEXT_LINE_ON_WRAP.equals(bracePosition)
&& (scribe.line > line || scribe.column >= preferences.page_width))
{
scribe.startNewLine();
}
} finally {
scribe.formatBrace = false;
}
}
private void formatOpeningBrace(String bracePosition, boolean insertSpaceBeforeBrace) {

View file

@ -56,8 +56,8 @@ public class DefaultCodeFormatterOptions {
}
public int alignment_for_arguments_in_method_invocation;
// public int alignment_for_assignment;
// public int alignment_for_binary_expression;
public int alignment_for_assignment;
public int alignment_for_binary_expression;
public int alignment_for_compact_if;
public int alignment_for_conditional_expression;
public int alignment_for_expressions_in_initializer_list;
@ -238,6 +238,7 @@ public class DefaultCodeFormatterOptions {
public boolean keep_simple_if_on_one_line;
public boolean keep_then_statement_on_same_line;
public int number_of_empty_lines_to_preserve;
public boolean join_wrapped_lines;
public boolean put_empty_statement_on_new_line;
public int tab_size;
public int page_width;
@ -264,8 +265,8 @@ public class DefaultCodeFormatterOptions {
Map<String,String> options = new HashMap<String,String>();
// options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_ALLOCATION_EXPRESSION, getAlignment(this.alignment_for_arguments_in_allocation_expression));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_METHOD_INVOCATION, getAlignment(this.alignment_for_arguments_in_method_invocation));
// options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT, getAlignment(this.alignment_for_assignment));
// options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION, getAlignment(this.alignment_for_binary_expression));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT, getAlignment(this.alignment_for_assignment));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION, getAlignment(this.alignment_for_binary_expression));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_COMPACT_IF, getAlignment(this.alignment_for_compact_if));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_CONDITIONAL_EXPRESSION, getAlignment(this.alignment_for_conditional_expression));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST, getAlignment(this.alignment_for_expressions_in_initializer_list));
@ -439,6 +440,7 @@ public class DefaultCodeFormatterOptions {
options.put(DefaultCodeFormatterConstants.FORMATTER_KEEP_SIMPLE_IF_ON_ONE_LINE, this.keep_simple_if_on_one_line ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
options.put(DefaultCodeFormatterConstants.FORMATTER_KEEP_THEN_STATEMENT_ON_SAME_LINE, this.keep_then_statement_on_same_line ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
options.put(DefaultCodeFormatterConstants.FORMATTER_NUMBER_OF_EMPTY_LINES_TO_PRESERVE, Integer.toString(this.number_of_empty_lines_to_preserve));
options.put(DefaultCodeFormatterConstants.FORMATTER_JOIN_WRAPPED_LINES, this.join_wrapped_lines ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
options.put(DefaultCodeFormatterConstants.FORMATTER_PUT_EMPTY_STATEMENT_ON_NEW_LINE, this.put_empty_statement_on_new_line ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
options.put(DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, Integer.toString(this.page_width));
switch(this.tab_char) {
@ -478,26 +480,26 @@ public class DefaultCodeFormatterOptions {
this.alignment_for_arguments_in_method_invocation = Alignment.M_COMPACT_SPLIT;
}
}
// final Object alignmentForAssignmentOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT);
// if (alignmentForAssignmentOption != null) {
// try {
// this.alignment_for_assignment = Integer.parseInt((String) alignmentForAssignmentOption);
// } catch (NumberFormatException e) {
// this.alignment_for_assignment = Alignment.M_ONE_PER_LINE_SPLIT;
// } catch (ClassCastException e) {
// this.alignment_for_assignment = Alignment.M_ONE_PER_LINE_SPLIT;
// }
// }
// final Object alignmentForBinaryExpressionOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION);
// if (alignmentForBinaryExpressionOption != null) {
// try {
// this.alignment_for_binary_expression = Integer.parseInt((String) alignmentForBinaryExpressionOption);
// } catch (NumberFormatException e) {
// this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
// } catch (ClassCastException e) {
// this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
// }
// }
final Object alignmentForAssignmentOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT);
if (alignmentForAssignmentOption != null) {
try {
this.alignment_for_assignment = Integer.parseInt((String) alignmentForAssignmentOption);
} catch (NumberFormatException e) {
this.alignment_for_assignment = Alignment.M_ONE_PER_LINE_SPLIT;
} catch (ClassCastException e) {
this.alignment_for_assignment = Alignment.M_ONE_PER_LINE_SPLIT;
}
}
final Object alignmentForBinaryExpressionOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION);
if (alignmentForBinaryExpressionOption != null) {
try {
this.alignment_for_binary_expression = Integer.parseInt((String) alignmentForBinaryExpressionOption);
} catch (NumberFormatException e) {
this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
} catch (ClassCastException e) {
this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
}
}
final Object alignmentForCompactIfOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_COMPACT_IF);
if (alignmentForCompactIfOption != null) {
try {
@ -1360,6 +1362,10 @@ public class DefaultCodeFormatterOptions {
this.number_of_empty_lines_to_preserve = 0;
}
}
final Object joinWrappedLinesOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_JOIN_WRAPPED_LINES);
if (joinWrappedLinesOption != null) {
this.join_wrapped_lines = DefaultCodeFormatterConstants.TRUE.equals(joinWrappedLinesOption);
}
final Object putEmptyStatementOnNewLineOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_PUT_EMPTY_STATEMENT_ON_NEW_LINE);
if (putEmptyStatementOnNewLineOption != null) {
this.put_empty_statement_on_new_line = DefaultCodeFormatterConstants.TRUE.equals(putEmptyStatementOnNewLineOption);
@ -1403,9 +1409,9 @@ public class DefaultCodeFormatterOptions {
public void setDefaultSettings() {
// this.alignment_for_arguments_in_allocation_expression = Alignment.M_COMPACT_SPLIT;
this.alignment_for_arguments_in_method_invocation = Alignment.M_COMPACT_SPLIT;
// this.alignment_for_assignment = Alignment.M_NO_ALIGNMENT;
// this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
// this.alignment_for_compact_if = Alignment.M_COMPACT_SPLIT;
this.alignment_for_assignment = Alignment.M_NO_ALIGNMENT;
this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
this.alignment_for_compact_if = Alignment.M_COMPACT_SPLIT;
this.alignment_for_conditional_expression = Alignment.M_NEXT_PER_LINE_SPLIT;
this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
this.alignment_for_declarator_list = Alignment.M_COMPACT_SPLIT;
@ -1576,6 +1582,7 @@ public class DefaultCodeFormatterOptions {
this.keep_simple_if_on_one_line = false;
this.keep_then_statement_on_same_line = false;
this.number_of_empty_lines_to_preserve = 1;
this.join_wrapped_lines = true;
this.put_empty_statement_on_new_line = true;
this.tab_size = 4;
this.page_width = 80;
@ -1659,7 +1666,6 @@ public class DefaultCodeFormatterOptions {
this.keep_empty_initializer_list_on_one_line = false;
this.keep_simple_if_on_one_line = false;
this.keep_then_statement_on_same_line = false;
this.number_of_empty_lines_to_preserve = 1;
this.put_empty_statement_on_new_line = true;
this.tab_size = 4;
this.page_width = 80;
@ -1732,7 +1738,6 @@ public class DefaultCodeFormatterOptions {
this.keep_empty_initializer_list_on_one_line = false;
this.keep_simple_if_on_one_line = false;
this.keep_then_statement_on_same_line = false;
this.number_of_empty_lines_to_preserve = 1;
this.put_empty_statement_on_new_line = true;
this.tab_size = 2;
this.page_width = 80;
@ -1799,7 +1804,6 @@ public class DefaultCodeFormatterOptions {
this.keep_empty_initializer_list_on_one_line = false;
this.keep_simple_if_on_one_line = false;
this.keep_then_statement_on_same_line = false;
this.number_of_empty_lines_to_preserve = 1;
this.put_empty_statement_on_new_line = true;
this.tab_size = 8;
this.page_width = 80;

View file

@ -65,10 +65,11 @@ public class Scribe {
private boolean preserveNewLines;
private boolean checkLineWrapping;
public int lastNumberOfNewLines;
boolean formatBrace;
public int line;
public boolean needSpace= false;
public boolean pendingSpace= false;
public boolean needSpace;
public boolean pendingSpace;
public int tabLength;
public int tabChar;
@ -103,6 +104,7 @@ public class Scribe {
}
lineSeparator= preferences.line_separator;
indentationLevel= preferences.initial_indentation_level * indentationSize;
preserveNewLines = false;
textRegionStart= offset;
textRegionEnd= offset + length - 1;
reset();
@ -424,8 +426,7 @@ public class Scribe {
public String getNewLine() {
if (lastNumberOfNewLines >= 1) {
column= 1; // ensure that the scribe is at the beginning of a new
// line
column= 1; // ensure that the scribe is at the beginning of a new line
return EMPTY_STRING;
}
line++;
@ -458,13 +459,26 @@ public class Scribe {
}
private String getPreserveEmptyLines(int count) {
if (count > 0) {
if (preferences.number_of_empty_lines_to_preserve != 0) {
int linesToPreserve= Math.min(count, preferences.number_of_empty_lines_to_preserve);
return getEmptyLines(linesToPreserve);
} else {
return getNewLine();
if (count == 0 && !preserveNewLines) {
// preserve line breaks in wrapping if specified
if ((!preferences.join_wrapped_lines) && lastNumberOfNewLines == 0) {
// Create new line
StringBuilder tempBuffer = new StringBuilder();
tempBuffer.append(getNewLine());
if (currentAlignment != null && !formatBrace) {
indentationLevel = currentAlignment.breakIndentationLevel;
}
// Print the computed indentation in the buffer
printIndentationIfNecessary(tempBuffer);
return tempBuffer.toString();
}
return EMPTY_STRING;
}
if (preferences.number_of_empty_lines_to_preserve != 0) {
int linesToPreserve= Math.min(count, preferences.number_of_empty_lines_to_preserve);
return getEmptyLines(linesToPreserve);
} else if (preserveNewLines) {
return getNewLine();
}
@ -753,9 +767,6 @@ public class Scribe {
lastNumberOfNewLines= 0;
printIndentationIfNecessary();
if (considerSpaceIfAny) {
if (currentAlignment != null && currentAlignment.isIndentOnColumn(column)) {
needSpace= true;
}
space();
}
if (pendingSpace) {
@ -961,7 +972,7 @@ public class Scribe {
} else if (hasLineComment) {
preserveEmptyLines(count - 1, scanner.getCurrentTokenStartPosition());
addDeleteEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition());
} else if (count != 0 && preferences.number_of_empty_lines_to_preserve != 0) {
} else if (count != 0 && (!preferences.join_wrapped_lines || preferences.number_of_empty_lines_to_preserve != 0)) {
String preservedEmptyLines= getPreserveEmptyLines(count - 1);
addReplaceEdit(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(),
preservedEmptyLines);
@ -1230,7 +1241,8 @@ public class Scribe {
return;
}
if (lastNumberOfNewLines >= 1) {
column= 1; // ensure that the scribe is at the beginning of a new line
// ensure that the scribe is at the beginning of a new line
column = 1;
return;
}
addInsertEdit(insertPosition, lineSeparator);
@ -1246,21 +1258,31 @@ public class Scribe {
}
public void printNextToken(int expectedTokenType, boolean considerSpaceIfAny) {
printComment();
if (shouldSkip(scanner.getCurrentPosition())) {
return;
// Set brace flag, it's useful for the scribe while preserving line breaks
switch (expectedTokenType) {
case Token.tRBRACE:
case Token.tLBRACE:
formatBrace = true;
}
currentToken= scanner.nextToken();
if (currentToken == null || expectedTokenType != currentToken.type) {
if (pendingSpace) {
addInsertEdit(scanner.getCurrentTokenStartPosition(), SPACE);
try {
printComment();
if (shouldSkip(scanner.getCurrentPosition())) {
return;
}
pendingSpace= false;
needSpace= true;
throw new AbortFormatting(
"[" + (line+1) + "/" + column + "] unexpected token type, expecting:" + expectedTokenType + ", actual:" + currentToken);//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
currentToken= scanner.nextToken();
if (currentToken == null || expectedTokenType != currentToken.type) {
if (pendingSpace) {
addInsertEdit(scanner.getCurrentTokenStartPosition(), SPACE);
}
pendingSpace= false;
needSpace= true;
throw new AbortFormatting(
"[" + (line+1) + "/" + column + "] unexpected token type, expecting:" + expectedTokenType + ", actual:" + currentToken);//$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
}
print(currentToken.getLength(), considerSpaceIfAny);
} finally {
formatBrace = false;
}
print(currentToken.getLength(), considerSpaceIfAny);
}
public void printNextToken(int[] expectedTokenTypes) {
@ -1596,16 +1618,6 @@ public class Scribe {
return !isFirstModifier;
}
public boolean preserveNewLine() {
boolean savedPreserveNewLines= preserveNewLines;
try {
preserveNewLines= true;
return printComment();
} finally {
preserveNewLines= savedPreserveNewLines;
}
}
/**
* Skip to the next occurrence of the given token type.
* If successful, the next token will be the epxected token,
@ -1672,12 +1684,12 @@ public class Scribe {
}
public boolean printCommentPreservingNewLines() {
final boolean savedPreserveNL= this.preserveNewLines;
this.preserveNewLines= true;
final boolean savedPreserveNL= preserveNewLines;
preserveNewLines= true;
try {
return printComment();
} finally {
this.preserveNewLines= savedPreserveNL;
preserveNewLines= savedPreserveNL;
}
}
@ -1729,7 +1741,6 @@ public class Scribe {
scanner.resetTo(offset, scannerEndPosition - 1);
}
}
}
}

View file

@ -222,6 +222,7 @@ public class CodeFormatterTest extends BaseUITestCase {
//int verylooooooooooooooooooooooooooooooooooongname =
// 0000000000000000000000000000000;
public void testLineWrappingOfInitializerExpression_Bug200961() throws Exception {
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT, Integer.toString(Alignment.M_COMPACT_SPLIT));
assertFormatterResult();
}
@ -1407,5 +1408,43 @@ public class CodeFormatterTest extends BaseUITestCase {
public void testRangeBasedFor_Bug328472() throws Exception {
assertFormatterResult();
}
//int table[][] = {
// {1,2,3,4},
// { 1, 2, 3 , 4},
//{ 1,2, 3,4 },
// {1, 2,3, 4}
// };
//int table[][] = {
// { 1, 2, 3, 4 },
// { 1, 2, 3, 4 },
// { 1, 2, 3, 4 },
// { 1, 2, 3, 4 }
//};
public void testKeepWrappedLines_Bug322776() throws Exception {
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_JOIN_WRAPPED_LINES, DefaultCodeFormatterConstants.FALSE);
assertFormatterResult();
}
//void f() {
//double confidence = 0.316030 //
//- 0.016315 * C_Count //
//+ 0.034336 * N_Count //
//+ 0.066810 * O_Count //
//+ 0.035674 * F_Count;
//}
//void f() {
// double confidence = 0.316030 //
// - 0.016315 * C_Count //
// + 0.034336 * N_Count //
// + 0.066810 * O_Count //
// + 0.035674 * F_Count;
//}
public void testAlignmentOfBinaryExpression_Bug325787() throws Exception {
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION,
Integer.toString(Alignment.M_COMPACT_SPLIT | Alignment.M_INDENT_ON_COLUMN));
assertFormatterResult();
}
}

View file

@ -205,7 +205,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_enumerator_list;
public static String LineWrappingTabPage_initializer_list;
public static String LineWrappingTabPage_conditionals;
// public static String LineWrappingTabPage_binary_exprs;
public static String LineWrappingTabPage_binary_exprs;
public static String LineWrappingTabPage_indentation_default;
public static String LineWrappingTabPage_indentation_on_column;
public static String LineWrappingTabPage_indentation_by_one;
@ -214,6 +214,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_function_calls;
public static String LineWrappingTabPage_expressions;
// public static String LineWrappingTabPage_statements;
public static String LineWrappingTabPage_do_not_join_lines;
public static String LineWrappingTabPage_base_clause_lowercase;
// public static String LineWrappingTabPage_compact_if_else_lowercase;
@ -224,7 +225,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_enumerator_list_lowercase;
public static String LineWrappingTabPage_initializer_list_lowercase;
public static String LineWrappingTabPage_conditionals_lowercase;
// public static String LineWrappingTabPage_binary_exprs_lowercase;
public static String LineWrappingTabPage_binary_exprs_lowercase;
public static String LineWrappingTabPage_indentation_default_lowercase;
public static String LineWrappingTabPage_indentation_on_column_lowercase;
public static String LineWrappingTabPage_indentation_by_one_lowercase;
@ -233,7 +234,8 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_function_calls_lowercase;
public static String LineWrappingTabPage_expressions_lowercase;
// public static String LineWrappingTabPage_statements_lowercase;
public static String LineWrappingTabPage_assignment_alignment_lowercase;
public static String LineWrappingTabPage_wrapping_policy_label_text;
public static String LineWrappingTabPage_indentation_policy_label_text;
public static String LineWrappingTabPage_force_split_checkbox_text;
@ -255,7 +257,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_width_indent_option_default_indent_wrapped;
public static String LineWrappingTabPage_width_indent_option_default_indent_array;
public static String LineWrappingTabPage_error_invalid_value;
// public static String LineWrappingTabPage_assignment_alignment;
public static String LineWrappingTabPage_assignment_alignment;
public static String AlreadyExistsDialog_message_profile_already_exists;
public static String AlreadyExistsDialog_message_profile_name_empty;
public static String AlreadyExistsDialog_dialog_title;

View file

@ -232,7 +232,7 @@ LineWrappingTabPage_enum_decls='enum' declaration
LineWrappingTabPage_enumerator_list=Enumerator list
LineWrappingTabPage_initializer_list=Initializer list
LineWrappingTabPage_conditionals=Conditionals
#LineWrappingTabPage_binary_exprs=Binary expressions
LineWrappingTabPage_binary_exprs=Binary expressions
LineWrappingTabPage_indentation_default=Default indentation
LineWrappingTabPage_indentation_on_column=Indent on column
LineWrappingTabPage_indentation_by_one=Indent by one
@ -241,6 +241,7 @@ LineWrappingTabPage_function_decls=Function declarations
LineWrappingTabPage_function_calls=Function calls
LineWrappingTabPage_expressions=Expressions
#LineWrappingTabPage_statements=Statements
LineWrappingTabPage_do_not_join_lines=Never join already wrapped lin&es
#lower case table entries description;
LineWrappingTabPage_base_clause_lowercase=base-clause
@ -253,7 +254,7 @@ LineWrappingTabPage_enum_decls_lowercase='enum' declaration
LineWrappingTabPage_enumerator_list_lowercase=enumerator list
LineWrappingTabPage_initializer_list_lowercase=initializer list
LineWrappingTabPage_conditionals_lowercase=conditionals
#LineWrappingTabPage_binary_exprs_lowercase=binary expressions
LineWrappingTabPage_binary_exprs_lowercase=binary expressions
LineWrappingTabPage_indentation_default_lowercase=default indentation
LineWrappingTabPage_indentation_on_column_lowercase=indent on column
LineWrappingTabPage_indentation_by_one_lowercase=indent by one
@ -262,6 +263,7 @@ LineWrappingTabPage_function_decls_lowercase=function declarations
LineWrappingTabPage_function_calls_lowercase=function calls
LineWrappingTabPage_expressions_lowercase=expressions
#LineWrappingTabPage_statements_lowercase=statements
LineWrappingTabPage_assignment_alignment_lowercase=assignments
LineWrappingTabPage_wrapping_policy_label_text=Lin&e wrapping policy:
LineWrappingTabPage_indentation_policy_label_text=Indent&ation policy:
@ -284,7 +286,7 @@ LineWrappingTabPage_width_indent_option_max_line_width=Ma&ximum line width:
LineWrappingTabPage_width_indent_option_default_indent_wrapped=Defa&ult indentation for wrapped lines:
LineWrappingTabPage_width_indent_option_default_indent_array=Default indentation for initializer lists:
LineWrappingTabPage_error_invalid_value=The key ''{0}'' contained an invalid value; resetting to defaults.
#LineWrappingTabPage_assignment_alignment=Assignments
LineWrappingTabPage_assignment_alignment=Assignments
AlreadyExistsDialog_message_profile_already_exists=A profile with this name already exists.

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2005, 2008 IBM Corporation and others.
* Copyright (c) 2005, 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
@ -21,12 +21,20 @@ import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
import org.eclipse.cdt.ui.CUIPlugin;
public abstract class FormatterTabPage extends ModifyDialogTabPage {
private final static String SHOW_INVISIBLE_PREFERENCE_KEY= CUIPlugin.PLUGIN_ID + ".formatter_page.show_invisible_characters"; //$NON-NLS-1$
/**
* Constant array for boolean true/false selection.
*
* @since 5.3
*/
protected static String[] TRUE_FALSE= { DefaultCodeFormatterConstants.TRUE, DefaultCodeFormatterConstants.FALSE };
private CPreview fPreview;
private final IDialogSettings fDialogSettings;
private Button fShowInvisibleButton;

View file

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (c) 2000, 2009 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
@ -447,18 +447,18 @@ public class LineWrappingTabPage extends FormatterTabPage {
FormatterMessages.LineWrappingTabPage_conditionals_lowercase
);
// private final Category fBinaryExpressionCategory= new Category(
// DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION,
// "class Example extends AnotherClass {" + //$NON-NLS-1$
// "int foo() {" + //$NON-NLS-1$
// " int sum= 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800;" + //$NON-NLS-1$
// " int product= 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10;" + //$NON-NLS-1$
// " boolean val= true && false && true && false && true;" + //$NON-NLS-1$
// " return product / sum;}}", //$NON-NLS-1$
// FormatterMessages.LineWrappingTabPage_binary_exprs,
// FormatterMessages.LineWrappingTabPage_binary_exprs_lowercase
// );
//
private final Category fBinaryExpressionCategory= new Category(
DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION,
"class Example : AnotherClass {" + //$NON-NLS-1$
"int foo() {" + //$NON-NLS-1$
" int sum= 100 + 200 + 300 + 400 + 500 + 600 + 700 + 800;" + //$NON-NLS-1$
" int product= 1 * 2 * 3 * 4 * 5 * 6 * 7 * 8 * 9 * 10;" + //$NON-NLS-1$
" bool val= true && false && true && false && true;" + //$NON-NLS-1$
" return product / sum;}}", //$NON-NLS-1$
FormatterMessages.LineWrappingTabPage_binary_exprs,
FormatterMessages.LineWrappingTabPage_binary_exprs_lowercase
);
// private final Category fEnumConstArgumentsCategory= new Category(
// DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_ENUM_CONSTANT,
// "enum Example {" + //$NON-NLS-1$
@ -482,18 +482,18 @@ public class LineWrappingTabPage extends FormatterTabPage {
FormatterMessages.LineWrappingTabPage_enumerator_list,
FormatterMessages.LineWrappingTabPage_enumerator_list_lowercase
);
//
// private final Category fAssignmentCategory= new Category(
// DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT,
// "class Example {" + //$NON-NLS-1$
// "private static final String string = \"TextTextText\";" + //$NON-NLS-1$
// "void foo() {" + //$NON-NLS-1$
// "for (int i = 0; i < 10; i++) {}" + //$NON-NLS-1$
// "String s;" + //$NON-NLS-1$
// "s = \"TextTextText\";}}", //$NON-NLS-1$
// FormatterMessages.LineWrappingTabPage_assignment_alignment,
// FormatterMessages.LineWrappingTabPage_assignment_alignment_lowercase
// );
private final Category fAssignmentCategory= new Category(
DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT,
"static char* string = \"TextTextText\";" + //$NON-NLS-1$
"class Example {" + //$NON-NLS-1$
"void foo() {" + //$NON-NLS-1$
"for (int i = 0; i < 10; i++) {}" + //$NON-NLS-1$
"char* s;" + //$NON-NLS-1$
"s = \"TextTextText\";}}", //$NON-NLS-1$
FormatterMessages.LineWrappingTabPage_assignment_alignment,
FormatterMessages.LineWrappingTabPage_assignment_alignment_lowercase
);
/**
* The default preview line width.
@ -600,10 +600,10 @@ public class LineWrappingTabPage extends FormatterTabPage {
// functionCalls.children.add(fQualifiedAllocationExpressionCategory);
final Category expressions= new Category(FormatterMessages.LineWrappingTabPage_expressions,FormatterMessages.LineWrappingTabPage_expressions_lowercase);
// expressions.children.add(fBinaryExpressionCategory);
expressions.children.add(fBinaryExpressionCategory);
expressions.children.add(fConditionalExpressionCategory);
expressions.children.add(fInitializerListExpressionsCategory);
// expressions.children.add(fAssignmentCategory);
expressions.children.add(fAssignmentCategory);
// final Category statements= new Category(FormatterMessages.LineWrappingTabPage_statements);
// statements.children.add(fCompactIfCategory);
@ -631,6 +631,7 @@ public class LineWrappingTabPage extends FormatterTabPage {
createNumberPref(lineWidthGroup, numColumns, FormatterMessages.LineWrappingTabPage_width_indent_option_max_line_width, DefaultCodeFormatterConstants.FORMATTER_LINE_SPLIT, 0, 9999);
createNumberPref(lineWidthGroup, numColumns, FormatterMessages.LineWrappingTabPage_width_indent_option_default_indent_wrapped, DefaultCodeFormatterConstants.FORMATTER_CONTINUATION_INDENTATION, 0, 9999);
createNumberPref(lineWidthGroup, numColumns, FormatterMessages.LineWrappingTabPage_width_indent_option_default_indent_array, DefaultCodeFormatterConstants.FORMATTER_CONTINUATION_INDENTATION_FOR_INITIALIZER_LIST, 0, 9999);
createCheckboxPref(lineWidthGroup, numColumns, FormatterMessages.LineWrappingTabPage_do_not_join_lines, DefaultCodeFormatterConstants.FORMATTER_JOIN_WRAPPED_LINES, TRUE_FALSE);
fCategoriesViewer= new TreeViewer(composite /*categoryGroup*/, SWT.MULTI | SWT.BORDER | SWT.READ_ONLY | SWT.V_SCROLL );
fCategoriesViewer.setContentProvider(new ITreeContentProvider() {