From 7a22acef4162400db3abdb25d8db45278f82c662 Mon Sep 17 00:00:00 2001 From: Markus Schorn Date: Thu, 19 Aug 2010 14:34:05 +0000 Subject: [PATCH] Bug 316307: [C++0x] Syntax for lambda expressions. --- .../core/parser/tests/ast2/AST2CPPTests.java | 40 +++ .../cdt/core/dom/ast/ASTGenericVisitor.java | 23 +- .../eclipse/cdt/core/dom/ast/ASTVisitor.java | 93 ++++++- .../cdt/core/dom/ast/c/CASTVisitor.java | 14 +- .../cdt/core/dom/ast/cpp/CPPASTVisitor.java | 32 +-- .../cdt/core/dom/ast/cpp/ICPPASTCapture.java | 57 +++++ .../ast/cpp/ICPPASTFunctionDeclarator.java | 12 + .../dom/ast/cpp/ICPPASTLambdaExpression.java | 80 ++++++ .../cdt/core/dom/ast/cpp/ICPPNodeFactory.java | 95 ++++---- .../parser/AbstractGNUSourceCodeParser.java | 2 +- .../dom/parser/c/CASTArrayDesignator.java | 26 +- .../parser/c/CASTArrayRangeDesignator.java | 27 +-- .../dom/parser/c/CASTFieldDesignator.java | 24 +- .../dom/parser/cpp/CPPASTBaseSpecifier.java | 18 +- .../core/dom/parser/cpp/CPPASTCapture.java | 92 +++++++ .../parser/cpp/CPPASTFunctionDeclarator.java | 11 + .../parser/cpp/CPPASTLambdaExpression.java | 144 +++++++++++ .../parser/cpp/CPPASTNamespaceDefinition.java | 8 +- .../cpp/CPPASTParameterDeclaration.java | 22 +- .../CPPASTSimpleTypeTemplateParameter.java | 25 +- .../CPPASTTemplatedTypeTemplateParameter.java | 32 ++- .../core/dom/parser/cpp/CPPNodeFactory.java | 58 +++-- .../dom/parser/cpp/GNUCPPSourceParser.java | 138 +++++++++-- .../scanner/FindNodeByImageLocation.java | 123 +--------- .../DOMAST/CPPPopulateASTViewAction.java | 227 +----------------- .../cdt/ui/tests/DOMAST/DOMASTNodeLeaf.java | 29 ++- 26 files changed, 863 insertions(+), 589 deletions(-) create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCapture.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTLambdaExpression.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCapture.java create mode 100644 core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLambdaExpression.java diff --git a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java index e8db2ea6d50..c4986dcb3e7 100644 --- a/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java +++ b/core/org.eclipse.cdt.core.tests/parser/org/eclipse/cdt/core/parser/tests/ast2/AST2CPPTests.java @@ -8820,4 +8820,44 @@ public class AST2CPPTests extends AST2BaseTest { IFunction f2= bh.assertNonProblem("f() {", 1); assertSame(f1, f2); } + + // struct C { + // void test() { + // int a; + // []{}; + // [=]{}; + // [&]{}; + // [this]{}; + // [=, this]{}; + // [&, this]{}; + // [a]{}; + // [=, a]{}; + // [&, a]{}; + // [a ...]{}; + // [](int p){}; + // [](int p) mutable {}; + // [](int p) mutable throw(int) {}; + // [](int p) mutable throw(int) -> char {}; + // [](int p) throw(int) {}; + // [](int p) -> char {}; + // } + // }; + public void testLambdaExpression_316307a() throws Exception { + String code= getAboveComment(); + parseAndCheckBindings(code); + } + + + // template void sort(T from, T to, C compare) {} + // float abs(float f); + // + // void abssort(float *x, unsigned N) { + // sort(x, x + N, [](float a, float b) { + // return abs(a) < abs(b); + // }); + // } + public void _testLambdaExpression_316307b() throws Exception { + String code= getAboveComment(); + parseAndCheckBindings(code); + } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTGenericVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTGenericVisitor.java index e829b22773c..b211f38f70b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTGenericVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTGenericVisitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2009 Wind River Systems, Inc. and others. + * Copyright (c) 2009, 2010 Wind River Systems, Inc. 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 @@ -13,10 +13,11 @@ package org.eclipse.cdt.core.dom.ast; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; 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.ICPPASTCapture; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; /** * Generic visitor for ast-nodes. @@ -36,17 +37,25 @@ public abstract class ASTGenericVisitor extends ASTVisitor implements ICPPASTVis return PROCESS_CONTINUE; } + @Override public int visit(ICPPASTBaseSpecifier baseSpecifier) { return genericVisit(baseSpecifier); } + @Override public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { return genericVisit(namespaceDefinition); } + @Override public int visit(ICPPASTTemplateParameter templateParameter) { return genericVisit(templateParameter); } + + @Override + public int visit(ICPPASTCapture capture) { + return genericVisit(capture); + } @Override public int visit(IASTArrayModifier arrayModifier) { @@ -118,26 +127,36 @@ public abstract class ASTGenericVisitor extends ASTVisitor implements ICPPASTVis return genericVisit(typeId); } + @Override public int visit(ICASTDesignator designator) { return genericVisit(designator); } + @Override public int leave(ICASTDesignator designator) { return genericLeave(designator); } + @Override public int leave(ICPPASTBaseSpecifier baseSpecifier) { return genericLeave(baseSpecifier); } + @Override public int leave(ICPPASTNamespaceDefinition namespaceDefinition) { return genericLeave(namespaceDefinition); } + @Override public int leave(ICPPASTTemplateParameter templateParameter) { return genericLeave(templateParameter); } + @Override + public int leave(ICPPASTCapture capture) { + return genericLeave(capture); + } + @Override public int leave(IASTArrayModifier arrayModifier) { return genericLeave(arrayModifier); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java index a59431bcacd..fd84a29e921 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/ASTVisitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -14,8 +14,11 @@ package org.eclipse.cdt.core.dom.ast; import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; -import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; +import org.eclipse.cdt.core.dom.ast.c.ICASTDesignator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode; /** @@ -23,9 +26,6 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTAmbiguousNode; * visit() methods implement a top-down traversal, and
* leave() methods implement a bottom-up traversal.
* - * To visit c- or c++-specific nodes you need to implement {@link ICASTVisitor} - * and/or {@link ICPPASTVisitor} in addition to deriving from this class. - * *

Clients may subclass.

*/ public abstract class ASTVisitor { @@ -103,28 +103,30 @@ public abstract class ASTVisitor { /** * Set this flag to visit designators of initializers. - * Your visitor needs to implement {@link ICASTVisitor} to make this work. */ public boolean shouldVisitDesignators = false; /** * Set this flag to visit base specifiers off composite types. - * Your visitor needs to implement {@link ICPPASTVisitor} to make this work. */ public boolean shouldVisitBaseSpecifiers = false; /** * Set this flag to visit to visit namespaces. - * Your visitor needs to implement {@link ICPPASTVisitor} to make this work. */ public boolean shouldVisitNamespaces = false; /** * Set this flag to visit template parameters. - * Your visitor needs to implement {@link ICPPASTVisitor} to make this work. */ public boolean shouldVisitTemplateParameters = false; + /** + * Set this flag to visit captures + * @since 5.3 + */ + public boolean shouldVisitCaptures= false; + /** * Per default inactive nodes are not visited. You can change that by setting * this flag to true. @@ -175,6 +177,7 @@ public abstract class ASTVisitor { public ASTVisitor(boolean visitNodes) { shouldVisitArrayModifiers= visitNodes; shouldVisitBaseSpecifiers= visitNodes; + shouldVisitCaptures= visitNodes; shouldVisitDeclarations= visitNodes; shouldVisitDeclarators= visitNodes; shouldVisitDeclSpecifiers= visitNodes; @@ -256,6 +259,41 @@ public abstract class ASTVisitor { return PROCESS_CONTINUE; } + /** + * @since 5.3 + */ + public int visit(ICPPASTBaseSpecifier baseSpecifier) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int visit(ICPPASTTemplateParameter templateParameter) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int visit(ICPPASTCapture capture) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int visit(ICASTDesignator designator) { + return PROCESS_CONTINUE; + } + // leave methods public int leave(IASTTranslationUnit tu) { return PROCESS_CONTINUE; @@ -318,6 +356,41 @@ public abstract class ASTVisitor { return PROCESS_CONTINUE; } + /** + * @since 5.3 + */ + public int leave(ICPPASTBaseSpecifier baseSpecifier) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int leave(ICPPASTNamespaceDefinition namespaceDefinition) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int leave(ICPPASTTemplateParameter templateParameter) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int leave(ICPPASTCapture capture) { + return PROCESS_CONTINUE; + } + + /** + * @since 5.3 + */ + public int leave(ICASTDesignator designator) { + return PROCESS_CONTINUE; + } + /** * @deprecated use {@link IASTTranslationUnit#getComments()}, instead. */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/CASTVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/CASTVisitor.java index f8f09166766..16f3a9bdfb7 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/CASTVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/c/CASTVisitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2008 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -15,17 +15,9 @@ package org.eclipse.cdt.core.dom.ast.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; /** - * This subclass of ASTVisitor that allows for better control in traversing C. + * @deprecated you can use {@link ASTVisitor}, instead. */ +@Deprecated public abstract class CASTVisitor extends ASTVisitor implements ICASTVisitor { - - public int visit(ICASTDesignator designator) { - return PROCESS_CONTINUE; - } - - - public int leave(ICASTDesignator designator) { - return PROCESS_CONTINUE; - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPASTVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPASTVisitor.java index c1a7e5661ee..77e5930afc3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPASTVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/CPPASTVisitor.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -12,13 +12,11 @@ package org.eclipse.cdt.core.dom.ast.cpp; import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; /** - * C++ specific visitor class. - *
The visit() methods implement a top-down traversal of the AST, - * and the leave() methods implement a bottom-up traversal. + * @deprecated you can use {@link ASTVisitor}, instead. */ +@Deprecated public abstract class CPPASTVisitor extends ASTVisitor implements ICPPASTVisitor { /** @@ -34,28 +32,4 @@ public abstract class CPPASTVisitor extends ASTVisitor implements ICPPASTVisitor public CPPASTVisitor(boolean visitNodes) { super(visitNodes); } - - public int visit(ICPPASTBaseSpecifier baseSpecifier) { - return PROCESS_CONTINUE; - } - - public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { - return PROCESS_CONTINUE; - } - - public int visit(ICPPASTTemplateParameter templateParameter) { - return PROCESS_CONTINUE; - } - - public int leave(ICPPASTBaseSpecifier baseSpecifier) { - return PROCESS_CONTINUE; - } - - public int leave(ICPPASTNamespaceDefinition namespaceDefinition) { - return PROCESS_CONTINUE; - } - - public int leave(ICPPASTTemplateParameter templateParameter) { - return PROCESS_CONTINUE; - } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCapture.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCapture.java new file mode 100644 index 00000000000..741685f8adb --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTCapture.java @@ -0,0 +1,57 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.IASTNode; + +/** + * Capture for a lambda expression, introduced in C++0x. + * + * @since 5.3 + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface ICPPASTCapture extends IASTNode, ICPPASTPackExpandable { + ASTNodeProperty IDENTIFIER = new ASTNodeProperty("ICPPASTCapture - IDENTIFIER [IASTName]"); //$NON-NLS-1$ + + ICPPASTCapture copy(); + + /** + * Returns whether the capture uses a leading ampersand. + */ + boolean isByReference(); + + /** + * Returns whether this capture is for the this pointer. + */ + boolean capturesThisPointer(); + + /** + * Returns the identifier for this capture or null, when + * this is captured. + */ + IASTName getIdentifier(); + + /** + * Not allowed on frozen AST. + * @see #isByReference() + */ + void setIsByReference(boolean value); + + /** + * Not allowed on frozen AST. Providing a null identifier indicates + * that this capture is for the this pointer. + * @see #getIdentifier() + */ + void setIdentifier(IASTName identifier); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTFunctionDeclarator.java index 2cc6b8828f5..d6e35734e17 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTFunctionDeclarator.java @@ -55,6 +55,18 @@ public interface ICPPASTFunctionDeclarator extends IASTStandardFunctionDeclarato */ public void setVolatile(boolean value); + /** + * When used as a lambda declarator, it can be mutable. + * @since 5.3 + */ + public boolean isMutable(); + + /** + * When used as a lambda declarator, it can be mutable. + * @since 5.3 + */ + public void setMutable(boolean value); + /** * Is the method pure virtual? */ diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTLambdaExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTLambdaExpression.java new file mode 100644 index 00000000000..41ecd0f3e98 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPASTLambdaExpression.java @@ -0,0 +1,80 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.core.dom.ast.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTNodeProperty; +import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; +import org.eclipse.cdt.core.dom.ast.IASTExpression; + +/** + * Lambda expression, introduced in C++0x. + * + * @since 5.3 + * @noextend This interface is not intended to be extended by clients. + * @noimplement This interface is not intended to be implemented by clients. + */ +public interface ICPPASTLambdaExpression extends IASTExpression { + ASTNodeProperty CAPTURE = new ASTNodeProperty("ICPPASTLambdaExpression - CAPTURE [ICPPASTCapture]"); //$NON-NLS-1$ + ASTNodeProperty DECLARATOR = new ASTNodeProperty("ICPPASTLambdaExpression - DECLARATOR [ICPPASTFunctionDeclarator]"); //$NON-NLS-1$ + ASTNodeProperty BODY = new ASTNodeProperty("ICPPASTLambdaExpression - BODY [IASTCompoundStatement]"); //$NON-NLS-1$ + + /** + * The capture default can be by copy, by reference or unspecified. + */ + enum CaptureDefault {UNSPECIFIED, BY_COPY, BY_REFERENCE} + + /** + * Returns the capture default for this lambda expression. + */ + CaptureDefault getCaptureDefault(); + + /** + * Returns the array of captures for this lambda expression. + */ + ICPPASTCapture[] getCaptures(); + + /** + * Returns the lambda declarator for this lambda expression, or null + * in case it was not specified. + */ + ICPPASTFunctionDeclarator getDeclarator(); + + /** + * Returns the compound statement of this lambda expression. Can be null + * when creating AST for content assist. + */ + IASTCompoundStatement getBody(); + + + /** + * Not allowed on frozen AST. + * @see #getCaptureDefault() + */ + void setCaptureDefault(CaptureDefault value); + + /** + * Not allowed on frozen AST. + * @see #getCaptures() + */ + void addCapture(ICPPASTCapture capture); + + /** + * Not allowed on frozen AST. + * @see #getDeclarator() + */ + void setDeclarator(ICPPASTFunctionDeclarator dtor); + + /** + * Not allowed on frozen AST. + * @see #getBody() + */ + void setBody(IASTCompoundStatement body); +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java index b29a6ce8219..1901bee166a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/cpp/ICPPNodeFactory.java @@ -60,18 +60,23 @@ public interface ICPPNodeFactory extends INodeFactory { */ public ICPPASTBinaryExpression newBinaryExpression(int op, IASTExpression expr1, IASTInitializerClause expr2); + /** + * @since 5.3 + */ + public ICPPASTCapture newCapture(); + public ICPPASTCastExpression newCastExpression(int operator, IASTTypeId typeId, IASTExpression operand); public ICPPASTCatchHandler newCatchHandler(IASTDeclaration decl, IASTStatement body); - - public ICPPASTCompositeTypeSpecifier newCompositeTypeSpecifier(int key, IASTName name); + public ICPPASTCompositeTypeSpecifier newCompositeTypeSpecifier(int key, IASTName name); + /** * @deprecated Replaced by {@link #newConstructorChainInitializer(IASTName, IASTInitializer)} */ @Deprecated public ICPPASTConstructorChainInitializer newConstructorChainInitializer(IASTName memberInitializerId, IASTExpression initializerValue); - + /** * @since 5.2 */ @@ -82,30 +87,30 @@ public interface ICPPNodeFactory extends INodeFactory { */ @Deprecated public ICPPASTConstructorInitializer newConstructorInitializer(IASTExpression exp); - + /** * @since 5.2 */ public ICPPASTConstructorInitializer newConstructorInitializer(IASTInitializerClause[] args); - + public ICPPASTConversionName newConversionName(IASTTypeId typeId); /** * @since 5.2 */ public ICPPASTDeclarator newDeclarator(IASTName name); - - public ICPPASTDeleteExpression newDeleteExpression(IASTExpression operand); + public ICPPASTDeleteExpression newDeleteExpression(IASTExpression operand); + public ICPPASTElaboratedTypeSpecifier newElaboratedTypeSpecifier(int kind, IASTName name); /** * @since 5.2 */ public ICPPASTEnumerationSpecifier newEnumerationSpecifier(boolean isScoped, IASTName name, ICPPASTDeclSpecifier baseType); - - public ICPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiation(IASTDeclaration declaration); + public ICPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiation(IASTDeclaration declaration); + /** * @deprecated Replaced by {@link #newExplicitTemplateInstantiation(IASTDeclaration)}. */ @@ -113,7 +118,7 @@ public interface ICPPNodeFactory extends INodeFactory { public org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiationGPP(IASTDeclaration declaration); public ICPPASTExpressionList newExpressionList(); - + /** * @since 5.2 */ @@ -122,10 +127,10 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTFieldReference newFieldReference(IASTName name, IASTExpression owner); public ICPPASTForStatement newForStatement(); - + public ICPPASTForStatement newForStatement(IASTStatement init, IASTDeclaration condition, IASTExpression iterationExpression, IASTStatement body); - + public ICPPASTForStatement newForStatement(IASTStatement init, IASTExpression condition, IASTExpression iterationExpression, IASTStatement body); @@ -151,22 +156,27 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTIfStatement newIfStatement(); public ICPPASTIfStatement newIfStatement(IASTDeclaration condition, IASTStatement then, IASTStatement elseClause); - + public ICPPASTIfStatement newIfStatement(IASTExpression condition, IASTStatement then, IASTStatement elseClause); /** * @since 5.2 */ public ICPPASTInitializerList newInitializerList(); + + /** + * @since 5.3 + */ + public ICPPASTLambdaExpression newLambdaExpression(); public ICPPASTLinkageSpecification newLinkageSpecification(String literal); - + public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep); - - public ICPPASTNamespaceAlias newNamespaceAlias(IASTName alias, IASTName qualifiedName); - - public ICPPASTNamespaceDefinition newNamespaceDefinition(IASTName name); + public ICPPASTNamespaceAlias newNamespaceAlias(IASTName alias, IASTName qualifiedName); + + public ICPPASTNamespaceDefinition newNamespaceDefinition(IASTName name); + /** * @deprecated Replaced by {@link #newNewExpression(IASTInitializerClause[], IASTInitializer, IASTTypeId)} */ @@ -179,21 +189,21 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTNewExpression newNewExpression(IASTInitializerClause[] placement, IASTInitializer initializer, IASTTypeId typeId); public ICPPASTOperatorName newOperatorName(char[] name); - + /** * Creates a new pack expansion expression for the given pattern. * @since 5.2 */ public ICPPASTPackExpansionExpression newPackExpansionExpression(IASTExpression pattern); - + public ICPPASTParameterDeclaration newParameterDeclaration(IASTDeclSpecifier declSpec, IASTDeclarator declarator); public IGPPASTPointer newPointerGPP(); - + public ICPPASTPointerToMember newPointerToMember(IASTName name); - + public IGPPASTPointerToMember newPointerToMemberGPP(IASTName name); - + public IASTProblemTypeId newProblemTypeId(IASTProblem problem); public ICPPASTQualifiedName newQualifiedName(); @@ -213,26 +223,26 @@ public interface ICPPNodeFactory extends INodeFactory { * @since 5.2 */ public IASTReturnStatement newReturnStatement(IASTInitializerClause retValue); - + public ICPPASTSimpleDeclSpecifier newSimpleDeclSpecifier(); - + /** * @deprecated Replaced by {@link #newSimpleDeclSpecifier()} */ @Deprecated public org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier newSimpleDeclSpecifierGPP(); - + + /** + * @since 5.2 + */ + public ICPPASTSimpleTypeConstructorExpression newSimpleTypeConstructorExpression(ICPPASTDeclSpecifier declSpec, IASTInitializer initializer); + /** * @deprecated Replaced by {@link #newSimpleTypeConstructorExpression(ICPPASTDeclSpecifier, IASTInitializer)} */ @Deprecated public ICPPASTSimpleTypeConstructorExpression newSimpleTypeConstructorExpression(int type, IASTExpression expression); - /** - * @since 5.2 - */ - public ICPPASTSimpleTypeConstructorExpression newSimpleTypeConstructorExpression(ICPPASTDeclSpecifier declSpec, IASTInitializer initializer); - public ICPPASTSimpleTypeTemplateParameter newSimpleTypeTemplateParameter(int type, IASTName name, IASTTypeId typeId); /** @@ -242,19 +252,19 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTStaticAssertDeclaration newStaticAssertion(IASTExpression condition, ICPPASTLiteralExpression message); public ICPPASTSwitchStatement newSwitchStatement(); - + public ICPPASTSwitchStatement newSwitchStatement(IASTDeclaration controller, IASTStatement body); public ICPPASTSwitchStatement newSwitchStatement(IASTExpression controlloer, IASTStatement body); - + public ICPPASTTemplateDeclaration newTemplateDeclaration(IASTDeclaration declaration); - + public ICPPASTTemplatedTypeTemplateParameter newTemplatedTypeTemplateParameter(IASTName name, IASTExpression defaultValue); public ICPPASTTemplateId newTemplateId(IASTName templateName); - + public ICPPASTTemplateSpecialization newTemplateSpecialization(IASTDeclaration declaration); - + /** * @deprecated Replaced by {@link #newTranslationUnit(IScanner)}. */ @@ -268,11 +278,11 @@ public interface ICPPNodeFactory extends INodeFactory { * @since 5.2 */ public ICPPASTTranslationUnit newTranslationUnit(IScanner scanner); - - public ICPPASTTryBlockStatement newTryBlockStatement(IASTStatement body); - - public ICPPASTNamedTypeSpecifier newTypedefNameSpecifier(IASTName name); + public ICPPASTTryBlockStatement newTryBlockStatement(IASTStatement body); + + public ICPPASTNamedTypeSpecifier newTypedefNameSpecifier(IASTName name); + /** * @since 5.2 */ @@ -285,7 +295,7 @@ public interface ICPPNodeFactory extends INodeFactory { */ @Deprecated public ICPPASTTypenameExpression newTypenameExpression(IASTName qualifiedName, IASTExpression expr, boolean isTemplate); - + public ICPPASTUnaryExpression newUnaryExpression(int operator, IASTExpression operand); public ICPPASTUsingDeclaration newUsingDeclaration(IASTName name); @@ -293,11 +303,10 @@ public interface ICPPNodeFactory extends INodeFactory { public ICPPASTUsingDirective newUsingDirective(IASTName name); public ICPPASTVisibilityLabel newVisibilityLabel(int visibility); - + public ICPPASTWhileStatement newWhileStatement(); public ICPPASTWhileStatement newWhileStatement(IASTDeclaration condition, IASTStatement body); public ICPPASTWhileStatement newWhileStatement(IASTExpression condition, IASTStatement body); - } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java index 02fa552fa6a..eb0375bd01b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/AbstractGNUSourceCodeParser.java @@ -1425,7 +1425,7 @@ public abstract class AbstractGNUSourceCodeParser implements ISourceCodeParser { * @throws BacktrackException * request a backtrack */ - protected IASTStatement functionBody() throws EndOfFileException, BacktrackException { + protected IASTCompoundStatement functionBody() throws EndOfFileException, BacktrackException { return compoundStatement(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDesignator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDesignator.java index ad45fc20754..1a86046514c 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDesignator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayDesignator.java @@ -1,12 +1,12 @@ /******************************************************************************* - * 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation + * John Camelon (IBM Rational Software) - Initial API and implementation * Yuan Zhang / Beth Tibbitts (IBM Research) * Markus Schorn (Wind River Systems) *******************************************************************************/ @@ -16,12 +16,11 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.c.ICASTArrayDesignator; -import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; /** - * @author jcamelon + * Implementation of array designators */ public class CASTArrayDesignator extends ASTNode implements ICASTArrayDesignator, IASTAmbiguityParent { @@ -57,23 +56,20 @@ public class CASTArrayDesignator extends ASTNode implements @Override public boolean accept( ASTVisitor action ){ - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).visit( this ) ){ + if (action.shouldVisitDesignators) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; } } - if( exp != null ) if( !exp.accept( action ) ) return false; + if (exp != null && !exp.accept(action)) + return false; - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).leave( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } - } - return true; + if (action.shouldVisitDesignators && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + + return true; } public void replace(IASTNode child, IASTNode other) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayRangeDesignator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayRangeDesignator.java index ab651efdc2b..6df3fb1806a 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayRangeDesignator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayRangeDesignator.java @@ -1,12 +1,12 @@ /******************************************************************************* - * 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation + * John Camelon (IBM Rational Software) - Initial API and implementation * Yuan Zhang / Beth Tibbitts (IBM Research) * Markus Schorn (Wind River Systems) *******************************************************************************/ @@ -15,13 +15,12 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor; import org.eclipse.cdt.core.dom.ast.gnu.c.IGCCASTArrayRangeDesignator; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; /** - * @author jcamelon + * Implementation of array range designators. */ public class CASTArrayRangeDesignator extends ASTNode implements IGCCASTArrayRangeDesignator, IASTAmbiguityParent { @@ -72,23 +71,21 @@ public class CASTArrayRangeDesignator extends ASTNode implements @Override public boolean accept( ASTVisitor action ){ - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).visit( this ) ){ + if (action.shouldVisitDesignators ) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; } } - if( floor != null ) if( !floor.accept( action ) ) return false; - if( ceiling != null ) if( !ceiling.accept( action ) ) return false; + if (floor != null && !floor.accept(action)) + return false; + if (ceiling != null && !ceiling.accept(action)) + return false; + + if (action.shouldVisitDesignators && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).leave( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } - } return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldDesignator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldDesignator.java index c541fdbf8e9..2cf4a58a08b 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldDesignator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTFieldDesignator.java @@ -1,12 +1,12 @@ /******************************************************************************* - * 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 * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM Rational Software - Initial API and implementation + * John Camelon (IBM Rational Software) - Initial API and implementation * Yuan Zhang / Beth Tibbitts (IBM Research) * Markus Schorn (Wind River Systems) *******************************************************************************/ @@ -15,11 +15,10 @@ package org.eclipse.cdt.internal.core.dom.parser.c; import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.c.ICASTFieldDesignator; -import org.eclipse.cdt.core.dom.ast.c.ICASTVisitor; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; /** - * @author jcamelon + * Implementation of field designators */ public class CASTFieldDesignator extends ASTNode implements ICASTFieldDesignator { @@ -54,21 +53,18 @@ public class CASTFieldDesignator extends ASTNode implements ICASTFieldDesignator @Override public boolean accept( ASTVisitor action ){ - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).visit( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } - } - if( name != null ) if( !name.accept( action ) ) return false; - if (action.shouldVisitDesignators && action instanceof ICASTVisitor) { - switch( ((ICASTVisitor)action).leave( this ) ){ + if (action.shouldVisitDesignators ) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; } } + if (name != null && !name.accept(action)) + return false; + if (action.shouldVisitDesignators && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + return true; } } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java index 0a696e4a71a..d794996e91d 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTBaseSpecifier.java @@ -21,7 +21,6 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.ICPPASTCompletionContext; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPClassType; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPSemantics; @@ -92,23 +91,20 @@ public class CPPASTBaseSpecifier extends ASTNode implements ICPPASTBaseSpecifier @Override public boolean accept(ASTVisitor action) { - if (action.shouldVisitBaseSpecifiers && action instanceof ICPPASTVisitor) { - switch (((ICPPASTVisitor)action).visit(this)) { + if (action.shouldVisitBaseSpecifiers) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; } } - if (!name.accept(action)) return false; + if (name != null && !name.accept(action)) + return false; + + if (action.shouldVisitBaseSpecifiers && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; - if (action.shouldVisitBaseSpecifiers && action instanceof ICPPASTVisitor) { - switch (((ICPPASTVisitor)action).leave(this)) { - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } - } return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCapture.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCapture.java new file mode 100644 index 00000000000..5907c783c61 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTCapture.java @@ -0,0 +1,92 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTName; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; + +/** + * Implementation for captures. + */ +public class CPPASTCapture extends ASTNode implements ICPPASTCapture { + private boolean fByReference; + private boolean fPackExpansion; + private IASTName fIdentifier; + + public CPPASTCapture() { + } + + public CPPASTCapture copy() { + final CPPASTCapture result= new CPPASTCapture(); + if (fIdentifier != null) + result.setIdentifier(fIdentifier.copy()); + result.fByReference= fByReference; + result.fPackExpansion= fPackExpansion; + result.setOffsetAndLength(this); + return result; + } + + public boolean capturesThisPointer() { + return fIdentifier == null; + } + + public boolean isByReference() { + return fByReference; + } + + public boolean isPackExpansion() { + return fPackExpansion; + } + + public IASTName getIdentifier() { + return fIdentifier; + } + + @Override + public boolean accept(ASTVisitor visitor) { + if (visitor.shouldVisitCaptures) { + switch (visitor.visit(this)) { + case ASTVisitor.PROCESS_ABORT : return false; + case ASTVisitor.PROCESS_SKIP : return true; + default : break; + } + } + + if (fIdentifier != null && !fIdentifier.accept(visitor)) + return false; + + if (visitor.shouldVisitCaptures && visitor.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + + return true; + } + + public void setIdentifier(IASTName identifier) { + assertNotFrozen(); + if (identifier != null) { + identifier.setParent(this); + identifier.setPropertyInParent(IDENTIFIER); + } + fIdentifier= identifier; + } + + public void setIsByReference(boolean value) { + assertNotFrozen(); + fByReference= value; + } + + public void setIsPackExpansion(boolean val) { + assertNotFrozen(); + fPackExpansion= val; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java index b78302e6c77..3a78876b859 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTFunctionDeclarator.java @@ -38,6 +38,7 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements ICPPAS private boolean pureVirtual; private boolean isVolatile; private boolean isConst; + private boolean isMutable; private ICPPFunctionScope scope = null; @@ -56,6 +57,7 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements ICPPAS copy.pureVirtual = pureVirtual; copy.isVolatile = isVolatile; copy.isConst = isConst; + copy.isMutable= isMutable; for(IASTParameterDeclaration param : getParameters()) copy.addParameterDeclaration(param == null ? null : param.copy()); @@ -110,6 +112,15 @@ public class CPPASTFunctionDeclarator extends CPPASTDeclarator implements ICPPAS this.isVolatile = value; } + public boolean isMutable() { + return isMutable; + } + + public void setMutable(boolean value) { + assertNotFrozen(); + this.isMutable = value; + } + public IASTTypeId[] getExceptionSpecification() { return typeIds= ArrayUtil.trim(typeIds); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLambdaExpression.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLambdaExpression.java new file mode 100644 index 00000000000..72832388ab4 --- /dev/null +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTLambdaExpression.java @@ -0,0 +1,144 @@ +/******************************************************************************* + * Copyright (c) 2010 Wind River Systems, Inc. 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 + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Markus Schorn - initial API and implementation + *******************************************************************************/ +package org.eclipse.cdt.internal.core.dom.parser.cpp; + +import org.eclipse.cdt.core.dom.ast.ASTVisitor; +import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IType; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCapture; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTFunctionDeclarator; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression; +import org.eclipse.cdt.core.parser.util.ArrayUtil; +import org.eclipse.cdt.internal.core.dom.parser.ASTNode; + +/** + * Implementation for lambda expressions. + */ +public class CPPASTLambdaExpression extends ASTNode implements ICPPASTLambdaExpression { + private static final ICPPASTCapture[] NO_CAPTURES = {}; + + private CaptureDefault fCaptureDefault; + private ICPPASTCapture[] fCaptures; + private ICPPASTFunctionDeclarator fDeclarator; + private IASTCompoundStatement fBody; + + public CPPASTLambdaExpression() { + fCaptureDefault= CaptureDefault.UNSPECIFIED; + } + + /* (non-Javadoc) + * @see org.eclipse.cdt.core.dom.ast.IASTExpression#copy() + */ + public IASTExpression copy() { + CPPASTLambdaExpression result= new CPPASTLambdaExpression(); + result.fCaptureDefault= fCaptureDefault; + if (fCaptures != null) { + for (ICPPASTCapture capture : fCaptures) { + if (capture != null) { + result.addCapture(capture.copy()); + } + } + } + if (fDeclarator != null) { + result.setDeclarator(fDeclarator.copy()); + } + if (fBody != null) { + result.setBody(fBody.copy()); + } + + result.setOffsetAndLength(this); + return result; + } + + @Override + public boolean accept(ASTVisitor visitor) { + if (visitor.shouldVisitExpressions) { + switch (visitor.visit(this)) { + case ASTVisitor.PROCESS_ABORT : return false; + case ASTVisitor.PROCESS_SKIP : return true; + default : break; + } + } + + if (fCaptures != null) { + for (ICPPASTCapture cap : fCaptures) { + if (cap != null && !cap.accept(visitor)) + return false; + } + } + if (fDeclarator != null && !fDeclarator.accept(visitor)) + return false; + if (fBody != null && !fBody.accept(visitor)) + return false; + + if (visitor.shouldVisitExpressions && visitor.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + + return true; + } + + public IASTCompoundStatement getBody() { + return fBody; + } + + public CaptureDefault getCaptureDefault() { + return fCaptureDefault; + } + + public ICPPASTCapture[] getCaptures() { + if (fCaptures == null) + return NO_CAPTURES; + return fCaptures= ArrayUtil.trim(fCaptures); + } + + public ICPPASTFunctionDeclarator getDeclarator() { + return fDeclarator; + } + + public void addCapture(ICPPASTCapture capture) { + assertNotFrozen(); + capture.setParent(this); + capture.setPropertyInParent(CAPTURE); + if (fCaptures == null) { + fCaptures= new ICPPASTCapture[] {capture, null}; + } else { + fCaptures= ArrayUtil.append(fCaptures, capture); + } + } + + public void setBody(IASTCompoundStatement body) { + assertNotFrozen(); + body.setParent(this); + body.setPropertyInParent(BODY); + fBody= body; + } + + public void setCaptureDefault(CaptureDefault value) { + fCaptureDefault= value; + } + + public void setDeclarator(ICPPASTFunctionDeclarator dtor) { + assertNotFrozen(); + dtor.setParent(this); + dtor.setPropertyInParent(DECLARATOR); + fDeclarator= dtor; + } + + public IType getExpressionType() { + // mstodo type for lambda expressions + return null; + } + + public boolean isLValue() { + return false; + } +} diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java index c7c68830420..357b7774c22 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTNamespaceDefinition.java @@ -18,7 +18,6 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; import org.eclipse.cdt.core.dom.ast.cpp.ICPPNamespace; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -111,8 +110,8 @@ public class CPPASTNamespaceDefinition extends ASTNode implements @Override public boolean accept(ASTVisitor action) { - if (action.shouldVisitNamespaces && action instanceof ICPPASTVisitor) { - switch (((ICPPASTVisitor) action).visit(this)) { + if (action.shouldVisitNamespaces) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; @@ -127,8 +126,7 @@ public class CPPASTNamespaceDefinition extends ASTNode implements if (!decl.accept(action)) return false; } - if (action.shouldVisitNamespaces && action instanceof ICPPASTVisitor && - ((ICPPASTVisitor) action).leave(this) == ASTVisitor.PROCESS_ABORT) + if (action.shouldVisitNamespaces && action.leave(this) == ASTVisitor.PROCESS_ABORT) return false; return true; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTParameterDeclaration.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTParameterDeclaration.java index e7b367ca3a8..647efb9c038 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTParameterDeclaration.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTParameterDeclaration.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -15,6 +15,7 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclarator; import org.eclipse.cdt.core.dom.ast.IASTNode; +import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTParameterDeclaration; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -79,23 +80,22 @@ public class CPPASTParameterDeclaration extends ASTNode implements ICPPASTParame @Override public boolean accept( ASTVisitor action ){ - if( action.shouldVisitParameterDeclarations ){ - switch( action.visit( this ) ){ + if (action.shouldVisitParameterDeclarations) { + switch (action.visit((IASTParameterDeclaration) this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; } } - if( fDeclSpec != null ) if( !fDeclSpec.accept( action ) ) return false; - if( fDeclarator != null ) if( !fDeclarator.accept( action ) ) return false; + if (fDeclSpec != null && !fDeclSpec.accept(action)) + return false; + if (fDeclarator != null && !fDeclarator.accept(action)) + return false; - if( action.shouldVisitParameterDeclarations ){ - switch( action.leave( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } + if (action.shouldVisitParameterDeclarations && + action.leave((IASTParameterDeclaration) this) == ASTVisitor.PROCESS_ABORT) { + return false; } return true; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java index 5c928c1cac2..2b8499140da 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTSimpleTypeTemplateParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -15,7 +15,6 @@ import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTTypeId; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTSimpleTypeTemplateParameter; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; /** @@ -94,25 +93,23 @@ public class CPPASTSimpleTypeTemplateParameter extends ASTNode implements ICPPAS @Override public boolean accept(ASTVisitor action) { - if (action.shouldVisitTemplateParameters && action instanceof ICPPASTVisitor) { - switch (((ICPPASTVisitor) action).visit(this)) { + if (action.shouldVisitTemplateParameters) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT: return false; case ASTVisitor.PROCESS_SKIP: return true; default : break; } } - if (fName != null) if (!fName.accept(action)) return false; - if (fTypeId != null) if (!fTypeId.accept(action)) return false; + if (fName != null && !fName.accept(action)) + return false; + if (fTypeId != null && !fTypeId.accept(action)) + return false; - if (action.shouldVisitTemplateParameters && action instanceof ICPPASTVisitor) { - switch (((ICPPASTVisitor) action).leave(this)) { - case ASTVisitor.PROCESS_ABORT: return false; - case ASTVisitor.PROCESS_SKIP: return true; - default : break; - } - } - return true; + if (action.shouldVisitTemplateParameters && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + + return true; } public int getRoleForName(IASTName n) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java index 878116579de..61108f715b3 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTTemplatedTypeTemplateParameter.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2004, 2009 IBM Corporation and others. + * Copyright (c) 2004, 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 @@ -17,7 +17,6 @@ import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplatedTypeTemplateParameter; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTVisitor; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguityParent; @@ -112,8 +111,8 @@ public class CPPASTTemplatedTypeTemplateParameter extends ASTNode implements @Override public boolean accept( ASTVisitor action ){ - if (action.shouldVisitTemplateParameters && action instanceof ICPPASTVisitor) { - switch( ((ICPPASTVisitor)action).visit( this ) ){ + if (action.shouldVisitTemplateParameters) { + switch (action.visit(this)) { case ASTVisitor.PROCESS_ABORT : return false; case ASTVisitor.PROCESS_SKIP : return true; default : break; @@ -121,20 +120,19 @@ public class CPPASTTemplatedTypeTemplateParameter extends ASTNode implements } ICPPASTTemplateParameter [] ps = getTemplateParameters(); - for ( int i = 0; i < ps.length; i++ ) { - if( !ps[i].accept( action ) ) return false; - } - if( fName != null ) if( !fName.accept( action ) ) return false; - if( fDefaultValue != null ) if( !fDefaultValue.accept( action ) ) return false; + for (int i = 0; i < ps.length; i++) { + if (!ps[i].accept(action)) + return false; + } + if (fName != null && !fName.accept(action)) + return false; + if (fDefaultValue != null && !fDefaultValue.accept(action)) + return false; - if (action.shouldVisitTemplateParameters && action instanceof ICPPASTVisitor) { - switch( ((ICPPASTVisitor)action).leave( this ) ){ - case ASTVisitor.PROCESS_ABORT : return false; - case ASTVisitor.PROCESS_SKIP : return true; - default : break; - } - } - return true; + if (action.shouldVisitTemplateParameters && action.leave(this) == ASTVisitor.PROCESS_ABORT) + return false; + + return true; } public int getRoleForName(IASTName n) { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java index 68967c59523..88226c2ed51 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPNodeFactory.java @@ -50,6 +50,7 @@ import org.eclipse.cdt.core.dom.ast.IASTTypeIdInitializerExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArraySubscriptExpression; 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.ICPPASTCompositeTypeSpecifier; @@ -73,6 +74,7 @@ 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.ICPPASTInitializerList; +import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLambdaExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLinkageSpecification; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; @@ -160,6 +162,10 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { return new CPPASTBreakStatement(); } + public ICPPASTCapture newCapture() { + return new CPPASTCapture(); + } + public IASTCaseStatement newCaseStatement(IASTExpression expr) { return new CPPASTCaseStatement(expr); } @@ -209,19 +215,19 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IASTContinueStatement newContinueStatement() { return new CPPASTContinueStatement(); } - + public ICPPASTConversionName newConversionName(IASTTypeId typeId) { return new CPPASTConversionName(typeId); } - + public IASTDeclarationStatement newDeclarationStatement(IASTDeclaration declaration) { return new CPPASTDeclarationStatement(declaration); } - + public ICPPASTDeclarator newDeclarator(IASTName name) { return new CPPASTDeclarator(name); } - + public IASTDefaultStatement newDefaultStatement() { return new CPPASTDefaultStatement(); } @@ -263,7 +269,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTExplicitTemplateInstantiation newExplicitTemplateInstantiationGPP(IASTDeclaration declaration) { return new GPPASTExplicitTemplateInstantiation(declaration); } - + public ICPPASTExpressionList newExpressionList() { return new CPPASTExpressionList(); } @@ -271,15 +277,15 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IASTExpressionStatement newExpressionStatement(IASTExpression expression) { return new CPPASTExpressionStatement(expression); } - + public ICPPASTFieldDeclarator newFieldDeclarator(IASTName name, IASTExpression bitFieldSize) { return new CPPASTFieldDeclarator(name, bitFieldSize); } - + public ICPPASTFieldReference newFieldReference(IASTName name, IASTExpression owner) { return new CPPASTFieldReference(name, owner); } - + public ICPPASTForStatement newForStatement() { return new CPPASTForStatement(); } @@ -288,12 +294,12 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { IASTExpression iterationExpression, IASTStatement body) { return new CPPASTForStatement(init, condition, iterationExpression, body); } - + public ICPPASTForStatement newForStatement(IASTStatement init, IASTExpression condition, IASTExpression iterationExpr, IASTStatement body) { return new CPPASTForStatement(init, condition, iterationExpr, body); } - + @Deprecated public ICPPASTFunctionCallExpression newFunctionCallExpression(IASTExpression idExpr, IASTExpression argList) { CPPASTFunctionCallExpression result = new CPPASTFunctionCallExpression(idExpr, null); @@ -318,7 +324,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { IASTStatement bodyStatement) { return new CPPASTFunctionWithTryBlock(declSpecifier, declarator, bodyStatement); } - + public IGNUASTCompoundStatementExpression newGNUCompoundStatementExpression(IASTCompoundStatement compoundStatement) { return new CPPASTCompoundStatementExpression(compoundStatement); } @@ -326,7 +332,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IASTGotoStatement newGotoStatement(IASTName name) { return new CPPASTGotoStatement(name); } - + public IASTIdExpression newIdExpression(IASTName name) { return new CPPASTIdExpression(name); } @@ -351,10 +357,14 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTInitializerList newInitializerList() { return new CPPASTInitializerList(); } - + public IASTLabelStatement newLabelStatement(IASTName name, IASTStatement nestedStatement) { return new CPPASTLabelStatement(name, nestedStatement); } + + public ICPPASTLambdaExpression newLambdaExpression() { + return new CPPASTLambdaExpression(); + } public ICPPASTLinkageSpecification newLinkageSpecification(String literal) { return new CPPASTLinkageSpecification(literal); @@ -363,7 +373,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTLiteralExpression newLiteralExpression(int kind, String rep) { return new CPPASTLiteralExpression(kind, rep.toCharArray()); } - + public IASTName newName() { return new CPPASTName(); } @@ -407,7 +417,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTParameterDeclaration newParameterDeclaration(IASTDeclSpecifier declSpec, IASTDeclarator declarator) { return new CPPASTParameterDeclaration(declSpec, declarator); } - + public IASTPointer newPointer() { return new CPPASTPointer(); } @@ -415,7 +425,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IGPPASTPointer newPointerGPP() { return new GPPASTPointer(); } - + public ICPPASTPointerToMember newPointerToMember(IASTName name) { return new CPPASTPointerToMember(name); } @@ -455,7 +465,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTReferenceOperator newReferenceOperator(boolean isRValueReference) { return new CPPASTReferenceOperator(isRValueReference); } - + public IASTReturnStatement newReturnStatement(IASTExpression retValue) { return new CPPASTReturnStatement(retValue); } @@ -463,11 +473,11 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IASTReturnStatement newReturnStatement(IASTInitializerClause retValue) { return new CPPASTReturnStatement(retValue); } - + public IASTSimpleDeclaration newSimpleDeclaration(IASTDeclSpecifier declSpecifier) { return new CPPASTSimpleDeclaration(declSpecifier); } - + public ICPPASTSimpleDeclSpecifier newSimpleDeclSpecifier() { return new CPPASTSimpleDeclSpecifier(); } @@ -476,7 +486,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public org.eclipse.cdt.core.dom.ast.gnu.cpp.IGPPASTSimpleDeclSpecifier newSimpleDeclSpecifierGPP() { return new GPPASTSimpleDeclSpecifier(); } - + public ICPPASTSimpleTypeConstructorExpression newSimpleTypeConstructorExpression( ICPPASTDeclSpecifier declSpec, IASTInitializer initializer) { return new CPPASTSimpleTypeConstructorExpression(declSpec, initializer); @@ -506,7 +516,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTSwitchStatement newSwitchStatement(IASTDeclaration controller, IASTStatement body) { return new CPPASTSwitchStatement(controller, body); } - + public ICPPASTSwitchStatement newSwitchStatement(IASTExpression controller, IASTStatement body) { return new CPPASTSwitchStatement(controller, body); } @@ -514,7 +524,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTTemplateDeclaration newTemplateDeclaration(IASTDeclaration declaration) { return new CPPASTTemplateDeclaration(declaration); } - + public ICPPASTTemplatedTypeTemplateParameter newTemplatedTypeTemplateParameter(IASTName name, IASTExpression defaultValue) { return new CPPASTTemplatedTypeTemplateParameter(name, defaultValue); } @@ -555,7 +565,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public ICPPASTTypeId newTypeId(IASTDeclSpecifier declSpecifier, IASTDeclarator declarator) { return new CPPASTTypeId(declSpecifier, declarator); } - + public ICPPASTTypeIdExpression newTypeIdExpression(int operator, IASTTypeId typeId) { return new CPPASTTypeIdExpression(operator, typeId); } @@ -563,7 +573,7 @@ public class CPPNodeFactory extends NodeFactory implements ICPPNodeFactory { public IASTTypeIdInitializerExpression newTypeIdInitializerExpression(IASTTypeId typeId, IASTInitializer initializer) { return new CPPASTTypeIdInitializerExpression(typeId, initializer); } - + @Deprecated public org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTypenameExpression newTypenameExpression(IASTName qualifiedName, IASTExpression expr, boolean isTemplate) { return new CPPASTTypenameExpression(qualifiedName, expr); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java index e58904a2beb..2fb119c3393 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/GNUCPPSourceParser.java @@ -61,6 +61,7 @@ import org.eclipse.cdt.core.dom.ast.IBinding; import org.eclipse.cdt.core.dom.ast.IScope; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTAmbiguousTemplateArgument; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTArrayDeclarator; +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.ICPPASTCompositeTypeSpecifier; @@ -82,6 +83,8 @@ 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.ICPPASTInitializerList; +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.ICPPASTLiteralExpression; import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamedTypeSpecifier; @@ -1414,6 +1417,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { + ((ASTNode) name).getLength() - ((ASTNode) name).getOffset()); return idExpression; } + case IToken.tLBRACKET: + return lambdaExpression(); + default: IToken la = LA(1); int startingOffset = la.getOffset(); @@ -1435,11 +1441,87 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { } IToken t= consume(); ICPPASTLiteralExpression r= nodeFactory.newLiteralExpression(IASTLiteralExpression.lk_string_literal, t.getImage()); - setRange(r, t.getOffset(), t.getEndOffset()); - return r; + return setRange(r, t.getOffset(), t.getEndOffset()); } - protected IASTExpression specialCastExpression(int kind) throws EndOfFileException, BacktrackException { + private IASTExpression lambdaExpression() throws EndOfFileException, BacktrackException { + final int offset= LA().getOffset(); + + ICPPASTLambdaExpression lambdaExpr= nodeFactory.newLambdaExpression(); + + // Lambda introducer + consume(IToken.tLBRACKET); + boolean needComma= false; + switch(LT(1)) { + case IToken.tASSIGN: + lambdaExpr.setCaptureDefault(CaptureDefault.BY_COPY); + consume(); + needComma= true; + break; + case IToken.tAMPER: + final int lt2 = LT(2); + if (lt2 == IToken.tCOMMA || lt2 == IToken.tRBRACKET) { + lambdaExpr.setCaptureDefault(CaptureDefault.BY_REFERENCE); + consume(); + needComma= true; + } + break; + } + loop: for(;;) { + switch (LT(1)) { + case IToken.tEOC: + return setRange(lambdaExpr, offset, LA().getEndOffset()); + case IToken.tRBRACKET: + consume(); + break loop; + } + + if (needComma) { + consume(IToken.tCOMMA); + } + + ICPPASTCapture cap= capture(); + lambdaExpr.addCapture(cap); + needComma= true; + } + + if (LT(1) == IToken.tLPAREN) { + ICPPASTFunctionDeclarator dtor = functionDeclarator(true); + lambdaExpr.setDeclarator(dtor); + if (LT(1) == IToken.tEOC) + return setRange(lambdaExpr, offset, calculateEndOffset(dtor)); + } + + IASTCompoundStatement body = functionBody(); + lambdaExpr.setBody(body); + return setRange(lambdaExpr, offset, calculateEndOffset(body)); + } + + private ICPPASTCapture capture() throws EndOfFileException, BacktrackException { + final int offset= LA().getOffset(); + final ICPPASTCapture result = nodeFactory.newCapture(); + + switch (LT(1)) { + case IToken.t_this: + return setRange(result, offset, consume().getEndOffset()); + case IToken.tAMPER: + consume(); + result.setIsByReference(true); + break; + } + + final IASTName identifier= identifier(); + result.setIdentifier(identifier); + + if (LT(1) == IToken.tELLIPSIS) { + result.setIsPackExpansion(true); + return setRange(result, offset, consume().getEndOffset()); + } + + return setRange(result, offset, calculateEndOffset(identifier)); + } + + protected IASTExpression specialCastExpression(int kind) throws EndOfFileException, BacktrackException { final int offset = LA(1).getOffset(); final int optype= consume().getType(); consume(IToken.tLT); @@ -3342,7 +3424,7 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { switch (lt1) { case IToken.tLPAREN: if (option.fAllowFunctions && strategy == DtorStrategy.PREFER_FUNCTION) { - result= functionDeclarator(); + result= functionDeclarator(false); setDeclaratorID(result, hasEllipsis, declaratorName, nestedDeclarator); } break loop; @@ -3413,9 +3495,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { /** * Parse a function declarator starting with the left parenthesis. */ - private ICPPASTDeclarator functionDeclarator() throws EndOfFileException, BacktrackException { + private ICPPASTFunctionDeclarator functionDeclarator(boolean isLambdaDeclarator) throws EndOfFileException, BacktrackException { IToken last = consume(IToken.tLPAREN); - int startOffset= last.getOffset(); + final int startOffset= last.getOffset(); int endOffset= last.getEndOffset(); final ICPPASTFunctionDeclarator fc = nodeFactory.newFunctionDeclarator(null); @@ -3462,18 +3544,25 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { __attribute_decl_seq(supportAttributeSpecifiers, false); // cv-qualifiers - cvloop: while(true) { - switch (LT(1)) { - case IToken.t_const: - fc.setConst(true); + if (isLambdaDeclarator) { + if (LT(1) == IToken.t_mutable) { + fc.setMutable(true); endOffset= consume().getEndOffset(); - break; - case IToken.t_volatile: - fc.setVolatile(true); - endOffset= consume().getEndOffset(); - break; - default: - break cvloop; + } + } else { + cvloop: while(true) { + switch (LT(1)) { + case IToken.t_const: + fc.setConst(true); + endOffset= consume().getEndOffset(); + break; + case IToken.t_volatile: + fc.setVolatile(true); + endOffset= consume().getEndOffset(); + break; + default: + break cvloop; + } } } @@ -3524,10 +3613,9 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { IASTTypeId typeId= typeId(DeclarationOptions.TYPEID_TRAILING_RETURN_TYPE); fc.setTrailingReturnType(typeId); endOffset= calculateEndOffset(typeId); - } + } - setRange(fc, startOffset, endOffset); - return fc; + return setRange(fc, startOffset, endOffset); } /** @@ -4110,11 +4198,13 @@ public class GNUCPPSourceParser extends AbstractGNUSourceCodeParser { @Override - protected IASTStatement functionBody() throws EndOfFileException, BacktrackException { + protected IASTCompoundStatement functionBody() throws EndOfFileException, BacktrackException { ++functionBodyCount; - IASTStatement s = super.functionBody(); - --functionBodyCount; - return s; + try { + return super.functionBody(); + } finally { + --functionBodyCount; + } } protected IASTStatement parseSwitchStatement() throws EndOfFileException, BacktrackException { diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FindNodeByImageLocation.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FindNodeByImageLocation.java index 669edb6b360..c75b8e933c4 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FindNodeByImageLocation.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/parser/scanner/FindNodeByImageLocation.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2008 Wind River Systems, Inc. and others. + * Copyright (c) 2008, 2010 Wind River Systems, Inc. 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 @@ -10,26 +10,11 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.parser.scanner; -import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; +import org.eclipse.cdt.core.dom.ast.ASTGenericVisitor; import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTDeclarator; -import org.eclipse.cdt.core.dom.ast.IASTExpression; import org.eclipse.cdt.core.dom.ast.IASTImageLocation; -import org.eclipse.cdt.core.dom.ast.IASTInitializer; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTProblem; -import org.eclipse.cdt.core.dom.ast.IASTStatement; -import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.IASTTypeId; -import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; -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.CPPASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; import org.eclipse.cdt.internal.core.dom.parser.ASTNodeSpecification; @@ -37,36 +22,27 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTNodeSpecification; * Visitor to select nodes by image-location. * @since 5.0 */ -public class FindNodeByImageLocation extends CPPASTVisitor implements ICASTVisitor { +public class FindNodeByImageLocation extends ASTGenericVisitor { private final int fOffset; private final int fLength; private final ASTNodeSpecification fNodeSpec; public FindNodeByImageLocation(int offset, int length, ASTNodeSpecification nodeSpec) { + super(!nodeSpec.requiresClass(IASTName.class)); fNodeSpec= nodeSpec; fOffset = offset; fLength = length; shouldVisitNames = true; shouldVisitDeclarations= true; - - shouldVisitInitializers= - shouldVisitParameterDeclarations= - shouldVisitDeclarators= - shouldVisitDeclSpecifiers= - shouldVisitDesignators= - shouldVisitEnumerators= - shouldVisitExpressions= - shouldVisitStatements= - shouldVisitTypeIds= - shouldVisitEnumerators= - shouldVisitBaseSpecifiers= - shouldVisitNamespaces= - shouldVisitTemplateParameters= - shouldVisitTranslationUnit= !nodeSpec.requiresClass(IASTName.class); } - public int processNode(IASTNode node) { + @Override + protected int genericVisit(IASTNode node) { + return processNode(node); + } + + private int processNode(IASTNode node) { if (node instanceof ASTNode) { final ASTNode astNode = (ASTNode) node; if (astNode.getOffset() > fOffset+fLength || astNode.getOffset() + astNode.getLength() < fOffset) { @@ -93,89 +69,10 @@ public class FindNodeByImageLocation extends CPPASTVisitor implements ICASTVisit return processNode(declaration); } - @Override - public int visit(IASTDeclarator declarator) { - return processNode(declarator); - } - - @Override - public int visit(IASTDeclSpecifier declSpec) { - return processNode(declSpec); - } - - @Override - public int visit(IASTEnumerator enumerator) { - return processNode(enumerator); - } - - @Override - public int visit(IASTExpression expression) { - return processNode(expression); - } - - @Override - public int visit(IASTInitializer initializer) { - return processNode(initializer); - } - @Override public int visit(IASTName name) { if (name.toString() != null) return processNode(name); return PROCESS_CONTINUE; } - - @Override - public int visit(IASTParameterDeclaration parameterDeclaration) { - return processNode(parameterDeclaration); - } - - @Override - public int visit(IASTStatement statement) { - return processNode(statement); - } - - @Override - public int visit(IASTTypeId typeId) { - return processNode(typeId); - } - - @Override - public int visit(ICPPASTBaseSpecifier baseSpecifier) { - return processNode(baseSpecifier); - } - - @Override - public int visit(ICPPASTNamespaceDefinition namespaceDefinition) { - return processNode(namespaceDefinition); - } - - @Override - public int visit(ICPPASTTemplateParameter templateParameter) { - return processNode(templateParameter); - } - - @Override - public int visit(IASTProblem problem) { - return processNode(problem); - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.c.CVisitor.CBaseVisitorAction#processDesignator(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator) - */ - public int visit(ICASTDesignator designator) { - return processNode(designator); - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.c.ICASTVisitor#leave(org.eclipse.cdt.core.dom.ast.c.ICASTDesignator) - */ - public int leave(ICASTDesignator designator) { - return PROCESS_CONTINUE; - } - - @Override - public int visit(IASTTranslationUnit tu) { - return processNode(tu); - } } \ No newline at end of file diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java index 7be0018be2f..c196ea724b2 100644 --- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/CPPPopulateASTViewAction.java @@ -12,28 +12,15 @@ package org.eclipse.cdt.ui.tests.DOMAST; import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; -import org.eclipse.cdt.core.dom.ast.IASTDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTDeclarator; -import org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator; -import org.eclipse.cdt.core.dom.ast.IASTExpression; -import org.eclipse.cdt.core.dom.ast.IASTInitializer; +import org.eclipse.cdt.core.dom.ast.ASTGenericVisitor; import org.eclipse.cdt.core.dom.ast.IASTName; import org.eclipse.cdt.core.dom.ast.IASTNode; -import org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration; -import org.eclipse.cdt.core.dom.ast.IASTPointerOperator; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIncludeStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorMacroDefinition; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement; import org.eclipse.cdt.core.dom.ast.IASTProblem; import org.eclipse.cdt.core.dom.ast.IASTProblemHolder; -import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit; -import org.eclipse.cdt.core.dom.ast.IASTTypeId; -import org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition; -import org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter; import org.eclipse.cdt.core.parser.util.ArrayUtil; import org.eclipse.cdt.internal.core.dom.parser.ASTNode; @@ -41,29 +28,16 @@ import org.eclipse.cdt.internal.core.dom.parser.ASTNode; /** * @author dsteffle */ -public class CPPPopulateASTViewAction extends CPPASTVisitor implements IPopulateDOMASTAction { +public class CPPPopulateASTViewAction extends ASTGenericVisitor implements IPopulateDOMASTAction { private static final int INITIAL_PROBLEM_SIZE = 4; - { - shouldVisitNames = true; - shouldVisitDeclarations = true; - shouldVisitInitializers = true; - shouldVisitParameterDeclarations = true; - shouldVisitDeclarators = true; - shouldVisitDeclSpecifiers = true; - shouldVisitExpressions = true; - shouldVisitStatements = true; - shouldVisitTypeIds = true; - shouldVisitEnumerators = true; - shouldVisitBaseSpecifiers = true; - shouldVisitNamespaces = true; - shouldVisitTemplateParameters= true; - } DOMASTNodeParent root = null; IProgressMonitor monitor = null; IASTProblem[] astProblems = new IASTProblem[INITIAL_PROBLEM_SIZE]; public CPPPopulateASTViewAction(IASTTranslationUnit tu, IProgressMonitor monitor) { + super(true); + shouldVisitTranslationUnit= false; root = new DOMASTNodeParent(tu); this.monitor = monitor; } @@ -131,199 +105,22 @@ public class CPPPopulateASTViewAction extends CPPASTVisitor implements IPopulate return tree; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclaration(org.eclipse.cdt.core.dom.ast.IASTDeclaration) - */ @Override - public int visit(IASTDeclaration declaration) { - DOMASTNodeLeaf temp = addRoot(declaration); - if (temp == null) + public int genericVisit(IASTNode declaration) { + if (addRoot(declaration) == null) return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; + + return PROCESS_CONTINUE; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclarator(org.eclipse.cdt.core.dom.ast.IASTDeclarator) - */ - @Override - public int visit(IASTDeclarator declarator) { - DOMASTNodeLeaf temp = addRoot(declarator); - - IASTPointerOperator[] ops = declarator.getPointerOperators(); - for (IASTPointerOperator op : ops) - addRoot(op); - - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processBaseSpecifier(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTCompositeTypeSpecifier.ICPPASTBaseSpecifier) - */ - @Override - public int visit(ICPPASTBaseSpecifier specifier) { - DOMASTNodeLeaf temp = addRoot(specifier); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processDeclSpecifier(org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier) - */ - @Override - public int visit(IASTDeclSpecifier declSpec) { - DOMASTNodeLeaf temp = addRoot(declSpec); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processEnumerator(org.eclipse.cdt.core.dom.ast.IASTEnumerationSpecifier.IASTEnumerator) - */ - @Override - public int visit(IASTEnumerator enumerator) { - DOMASTNodeLeaf temp = addRoot(enumerator); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processExpression(org.eclipse.cdt.core.dom.ast.IASTExpression) - */ - @Override - public int visit(IASTExpression expression) { - DOMASTNodeLeaf temp = addRoot(expression); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processInitializer(org.eclipse.cdt.core.dom.ast.IASTInitializer) - */ - @Override - public int visit(IASTInitializer initializer) { - DOMASTNodeLeaf temp = addRoot(initializer); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processName(org.eclipse.cdt.core.dom.ast.IASTName) - */ @Override public int visit(IASTName name) { - DOMASTNodeLeaf temp = null; - if (name.toString() != null) - temp = addRoot(name); - else - return PROCESS_CONTINUE; - - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; + if (name.toString() != null) { + return genericVisit(name); + } + return PROCESS_CONTINUE; } - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processNamespace(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTNamespaceDefinition) - */ - @Override - public int visit(ICPPASTNamespaceDefinition namespace) { - DOMASTNodeLeaf temp = addRoot(namespace); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processParameterDeclaration(org.eclipse.cdt.core.dom.ast.IASTParameterDeclaration) - */ - @Override - public int visit( - IASTParameterDeclaration parameterDeclaration) { - DOMASTNodeLeaf temp = addRoot(parameterDeclaration); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processStatement(org.eclipse.cdt.core.dom.ast.IASTStatement) - */ - @Override - public int visit(IASTStatement statement) { - DOMASTNodeLeaf temp = addRoot(statement); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* (non-Javadoc) - * @see org.eclipse.cdt.internal.core.dom.parser.cpp.CPPVisitor.CPPBaseVisitorAction#processTypeId(org.eclipse.cdt.core.dom.ast.IASTTypeId) - */ - @Override - public int visit(IASTTypeId typeId) { - DOMASTNodeLeaf temp = addRoot(typeId); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } - - /* - * (non-Javadoc) - * @see org.eclipse.cdt.core.dom.ast.cpp.CPPASTVisitor#visit(org.eclipse.cdt.core.dom.ast.cpp.ICPPASTTemplateParameter) - */ - @Override - public int visit(ICPPASTTemplateParameter templateParameter) { - DOMASTNodeLeaf temp = addRoot(templateParameter); - if (temp == null) - return PROCESS_ABORT; - else if (temp instanceof DOMASTNodeLeafContinue) - return PROCESS_CONTINUE; - else - return PROCESS_CONTINUE; - } private DOMASTNodeLeaf mergeNode(ASTNode node) { DOMASTNodeLeaf leaf = addRoot(node); diff --git a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTNodeLeaf.java b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTNodeLeaf.java index 36fe860970d..864c11b0b77 100644 --- a/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTNodeLeaf.java +++ b/core/org.eclipse.cdt.ui.tests/src/org/eclipse/cdt/ui/tests/DOMAST/DOMASTNodeLeaf.java @@ -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 @@ -97,7 +97,7 @@ public class DOMASTNodeLeaf implements IAdaptable { public static final int FLAG_INCLUDE_STATEMENTS = 1<<2; static { ignoreInterfaces.addAll(Arrays.asList(new String[] { - "IASTCompletionContext", "IASTNode" + "IASTCompletionContext", "ICPPASTCompletionContext", "IASTNode" })); } public DOMASTNodeLeaf(IASTNode node) { @@ -332,8 +332,7 @@ public class DOMASTNodeLeaf implements IAdaptable { return name; } - @SuppressWarnings("unchecked") - public Object getAdapter(Class key) { + public Object getAdapter(@SuppressWarnings("rawtypes") Class key) { if (key == IPropertySource.class) return new ASTPropertySource(getNode()); @@ -424,18 +423,18 @@ public class DOMASTNodeLeaf implements IAdaptable { if (node instanceof IASTName) { IPropertyDescriptor[] desc = getPropertyDescriptors(((IASTName)node).resolveBinding()); if (desc != null) - for(int i=0; i objClass = obj.getClass(); Class[] interfaces = objClass.getInterfaces(); - for(int i=0; i interface1 : interfaces) { + Method[] methods = interface1.getMethods(); for(int j=0; j