diff --git a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF index 2174c160a99..224e3416112 100644 --- a/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF +++ b/core/org.eclipse.cdt.core/META-INF/MANIFEST.MF @@ -2,7 +2,7 @@ Manifest-Version: 1.0 Bundle-ManifestVersion: 2 Bundle-Name: %pluginName Bundle-SymbolicName: org.eclipse.cdt.core; singleton:=true -Bundle-Version: 5.0.0.qualifier +Bundle-Version: 5.1.0.qualifier Bundle-Activator: org.eclipse.cdt.core.CCorePlugin Bundle-Vendor: %providerName Bundle-Localization: plugin 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 8fd6cf1408a..e7169378a9f 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 @@ -62,6 +62,11 @@ public abstract class ASTVisitor { * Set this flag to visit declaration specifiers. */ public boolean shouldVisitDeclSpecifiers = false; + /** + * Set this flag to visit array modifiers. + * @since 5.1 + */ + public boolean shouldVisitArrayModifiers = false; /** * Set this flag to visit expressions. */ @@ -110,7 +115,6 @@ public abstract class ASTVisitor { * Your visitor needs to implement {@link ICPPASTVisitor} to make this work. */ public boolean shouldVisitTemplateParameters = false; - // visit methods public int visit(IASTTranslationUnit tu) { @@ -141,6 +145,13 @@ public abstract class ASTVisitor { return PROCESS_CONTINUE; } + /** + * @since 5.1 + */ + public int visit(IASTArrayModifier arrayModifier) { + return PROCESS_CONTINUE; + } + public int visit(IASTExpression expression) { return PROCESS_CONTINUE; } @@ -190,6 +201,13 @@ public abstract class ASTVisitor { return PROCESS_CONTINUE; } + /** + * @since 5.1 + */ + public int leave(IASTArrayModifier arrayModifier) { + return PROCESS_CONTINUE; + } + public int leave(IASTExpression expression) { return PROCESS_CONTINUE; } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java index ebe12ad830b..04bbe3f2444 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/core/dom/ast/IASTName.java @@ -21,8 +21,8 @@ import org.eclipse.cdt.core.dom.IName; * * The toString method produces a string representation of the name as * appropriate for the language. - * - * @author Doug Schaefer + * + * @noimplement This interface is not intended to be implemented by clients. */ public interface IASTName extends IASTNode, IName { @@ -88,4 +88,11 @@ public interface IASTName extends IASTNode, IName { * @since 5.0 */ public IASTImageLocation getImageLocation(); + + /** + * For convenience this method returns the last name of a qualified name or this if this is not a + * qualified name. + * @since 5.1 + */ + public IASTName getLastName(); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayModifier.java index ee75a39facd..69a421e90f8 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/c/CASTArrayModifier.java @@ -46,8 +46,25 @@ public class CASTArrayModifier extends CASTNode implements IASTArrayModifier, IA } @Override - public boolean accept( ASTVisitor action ){ - if( exp != null ) if( !exp.accept( action ) ) return false; + public boolean accept(ASTVisitor action) { + if (exp != null) { + if( action.shouldVisitArrayModifiers ){ + switch( action.visit( this ) ){ + case ASTVisitor.PROCESS_ABORT : return false; + case ASTVisitor.PROCESS_SKIP : return true; + default : break; + } + } + if (!exp.accept(action)) + return false; + if( action.shouldVisitArrayModifiers ){ + switch( 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/CPPASTArrayModifier.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayModifier.java index 07fd0ac875d..1be37d43c18 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayModifier.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/parser/cpp/CPPASTArrayModifier.java @@ -6,7 +6,8 @@ * http://www.eclipse.org/legal/epl-v10.html * * Contributors: - * IBM - Initial API and implementation + * IBM - Initial API and implementation + * Markus Schorn (Wind River Systems) *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.parser.cpp; @@ -44,10 +45,24 @@ public class CPPASTArrayModifier extends CPPASTNode implements IASTArrayModifier @Override public boolean accept(ASTVisitor action) { - if (exp != null) + if (exp != null) { + if( action.shouldVisitArrayModifiers ){ + switch( action.visit( this ) ){ + case ASTVisitor.PROCESS_ABORT : return false; + case ASTVisitor.PROCESS_SKIP : return true; + default : break; + } + } if (!exp.accept(action)) return false; - + if( action.shouldVisitArrayModifiers ){ + switch( 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/rewrite/astwriter/ASTWriter.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java index 4205875e45b..22b013232f2 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriter.java @@ -11,8 +11,6 @@ *******************************************************************************/ package org.eclipse.cdt.internal.core.dom.rewrite.astwriter; -import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore; import org.eclipse.cdt.internal.core.dom.rewrite.changegenerator.ChangeGeneratorWriterVisitor; @@ -80,16 +78,7 @@ public class ASTWriter { */ public String write(IASTNode rootNode, String fileScope, NodeCommentMap commentMap) throws ProblemRuntimeException { transformationVisitor = new ChangeGeneratorWriterVisitor(modificationStore, givenIndentation, fileScope, commentMap); - - // mstodo: workaround for - if (rootNode instanceof IASTArrayModifier) { - int result= transformationVisitor.visit((IASTArrayModifier) rootNode); - if (result == ASTVisitor.PROCESS_CONTINUE) { - rootNode.accept(transformationVisitor); - } - } else { - rootNode.accept(transformationVisitor); - } + rootNode.accept(transformationVisitor); String str = transformationVisitor.toString(); transformationVisitor.cleanCache(); return str; diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java index d87b5f93334..d869d1909ce 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/astwriter/ASTWriterVisitor.java @@ -69,6 +69,8 @@ public class ASTWriterVisitor extends CPPASTVisitor { shouldVisitDeclarators = true; + shouldVisitArrayModifiers= true; + shouldVisitInitializers = true; shouldVisitBaseSpecifiers = true; @@ -202,6 +204,7 @@ public class ASTWriterVisitor extends CPPASTVisitor { return ASTVisitor.PROCESS_SKIP; } + @Override public int visit(IASTArrayModifier amod) { if(!macroHandler.checkisMacroExpansionNode(amod)) { declaratorWriter.writeArrayModifier(amod); diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java index 78ac97b3102..26d0b7864af 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGenerator.java @@ -17,7 +17,6 @@ import java.util.LinkedHashMap; import java.util.List; import org.eclipse.cdt.core.dom.ast.ASTVisitor; -import org.eclipse.cdt.core.dom.ast.IASTArrayDeclarator; import org.eclipse.cdt.core.dom.ast.IASTArrayModifier; import org.eclipse.cdt.core.dom.ast.IASTComment; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; @@ -29,13 +28,10 @@ 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.IASTPointerOperator; 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.ICPPASTNamespaceDefinition; -import org.eclipse.cdt.internal.core.dom.parser.cpp.semantics.CPPVisitor; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModification; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationMap; import org.eclipse.cdt.internal.core.dom.rewrite.ASTModificationStore; @@ -84,6 +80,8 @@ public class ChangeGenerator extends CPPASTVisitor { shouldVisitDeclarators = true; + shouldVisitArrayModifiers= true; + shouldVisitInitializers = true; shouldVisitBaseSpecifiers = true; @@ -391,49 +389,16 @@ public class ChangeGenerator extends CPPASTVisitor { synthTreatment(declarator); return ASTVisitor.PROCESS_SKIP; } - - // mstodo workaround - if (declarator instanceof IASTArrayDeclarator) { - IASTPointerOperator [] ptrOps = declarator.getPointerOperators(); - for ( int i = 0; i < ptrOps.length; i++ ) { - if( !ptrOps[i].accept( this ) ) return PROCESS_ABORT; - } - - IASTDeclarator nestedDeclarator= declarator.getNestedDeclarator(); - IASTName name= declarator.getName(); - if (nestedDeclarator == null && name != null) { - IASTDeclarator outermost= CPPVisitor.findOutermostDeclarator(declarator); - if (outermost.getPropertyInParent() != IASTTypeId.ABSTRACT_DECLARATOR) { - if (!name.accept(this)) return PROCESS_ABORT; - } - } - - if (nestedDeclarator != null) { - if (!nestedDeclarator.accept(this)) return PROCESS_ABORT; - } - - IASTArrayModifier [] mods = ((IASTArrayDeclarator) declarator).getArrayModifiers(); - for ( int i = 0; i < mods.length; i++ ) { - int result= visit(mods[i]); - if (result != PROCESS_CONTINUE) - return result; - - if( !mods[i].accept( this ) ) return PROCESS_ABORT; - } - IASTInitializer initializer = declarator.getInitializer(); - if( initializer != null ) if( !initializer.accept( this ) ) return PROCESS_ABORT; - return PROCESS_CONTINUE; - } - return super.visit(declarator); } + @Override public int visit(IASTArrayModifier mod) { if (hasChangedChild(mod)) { synthTreatment(mod); return ASTVisitor.PROCESS_SKIP; } - return PROCESS_CONTINUE; + return super.visit(mod); } diff --git a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGeneratorWriterVisitor.java b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGeneratorWriterVisitor.java index c60da015169..e82c15b2778 100644 --- a/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGeneratorWriterVisitor.java +++ b/core/org.eclipse.cdt.core/parser/org/eclipse/cdt/internal/core/dom/rewrite/changegenerator/ChangeGeneratorWriterVisitor.java @@ -73,6 +73,7 @@ public class ChangeGeneratorWriterVisitor extends ASTWriterVisitor { shouldVisitTranslationUnit = delegateVisitor.shouldVisitTranslationUnit; shouldVisitProblems = delegateVisitor.shouldVisitProblems; shouldVisitTypeIds = delegateVisitor.shouldVisitTypeIds; + shouldVisitArrayModifiers= delegateVisitor.shouldVisitArrayModifiers; }