diff options
author | Thomas Corbat | 2018-05-23 11:02:03 +0000 |
---|---|---|
committer | Thomas Corbat | 2019-08-05 07:00:35 +0000 |
commit | acbceb04ee9e472119ef3255a47986c833fcf4c2 (patch) | |
tree | c27f6cf457270d83047b8c01a9c790c2d0d5ef7b /core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal | |
parent | af88842969b538dc3a33eab84b3b9631194bd9a3 (diff) | |
download | org.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.java | 48 |
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*/) { |