1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-07-27 02:45:32 +02:00

Bug 500000 - Added proper formatting for lambda expressions

Change-Id: Ia530b00f3710b74d1749978c9c5d23a2d55646f0
Signed-off-by: Marco Stornelli <marco.stornelli@gmail.com>
This commit is contained in:
Marco Stornelli 2019-03-22 19:18:04 +01:00
parent 8b2c6229aa
commit 38a084ce6d
9 changed files with 347 additions and 3 deletions

View file

@ -338,6 +338,17 @@ public class DefaultCodeFormatterConstants {
*/
public static final String FORMATTER_ALIGNMENT_FOR_THROWS_CLAUSE_IN_METHOD_DECLARATION = CCorePlugin.PLUGIN_ID
+ ".formatter.alignment_for_throws_clause_in_method_declaration"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option for alignment of lambda expression
* - option id: "org.eclipse.cdt.core.formatter.alignment_for_lambda_expression"
* - possible values: values returned by {@code createAlignmentValue(boolean, int, int)} call
* - default: createAlignmentValue(false, WRAP_COMPACT, INDENT_DEFAULT)
* </pre>
* @see #createAlignmentValue(boolean, int, int)
*/
public static final String FORMATTER_ALIGNMENT_FOR_LAMBDA_EXPRESSION = CCorePlugin.PLUGIN_ID
+ ".formatter.alignment_for_lambda_expression"; //$NON-NLS-1$
// /**
// * <pre>
// * FORMATTER / Option to add blank lines after #include directive
@ -1528,6 +1539,30 @@ public class DefaultCodeFormatterConstants {
*/
public static final String FORMATTER_INSERT_SPACE_AFTER_UNARY_OPERATOR = CCorePlugin.PLUGIN_ID
+ ".formatter.insert_space_after_unary_operator"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option to insert a space after lambda return
* - option id: "org.eclipse.cdt.core.formatter.insert_space_after_lambda_return"
* - possible values: { INSERT, DO_NOT_INSERT }
* - default: INSERT
* </pre>
* @see CCorePlugin#INSERT
* @see CCorePlugin#DO_NOT_INSERT
*/
public static final String FORMATTER_INSERT_SPACE_AFTER_LAMBDA_RETURN = CCorePlugin.PLUGIN_ID
+ ".formatter.insert_space_after_lambda_return"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option to insert a space before lambda return
* - option id: "org.eclipse.cdt.core.formatter.insert_before_lambda_return"
* - possible values: { INSERT, DO_NOT_INSERT }
* - default: INSERT
* </pre>
* @see CCorePlugin#INSERT
* @see CCorePlugin#DO_NOT_INSERT
*/
public static final String FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_RETURN = CCorePlugin.PLUGIN_ID
+ ".formatter.insert_space_before_lambda_return"; //$NON-NLS-1$
/**
* <pre>
* FORMATTER / Option to insert a space before an assignment operator

View file

@ -79,6 +79,7 @@ public class DefaultCodeFormatterOptions {
public int alignment_for_parameters_in_method_declaration;
public int alignment_for_throws_clause_in_method_declaration;
public int alignment_for_constructor_initializer_list;
public int alignment_for_lambda_expression;
// public boolean align_type_members_on_columns;
@ -204,6 +205,8 @@ public class DefaultCodeFormatterOptions {
public boolean insert_space_after_question_in_conditional;
public boolean insert_space_after_semicolon_in_for;
public boolean insert_space_after_unary_operator;
public boolean insert_space_after_lambda_return;
public boolean insert_space_before_lambda_return;
public boolean insert_space_before_assignment_operator;
public boolean insert_space_before_binary_operator;
public boolean insert_space_before_closing_angle_bracket_in_template_arguments;
@ -359,6 +362,8 @@ public class DefaultCodeFormatterOptions {
getAlignment(this.alignment_for_constructor_initializer_list));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_THROWS_CLAUSE_IN_METHOD_DECLARATION,
getAlignment(this.alignment_for_throws_clause_in_method_declaration));
options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_LAMBDA_EXPRESSION,
getAlignment(this.alignment_for_lambda_expression));
// options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGN_TYPE_MEMBERS_ON_COLUMNS, this.align_type_members_on_columns ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
// options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_AFTER_IMPORTS, Integer.toString(this.blank_lines_after_includes));
// options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BEFORE_FIELD, Integer.toString(this.blank_lines_before_field));
@ -569,6 +574,10 @@ public class DefaultCodeFormatterOptions {
this.insert_space_after_semicolon_in_for ? CCorePlugin.INSERT : CCorePlugin.DO_NOT_INSERT);
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_UNARY_OPERATOR,
this.insert_space_after_unary_operator ? CCorePlugin.INSERT : CCorePlugin.DO_NOT_INSERT);
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_RETURN,
this.insert_space_after_lambda_return ? CCorePlugin.INSERT : CCorePlugin.DO_NOT_INSERT);
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_RETURN,
this.insert_space_before_lambda_return ? CCorePlugin.INSERT : CCorePlugin.DO_NOT_INSERT);
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR,
this.insert_space_before_assignment_operator ? CCorePlugin.INSERT : CCorePlugin.DO_NOT_INSERT);
options.put(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_BINARY_OPERATOR,
@ -982,6 +991,17 @@ public class DefaultCodeFormatterOptions {
this.alignment_for_throws_clause_in_method_declaration = Alignment.M_COMPACT_SPLIT;
}
}
final Object alignmentForLambdaExpressionOption = settings
.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_LAMBDA_EXPRESSION);
if (alignmentForLambdaExpressionOption != null) {
try {
this.alignment_for_lambda_expression = Integer.parseInt((String) alignmentForLambdaExpressionOption);
} catch (NumberFormatException e) {
this.alignment_for_lambda_expression = Alignment.M_COMPACT_SPLIT | Alignment.M_INDENT_BY_ONE;
} catch (ClassCastException e) {
this.alignment_for_lambda_expression = Alignment.M_COMPACT_SPLIT | Alignment.M_INDENT_BY_ONE;
}
}
// final Object alignTypeMembersOnColumnsOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGN_TYPE_MEMBERS_ON_COLUMNS);
// if (alignTypeMembersOnColumnsOption != null) {
// this.align_type_members_on_columns = DefaultCodeFormatterConstants.TRUE.equals(alignTypeMembersOnColumnsOption);
@ -1645,6 +1665,16 @@ public class DefaultCodeFormatterOptions {
if (insertSpaceAfterUnaryOperatorOption != null) {
this.insert_space_after_unary_operator = CCorePlugin.INSERT.equals(insertSpaceAfterUnaryOperatorOption);
}
final Object insertSpaceAfterLambdaReturnOption = settings
.get(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_RETURN);
if (insertSpaceAfterLambdaReturnOption != null) {
this.insert_space_after_lambda_return = CCorePlugin.INSERT.equals(insertSpaceAfterLambdaReturnOption);
}
final Object insertSpaceBeforeLambdaReturnOption = settings
.get(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_RETURN);
if (insertSpaceBeforeLambdaReturnOption != null) {
this.insert_space_before_lambda_return = CCorePlugin.INSERT.equals(insertSpaceBeforeLambdaReturnOption);
}
final Object insertSpaceBeforeAssignmentOperatorOption = settings
.get(DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_ASSIGNMENT_OPERATOR);
if (insertSpaceBeforeAssignmentOperatorOption != null) {
@ -2174,6 +2204,7 @@ public class DefaultCodeFormatterOptions {
this.alignment_for_parameters_in_method_declaration = Alignment.M_COMPACT_SPLIT;
// this.alignment_for_selector_in_method_invocation = Alignment.M_COMPACT_SPLIT;
this.alignment_for_throws_clause_in_method_declaration = Alignment.M_COMPACT_SPLIT;
this.alignment_for_lambda_expression = Alignment.M_COMPACT_SPLIT | Alignment.M_INDENT_BY_ONE;
// this.align_type_members_on_columns = false;
// this.blank_lines_after_includes = 1;
// this.blank_lines_before_field = 1;
@ -2271,6 +2302,8 @@ public class DefaultCodeFormatterOptions {
this.insert_space_after_question_in_conditional = true;
this.insert_space_after_semicolon_in_for = true;
this.insert_space_after_unary_operator = false;
this.insert_space_after_lambda_return = true;
this.insert_space_before_lambda_return = true;
this.insert_space_before_assignment_operator = true;
this.insert_space_before_binary_operator = true;
this.insert_space_before_closing_angle_bracket_in_template_arguments = false;

View file

@ -111,6 +111,7 @@ import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator;
import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAttributeList;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTBinaryExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCastExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCatchHandler;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTClassVirtSpecifier;
@ -132,6 +133,8 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionWithTryBlock;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTIfStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression.CaptureDefault;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNameSpecifier;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier;
@ -206,9 +209,15 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
boolean fSpaceBeforeOpeningParen;
int fContinuationIndentation = -1;
int fTieBreakRule = Alignment.R_INNERMOST;
CaptureDefault captureDefault;
int rightToken;
int leftToken;
ListOptions(int mode) {
this.fMode = mode;
captureDefault = CaptureDefault.UNSPECIFIED;
rightToken = Token.tRPAREN;
leftToken = Token.tLPAREN;
}
}
@ -304,7 +313,23 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
@Override
public void run() {
boolean needSpace = skipConstVolatileRestrict(true);
// Skip mutable or constexpr keywords for a lambda expression
needSpace = skipMutableConstexpr() || needSpace;
int token = peekNextToken();
// Lambda return value
if (token == Token.tARROW) {
scribe.printNextToken(token, preferences.insert_space_before_lambda_return);
if (preferences.insert_space_after_lambda_return)
scribe.space();
if (node.getParent() instanceof ICPPASTLambdaExpression) {
final IASTTypeId returnValue = ((ICPPASTFunctionDeclarator) node).getTrailingReturnType();
returnValue.accept(CodeFormatterVisitor.this);
scribe.printTrailingComment();
scribe.space();
}
token = peekNextToken();
needSpace = true;
}
// Ref-qualifier.
if (token == Token.tAMPER || token == Token.tAND) {
scribe.printNextToken(token, true);
@ -360,10 +385,19 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
private final boolean spaceBeforeClosingParen;
private final Runnable continuationFormatter;
private final int parenPosition;
private final int token;
public ClosingParensesisTailFormatter(boolean spaceBeforeClosingParen, Runnable tailFormatter, int token) {
this.spaceBeforeClosingParen = spaceBeforeClosingParen;
this.continuationFormatter = tailFormatter;
this.token = token;
this.parenPosition = scribe.findToken(token);
}
public ClosingParensesisTailFormatter(boolean spaceBeforeClosingParen, Runnable tailFormatter) {
this.spaceBeforeClosingParen = spaceBeforeClosingParen;
this.continuationFormatter = tailFormatter;
this.token = Token.tRPAREN;
this.parenPosition = scribe.findToken(Token.tRPAREN);
}
@ -374,7 +408,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
if (offset < parenPosition)
scribe.restartAtOffset(parenPosition);
scribe.undoSpace();
scribe.printNextToken(Token.tRPAREN, spaceBeforeClosingParen);
scribe.printNextToken(token, spaceBeforeClosingParen);
}
if (continuationFormatter != null)
continuationFormatter.run();
@ -955,6 +989,8 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
visit((ICPPASTSimpleTypeConstructorExpression) node);
} else if (node instanceof IASTProblemExpression) {
visit((IASTProblemExpression) node);
} else if (node instanceof ICPPASTLambdaExpression) {
visit((ICPPASTLambdaExpression) node);
} else {
formatRaw(node);
}
@ -962,6 +998,83 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
return PROCESS_SKIP;
}
public int visit(ICPPASTLambdaExpression node) {
final int line = scribe.line;
final ListOptions options = createListOptionsForLambdaCapturesParameters(node);
ICPPASTCapture[] captures = node.getCaptures();
formatList(Arrays.asList(captures), options, true, captures.length > 0 && captures[0].isPackExpansion(), null,
new Runnable() {
@Override
public void run() {
if (options.captureDefault == CaptureDefault.BY_COPY) {
scribe.printNextToken(Token.tASSIGN, options.fSpaceAfterOpeningParen);
} else if (options.captureDefault == CaptureDefault.BY_REFERENCE) {
scribe.printNextToken(Token.tAMPER, options.fSpaceAfterOpeningParen);
}
if (options.captureDefault != CaptureDefault.UNSPECIFIED && node.getCaptures().length > 0) {
scribe.printNextToken(Token.tCOMMA, options.fSpaceBeforeSeparator);
if (options.fSpaceAfterSeparator)
scribe.space();
}
}
});
// declarator
final ICPPASTFunctionDeclarator declarator = node.getDeclarator();
skipNonWhitespaceToNode(declarator);
boolean hasSpace = scribe.printComment();
boolean hasPointerOps = declarator.getPointerOperators().length > 0;
boolean needSpace = (hasPointerOps && hasSpace) || (!hasPointerOps && peekNextToken() == Token.tIDENTIFIER);
if (needSpace) {
scribe.space();
}
Runnable tailFormatter = null;
IASTStatement bodyStmt = node.getBody();
if (DefaultCodeFormatterConstants.END_OF_LINE.equals(preferences.brace_position_for_method_declaration)
&& bodyStmt instanceof IASTCompoundStatement && !startsWithMacroExpansion(bodyStmt)) {
tailFormatter = new TrailingTokenFormatter(Token.tLBRACE, nodeOffset(bodyStmt),
preferences.insert_space_before_opening_brace_in_method_declaration, false);
scribe.setTailFormatter(tailFormatter);
}
declarator.accept(this);
IASTAttributeSpecifier[] attributes = declarator.getAttributeSpecifiers();
if (attributes.length > 0) {
formatAttributes(declarator, true, false);
}
if (tailFormatter != null) {
scribe.runTailFormatter();
scribe.setTailFormatter(null);
}
Alignment alignment = scribe.createAlignment(Alignment.LAMBDA_EXPRESSION,
preferences.alignment_for_lambda_expression, Alignment.R_INNERMOST, 1, getCurrentPosition());
scribe.enterAlignment(alignment);
// Body
if (bodyStmt instanceof IASTCompoundStatement) {
if (enterNode(bodyStmt)) {
if (getCurrentPosition() <= nodeOffset(bodyStmt)) {
formatLeftCurlyBrace(line, preferences.brace_position_for_method_declaration);
}
formatBlock((IASTCompoundStatement) bodyStmt, preferences.brace_position_for_method_declaration,
preferences.insert_space_before_opening_brace_in_method_declaration,
preferences.indent_statements_compare_to_body);
exitNode(bodyStmt);
}
} else if (bodyStmt != null) {
bodyStmt.accept(this);
}
scribe.printTrailingComment();
// go back to the previous alignment again:
scribe.exitAlignment(alignment, true);
return PROCESS_SKIP;
}
/*
* @see ASTVisitor#visit(IASTStatement)
*/
@ -1556,6 +1669,17 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
return skipped;
}
private boolean skipMutableConstexpr() {
boolean skipped = false;
int token = peekNextToken();
while (token == Token.t_mutable || token == Token.t_constexpr) {
scribe.printNextToken(token, true);
token = peekNextToken();
skipped = true;
}
return skipped;
}
private int visit(IASTStandardFunctionDeclarator node) {
final List<IASTParameterDeclaration> parameters = Arrays.asList(node.getParameters());
final ListOptions options = createListOptionsForFunctionDeclarationParameters();
@ -1575,6 +1699,21 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
return options;
}
private ListOptions createListOptionsForLambdaCapturesParameters(ICPPASTLambdaExpression expr) {
final ListOptions options = new ListOptions(preferences.alignment_for_parameters_in_method_declaration);
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;
options.fSpaceBetweenEmptyParen = preferences.insert_space_between_empty_parens_in_method_declaration;
options.fSpaceBeforeSeparator = preferences.insert_space_before_comma_in_method_declaration_parameters;
options.fSpaceAfterSeparator = preferences.insert_space_after_comma_in_method_declaration_parameters;
options.fTieBreakRule = Alignment.R_OUTERMOST;
options.rightToken = Token.tRBRACKET;
options.leftToken = Token.tLBRACKET;
options.captureDefault = expr.getCaptureDefault();
return options;
}
/**
* Returns the position of the last character of a node, or -1 if that character is part of
* a macro expansion.
@ -2257,16 +2396,37 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
*/
private void formatList(List<?> elements, ListOptions options, boolean encloseInParen, boolean addEllipsis,
Runnable tailFormatter) {
formatList(elements, options, encloseInParen, addEllipsis, tailFormatter, null);
}
/**
* Format a given list of elements according alignment options.
*
* @param elements the elements to format, which can be either {@link IASTNode}s or
* {@link TokenRange}s.
* @param options formatting options
* @param encloseInParen indicates whether the list should be enclosed in parentheses
* @param addEllipsis indicates whether ellipsis should be added after the last element
* @param tailFormatter formatter for the trailing text that should be kept together with
* the last element of the list.
* @param prefix A custom list prefix to format the first element
*/
private void formatList(List<?> elements, ListOptions options, boolean encloseInParen, boolean addEllipsis,
Runnable tailFormatter, Runnable prefix) {
if (encloseInParen)
scribe.printNextToken(Token.tLPAREN, options.fSpaceBeforeOpeningParen);
scribe.printNextToken(options.leftToken, options.fSpaceBeforeOpeningParen);
final int elementsLength = elements.size();
if (encloseInParen) {
boolean spaceBeforeClosingParen = elements.isEmpty() && !addEllipsis ? options.fSpaceBetweenEmptyParen
: options.fSpaceBeforeClosingParen;
tailFormatter = new ClosingParensesisTailFormatter(spaceBeforeClosingParen, tailFormatter);
tailFormatter = new ClosingParensesisTailFormatter(spaceBeforeClosingParen, tailFormatter,
options.rightToken);
}
if (prefix != null)
prefix.run();
if (!elements.isEmpty() || addEllipsis) {
if (options.fSpaceAfterOpeningParen) {
scribe.space();

View file

@ -32,6 +32,7 @@ public class Alignment {
public static final String CONDITIONAL_EXPRESSION = "conditionalExpression"; //$NON-NLS-1$
public static final String CONDITIONAL_EXPRESSION_CHAIN = "conditionalExpressionChain"; //$NON-NLS-1$
public static final String DECLARATION_INITIALIZER = "declarationInitializer"; //$NON-NLS-1$
public static final String LAMBDA_EXPRESSION = "lambdaExpression"; //$NON-NLS-1$
public static final String DESIGNATED_INITIALIZER = "designatedInitializer"; //$NON-NLS-1$
public static final String EXCEPTION_SPECIFICATION = "exceptionSpecification"; //$NON-NLS-1$
public static final String FIELD_REFERENCE = "fieldReference"; //$NON-NLS-1$

View file

@ -4152,4 +4152,75 @@ public class CodeFormatterTest extends BaseUITestCase {
public void testNamespacesWithInactiveSections_Bug405049() throws Exception {
assertFormatterResult();
}
//int main() {
// auto f = []() {
//
// for(int c1 = 0; c1 < 3; c1 ++) {
// for(int i = 0; i < 5; i ++) {
// for(int c2 = 0; c2 < 3; c2 ++) {
// // keep me here
// }
// }
// }
// };
// f();
// return 0;
//}
//int main() {
// auto f = []() {
//
// for (int c1 = 0; c1 < 3; c1++) {
// for (int i = 0; i < 5; i++) {
// for (int c2 = 0; c2 < 3; c2++) {
// // keep me here
// }
// }
// }
// };
// f();
// return 0;
//}
public void testAlignmentOfLambda1_Bug500000() throws Exception {
assertFormatterResult();
}
//int main() {
// int n = 0;
// auto f = [=]()mutable{n= 20;};
// f();
// return 0;
//}
//int main() {
// int n = 0;
// auto f = [=]() mutable {
// n = 20;
// };
// f();
// return 0;
//}
public void testAlignmentOfLambda2_Bug500000() throws Exception {
assertFormatterResult();
}
//int main() {
// int n = 0;
// auto f = [=]()throw(int)[[deprecated]]{throw 1;};
// f();
// return 0;
//}
//int main() {
// int n = 0;
// auto f = [=]() throw (int) [[deprecated]] {
// throw 1;
// };
// f();
// return 0;
//}
public void testAlignmentOfLambda3_Bug500000() throws Exception {
assertFormatterResult();
}
}

View file

@ -43,6 +43,9 @@ final class FormatterMessages extends NLS {
public static String WhiteSpaceTabPage_operators_after_prefix_operators;
public static String WhiteSpaceTabPage_operators_before_postfix_operators;
public static String WhiteSpaceTabPage_operators_after_postfix_operators;
public static String WhiteSpaceTabPage_lambda_expressions;
public static String WhiteSpaceTabPage_lambda_before_return;
public static String WhiteSpaceTabPage_lambda_after_return;
public static String WhiteSpaceTabPage_classes;
public static String WhiteSpaceTabPage_classes_before_opening_brace_of_a_class;
public static String WhiteSpaceTabPage_classes_before_colon_of_base_clause;
@ -129,6 +132,7 @@ final class FormatterMessages extends NLS {
public static String WhiteSpaceOptions_unary_operator;
public static String WhiteSpaceOptions_prefix_operator;
public static String WhiteSpaceOptions_postfix_operator;
public static String WhiteSpaceOptions_lambda_arrow_operator;
public static String WhiteSpaceOptions_opening_paren;
public static String WhiteSpaceOptions_pointer;
public static String WhiteSpaceOptions_catch;
@ -209,6 +213,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_parameters;
public static String LineWrappingTabPage_arguments;
public static String LineWrappingTabPage_throws_clause;
public static String LineWrappingTabPage_lambda_expression;
public static String LineWrappingTabPage_constructor_initializer_list;
public static String LineWrappingTabPage_enum_decls;
public static String LineWrappingTabPage_enumerator_list;
@ -232,6 +237,7 @@ final class FormatterMessages extends NLS {
public static String LineWrappingTabPage_parameters_lowercase;
public static String LineWrappingTabPage_arguments_lowercase;
public static String LineWrappingTabPage_throws_clause_lowercase;
public static String LineWrappingTabPage_lambda_expression_lowercase;
public static String LineWrappingTabPage_constructor_initializer_list_lowercase;
public static String LineWrappingTabPage_enum_decls_lowercase;
public static String LineWrappingTabPage_enumerator_list_lowercase;

View file

@ -30,6 +30,10 @@ WhiteSpaceTabPage_operators_after_prefix_operators=after prefix operators
WhiteSpaceTabPage_operators_before_postfix_operators=before postfix operators
WhiteSpaceTabPage_operators_after_postfix_operators=after postfix operators
WhiteSpaceTabPage_lambda_expressions=Lambda expressions
WhiteSpaceTabPage_lambda_before_return=before return arrow
WhiteSpaceTabPage_lambda_after_return=after return arrow
WhiteSpaceTabPage_classes=Types
WhiteSpaceTabPage_classes_before_opening_brace_of_a_class=before opening brace of a class
WhiteSpaceTabPage_classes_before_colon_of_base_clause=before colon of base clause
@ -140,6 +144,7 @@ WhiteSpaceOptions_binary_operator=Binary operator
WhiteSpaceOptions_unary_operator=Unary operator
WhiteSpaceOptions_prefix_operator=Prefix operator
WhiteSpaceOptions_postfix_operator=Postfix operator
WhiteSpaceOptions_lambda_arrow_operator=Lambda arrow operator
WhiteSpaceOptions_pointer=Pointer
WhiteSpaceOptions_before_pointer=Before pointer
@ -240,6 +245,7 @@ LineWrappingTabPage_base_clause=Base-clause
LineWrappingTabPage_parameters=Parameters
LineWrappingTabPage_arguments=Arguments
LineWrappingTabPage_throws_clause=Exception specification
LineWrappingTabPage_lambda_expression=Lambda expression
LineWrappingTabPage_constructor_initializer_list=Constructor initializer list
#LineWrappingTabPage_object_allocation=Object allocation arguments
LineWrappingTabPage_enum_decls='enum' declaration
@ -265,6 +271,7 @@ LineWrappingTabPage_base_clause_lowercase=base-clause
LineWrappingTabPage_parameters_lowercase=parameters
LineWrappingTabPage_arguments_lowercase=arguments
LineWrappingTabPage_throws_clause_lowercase=exception specification
LineWrappingTabPage_lambda_expression_lowercase=lambda expression
LineWrappingTabPage_constructor_initializer_list_lowercase=constructor initializer list
#LineWrappingTabPage_object_allocation_lowercase=object allocation arguments
LineWrappingTabPage_enum_decls_lowercase='enum' declaration

View file

@ -412,6 +412,17 @@ public class LineWrappingTabPage extends FormatterTabPage {
FormatterMessages.LineWrappingTabPage_throws_clause,
FormatterMessages.LineWrappingTabPage_throws_clause_lowercase);
private final Category fLambdaCategory = new Category(
DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_LAMBDA_EXPRESSION, "int foo() {" + //$NON-NLS-1$
" auto f = [](){for(int c1 = 0; c1 < 3; c1 ++) {\n" + //$NON-NLS-1$
" for(int i = 0; i < 5; i ++) {\n" + //$NON-NLS-1$
" for(int c2 = 0; c2 < 3; c2 ++) {\n" + //$NON-NLS-1$
" }\n" + //$NON-NLS-1$
" }\n" + //$NON-NLS-1$
" }};}", //$NON-NLS-1$
FormatterMessages.LineWrappingTabPage_lambda_expression,
FormatterMessages.LineWrappingTabPage_lambda_expression_lowercase);
private final Category fConstructorInitializerListCategory = new Category(
DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_CONSTRUCTOR_INITIALIZER_LIST, "class Point {" + //$NON-NLS-1$
"public:" + //$NON-NLS-1$
@ -638,6 +649,7 @@ public class LineWrappingTabPage extends FormatterTabPage {
methodDeclarations.children.add(fMethodDeclarationsParametersCategory);
methodDeclarations.children.add(fMethodThrowsClauseCategory);
methodDeclarations.children.add(fConstructorInitializerListCategory);
methodDeclarations.children.add(fLambdaCategory);
final Category enumDeclarations = new Category(FormatterMessages.LineWrappingTabPage_enum_decls,
FormatterMessages.LineWrappingTabPage_enum_decls_lowercase);

View file

@ -180,6 +180,9 @@ public final class WhiteSpaceOptions {
"void bar(int x, int y) throw() {}" + //$NON-NLS-1$
"void* baz(int* x, int& y) {return 0;}"); //$NON-NLS-1$
private final PreviewSnippet LAMBDA_PREVIEW = new PreviewSnippet(CodeFormatter.K_CLASS_BODY_DECLARATIONS,
"void foo() { auto f = []()->int{return 0;};}"); //$NON-NLS-1$
private final PreviewSnippet INITIALIZER_LIST_PREVIEW = new PreviewSnippet(CodeFormatter.K_STATEMENTS,
"int array[]= {1, 2, 3};"); //$NON-NLS-1$
@ -470,6 +473,7 @@ public final class WhiteSpaceOptions {
createNamespaceTree(workingValues, declarations);
createLinkageTree(workingValues, declarations);
// createConstructorTree(workingValues, declarations);
createLambdaDeclTree(workingValues, declarations);
createMethodDeclTree(workingValues, declarations);
createExceptionSpecificationTree(workingValues, declarations);
createLabelTree(workingValues, declarations);
@ -591,6 +595,8 @@ public final class WhiteSpaceOptions {
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_PREFIX_OPERATOR, OPERATOR_PREVIEW);
createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_postfix_operator,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_POSTFIX_OPERATOR, OPERATOR_PREVIEW);
createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_lambda_arrow_operator,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_RETURN, LAMBDA_PREVIEW);
}
private void createBeforeClosingBracketTree(Map<String, String> workingValues, final InnerNode parent) {
@ -822,6 +828,8 @@ public final class WhiteSpaceOptions {
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_PREFIX_OPERATOR, OPERATOR_PREVIEW);
createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_postfix_operator,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_POSTFIX_OPERATOR, OPERATOR_PREVIEW);
createOption(parent, workingValues, FormatterMessages.WhiteSpaceOptions_lambda_arrow_operator,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_RETURN, LAMBDA_PREVIEW);
}
private void createAfterOpenBracketTree(Map<String, String> workingValues, final InnerNode parent) {
@ -971,6 +979,17 @@ public final class WhiteSpaceOptions {
return root;
}
private InnerNode createLambdaDeclTree(Map<String, String> workingValues, InnerNode parent) {
final InnerNode root = new InnerNode(parent, workingValues,
FormatterMessages.WhiteSpaceTabPage_lambda_expressions);
createOption(root, workingValues, FormatterMessages.WhiteSpaceTabPage_lambda_before_return,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_BEFORE_LAMBDA_RETURN, LAMBDA_PREVIEW);
createOption(root, workingValues, FormatterMessages.WhiteSpaceTabPage_lambda_after_return,
DefaultCodeFormatterConstants.FORMATTER_INSERT_SPACE_AFTER_LAMBDA_RETURN, LAMBDA_PREVIEW);
return root;
}
private InnerNode createMethodDeclTree(Map<String, String> workingValues, InnerNode parent) {
final InnerNode root = new InnerNode(parent, workingValues, FormatterMessages.WhiteSpaceTabPage_functions);