1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 09:46:02 +02:00

Fixed a corner case in function call formatting.

This commit is contained in:
Sergey Prigogin 2011-03-16 02:43:51 +00:00
parent 199adb3ec5
commit e23e0a9238
3 changed files with 43 additions and 33 deletions

View file

@ -170,7 +170,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
private static class ListOptions {
final int fMode;
boolean fUseFallbackMode;
boolean fInsertNewLineBeforeListIfNecessary;
boolean fSpaceBeforeComma;
boolean fSpaceAfterComma = true;
boolean fSpaceAfterOpeningParen;
@ -1457,7 +1457,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
private ListOptions createListOptionsForFunctionDeclarationParameters() {
final ListOptions options= new ListOptions(preferences.alignment_for_parameters_in_method_declaration);
options.fUseFallbackMode= true;
options.fInsertNewLineBeforeListIfNecessary= true;
options.fSpaceBeforeOpeningParen= preferences.insert_space_before_opening_paren_in_method_declaration;
options.fSpaceAfterOpeningParen= preferences.insert_space_after_opening_paren_in_method_declaration;
options.fSpaceBeforeClosingParen= preferences.insert_space_before_closing_paren_in_method_declaration;
@ -2003,38 +2003,36 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
if (options.fSpaceAfterOpeningParen) {
scribe.space();
}
Alignment retryAlignment = null;
Alignment wrapperAlignment = null;
int fallbackMode = options.fUseFallbackMode ?
getFallbackAlignmentMode(options.fMode) : options.fMode;
if (fallbackMode != options.fMode) {
retryAlignment = scribe.createAlignment(
Alignment.LIST_FALLBACK_TRAP,
Alignment.M_ONE_PER_LINE_SPLIT,
final int continuationIndentation= options.fContinuationIndentation >= 0 ?
options.fContinuationIndentation : preferences.continuation_indentation;
if (options.fInsertNewLineBeforeListIfNecessary &&
(options.fMode & Alignment.M_INDENT_ON_COLUMN) != 0) {
wrapperAlignment = scribe.createAlignment(
Alignment.LIST_WRAPPER,
Alignment.M_COMPACT_FIRST_BREAK_SPLIT,
Alignment.R_INNERMOST,
1,
scribe.scanner.getCurrentPosition(),
0,
continuationIndentation,
false);
scribe.enterAlignment(retryAlignment);
scribe.enterAlignment(wrapperAlignment);
}
boolean success = false;
int mode = options.fMode;
do {
if (retryAlignment != null)
scribe.alignFragment(retryAlignment, 0);
if (wrapperAlignment != null)
scribe.alignFragment(wrapperAlignment, 0);
try {
final int continuationIndentation= options.fContinuationIndentation >= 0 ?
options.fContinuationIndentation : preferences.continuation_indentation;
Alignment alignment = scribe.createAlignment(
Alignment.LIST_ELEMENTS_PREFIX +
(elements.isEmpty() ? "ellipsis" : elements.get(0).getClass().getSimpleName()), //$NON-NLS-1$
mode,
options.fMode,
options.fTieBreakRule,
elementsLength + (addEllipsis ? 1 : 0),
scribe.scanner.getCurrentPosition(),
continuationIndentation,
wrapperAlignment == null ? continuationIndentation : 0,
false);
scribe.enterAlignment(alignment);
boolean ok = false;
@ -2082,27 +2080,18 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
scribe.exitAlignment(alignment, true);
success = true;
} catch (AlignmentException e) {
if (retryAlignment == null)
if (wrapperAlignment == null)
throw e;
scribe.redoAlignment(e);
}
mode = fallbackMode;
} while (!success);
if (retryAlignment != null)
scribe.exitAlignment(retryAlignment, true);
} while (wrapperAlignment != null && !success);
if (wrapperAlignment != null)
scribe.exitAlignment(wrapperAlignment, true);
} else if (tailFormatter != null) {
tailFormatter.run();
}
}
private int getFallbackAlignmentMode(int alignmentMode) {
switch (alignmentMode & Alignment.SPLIT_MASK) {
case Alignment.M_COMPACT_SPLIT:
alignmentMode = Alignment.M_COMPACT_FIRST_BREAK_SPLIT | (alignmentMode & ~Alignment.SPLIT_MASK);
}
return alignmentMode & ~Alignment.M_INDENT_ON_COLUMN;
}
private int visit(ICPPASTTryBlockStatement node) {
scribe.printNextToken(Token.t_try, scribe.printComment());
final IASTStatement tryBody= node.getTryBody();
@ -2256,7 +2245,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
expressions= Collections.emptyList();
}
final ListOptions options= new ListOptions(preferences.alignment_for_arguments_in_method_invocation);
options.fUseFallbackMode= true;
options.fInsertNewLineBeforeListIfNecessary= true;
options.fSpaceBeforeOpeningParen= preferences.insert_space_before_opening_paren_in_method_invocation;
options.fSpaceAfterOpeningParen= preferences.insert_space_after_opening_paren_in_method_invocation;
options.fSpaceBeforeClosingParen= preferences.insert_space_before_closing_paren_in_method_invocation;

View file

@ -31,7 +31,7 @@ public class Alignment {
public static final String FIELD_REFERENCE = "fieldReference"; //$NON-NLS-1$
public static final String FOR = "for"; //$NON-NLS-1$
public static final String LIST_ELEMENTS_PREFIX = "listElements_"; //$NON-NLS-1$
public static final String LIST_FALLBACK_TRAP = "listFallbackTrap"; //$NON-NLS-1$
public static final String LIST_WRAPPER = "listWrapper"; //$NON-NLS-1$
public static final String MACRO_ARGUMENTS = "macroArguments"; //$NON-NLS-1$
public static final String TRAILING_TEXT = "trailingText"; //$NON-NLS-1$

View file

@ -1080,6 +1080,27 @@ public class CodeFormatterTest extends BaseUITestCase {
assertFormatterResult();
}
//void function(int);
//int function_with_a_looooooooooooooooooooooooooooooooong_name(int);
//
//void test() {
//function(function_with_a_looooooooooooooooooooooooooooooooong_name(1000000));
//}
//void function(int);
//int function_with_a_looooooooooooooooooooooooooooooooong_name(int);
//
//void test() {
// function(function_with_a_looooooooooooooooooooooooooooooooong_name(
// 1000000));
//}
public void testFunctionCall_3() throws Exception {
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, CCorePlugin.SPACE);
fOptions.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_METHOD_INVOCATION,
Integer.toString(Alignment.M_COMPACT_SPLIT | Alignment.M_INDENT_ON_COLUMN));
assertFormatterResult();
}
//void function(const char* s);
//
//void test() {