Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Corbat2018-05-23 11:02:03 +0000
committerThomas Corbat2019-08-05 07:00:35 +0000
commitacbceb04ee9e472119ef3255a47986c833fcf4c2 (patch)
treec27f6cf457270d83047b8c01a9c790c2d0d5ef7b /core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal
parentaf88842969b538dc3a33eab84b3b9631194bd9a3 (diff)
downloadorg.eclipse.cdt-acbceb04ee9e472119ef3255a47986c833fcf4c2.tar.gz
org.eclipse.cdt-acbceb04ee9e472119ef3255a47986c833fcf4c2.tar.xz
org.eclipse.cdt-acbceb04ee9e472119ef3255a47986c833fcf4c2.zip
Bug 522200: [C++17] Add support for structured binding declarations
Adds support for structured bindings: - Parser updated - Semantics updated - Tests for parser and bindings added Change-Id: I1de7b760041ac4ce4601f1b5032fdb0a197212a1 Signed-off-by: Hansruedi Patzen <hansruedi.patzen@hsr.ch> Signed-off-by: Thomas Corbat <tcorbat@hsr.ch>
Diffstat (limited to 'core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal')
-rw-r--r--core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java48
1 files changed, 46 insertions, 2 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 40ecad720dd..af013b73cf7 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
@@ -131,6 +131,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTExplicitTemplateInstantiation;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFieldReference;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTForStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator.RefQualifier;
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;
@@ -149,6 +150,7 @@ import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTRangeBasedForStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTReferenceOperator;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeConstructorExpression;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter;
+import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTStructuredBindingDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateDeclaration;
import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateId;
@@ -1948,7 +1950,48 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
return PROCESS_SKIP;
}
+ private int visit(ICPPASTStructuredBindingDeclaration node) {
+ formatLeadingAttributes(node);
+ IASTDeclSpecifier declSpec = node.getDeclSpecifier();
+ declSpec.accept(this);
+
+ RefQualifier refQualifier = node.getRefQualifier();
+ if (refQualifier != null) {
+ int expectedToken = refQualifier == RefQualifier.LVALUE ? Token.tAMPER : Token.tAND;
+ if (peekNextToken() == expectedToken) {
+ scribe.printNextToken(expectedToken,
+ preferences.insert_space_before_ref_qualifier_in_structured_binding);
+ }
+ }
+
+ IASTInitializer initializer = node.getInitializer();
+ if (peekNextToken() == Token.tLBRACKET) {
+ List<IASTName> names = Arrays.asList(node.getNames());
+ final ListOptions options = new ListOptions(preferences.alignment_for_declarator_list);
+ options.leftToken = Token.tLBRACKET;
+ options.rightToken = Token.tRBRACKET;
+ options.fSpaceBeforeOpeningParen = preferences.insert_space_before_opening_structured_binding_name_list;
+ options.fSpaceAfterOpeningParen = preferences.insert_space_after_opening_structured_binding_name_list;
+ options.fSpaceBeforeClosingParen = preferences.insert_space_before_closing_structured_binding_name_list;
+ options.fSpaceAfterSeparator = preferences.insert_space_after_comma_in_structured_binding_name_list;
+ options.fSpaceBeforeSeparator = preferences.insert_space_before_comma_in_structured_binding_name_list;
+ formatList(names, options, true, false, null);
+ } else if (initializer != null) {
+ skipToNode(initializer);
+ }
+ if (initializer != null) {
+ initializer.accept(this);
+ }
+ if (fExpectSemicolonAfterDeclaration && peekNextToken() == Token.tSEMI) {
+ scribe.printNextToken(Token.tSEMI);
+ }
+ return PROCESS_SKIP;
+ }
+
private int visit(IASTSimpleDeclaration node) {
+ if (node instanceof ICPPASTStructuredBindingDeclaration) {
+ return visit((ICPPASTStructuredBindingDeclaration) node);
+ }
formatLeadingAttributes(node);
IASTDeclSpecifier declSpec = node.getDeclSpecifier();
declSpec.accept(this);
@@ -2585,11 +2628,12 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
}
private void formatInlineDeclaration(final IASTDeclaration decl) {
+ boolean previousExpectSemicolonAfterDeclaration = fExpectSemicolonAfterDeclaration;
fExpectSemicolonAfterDeclaration = false;
try {
decl.accept(this);
} finally {
- fExpectSemicolonAfterDeclaration = true;
+ fExpectSemicolonAfterDeclaration = previousExpectSemicolonAfterDeclaration;
}
}
@@ -3660,7 +3704,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
scribe.space();
}
IASTDeclaration declaration = node.getDeclaration();
- declaration.accept(this);
+ formatInlineDeclaration(declaration);
scribe.printNextToken(Token.tCOLON, true /* preferences.insert_space_before_colon_in_for */);
final IASTInitializerClause initializer = node.getInitializerClause();
if (true /*preferences.insert_space_after_colon_in_for*/) {

Back to the top