diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java index e4282aa43e7..4b77d035e70 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElement.java @@ -6,6 +6,7 @@ package org.eclipse.cdt.core.model; */ import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IAdaptable; import org.eclipse.core.runtime.IPath; @@ -313,4 +314,12 @@ public interface ICElement extends IAdaptable { * exception occurs while accessing its corresponding resource */ boolean isStructureKnown() throws CModelException; + + /** + * Accept a visitor and walk the ICElement tree with it. + * + * @param visitor + * @throws CModelException + */ + void accept(ICElementVisitor visitor) throws CoreException; } diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElementVisitor.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElementVisitor.java new file mode 100644 index 00000000000..5dfb3781e08 --- /dev/null +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/core/model/ICElementVisitor.java @@ -0,0 +1,24 @@ +package org.eclipse.cdt.core.model; + +import org.eclipse.core.runtime.CoreException; + +/* + * (c) Copyright IBM Corp. 2004. + * All Rights Reserved. + */ + +/** + * This interface is implemented by clients that walk the ICElement tree. + */ +public interface ICElementVisitor { + + /** + * Visited a member if the ICElement tree. Returns whether to visit the children + * of this element. + * + * @param element + * @return + */ + public boolean visit(ICElement element) throws CoreException; + +} diff --git a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java index 745e63a3b5f..2a37a7728fd 100644 --- a/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java +++ b/core/org.eclipse.cdt.core/model/org/eclipse/cdt/internal/core/model/CElement.java @@ -6,12 +6,14 @@ package org.eclipse.cdt.internal.core.model; import org.eclipse.cdt.core.model.CModelException; import org.eclipse.cdt.core.model.ICElement; +import org.eclipse.cdt.core.model.ICElementVisitor; import org.eclipse.cdt.core.model.ICModel; import org.eclipse.cdt.core.model.ICModelStatusConstants; import org.eclipse.cdt.core.model.ICProject; import org.eclipse.cdt.core.model.IOpenable; import org.eclipse.cdt.core.model.IParent; import org.eclipse.core.resources.IResource; +import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; @@ -383,4 +385,20 @@ public abstract class CElement extends PlatformObject implements ICElement { return this.equals(otherElement); } + /* (non-Javadoc) + * @see org.eclipse.cdt.core.model.ICElement#accept(org.eclipse.cdt.core.model.ICElementVisitor) + */ + public void accept(ICElementVisitor visitor) throws CoreException { + // Visit me, return right away if the visitor doesn't want to visit my children + if (!visitor.visit(this)) + return; + + // If I am a Parent, visit my children + if (this instanceof IParent) { + ICElement [] children = ((IParent)this).getChildren(); + for (int i = 0; i < children.length; ++i) + children[i].accept(visitor); + } + } + }