diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java index 73e4375d35a..c140b430c79 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ControlFlowGraph.java @@ -14,7 +14,9 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Iterator; +import java.util.LinkedHashSet; import java.util.List; + import org.eclipse.cdt.codan.provisional.core.model.cfg.IBasicBlock; import org.eclipse.cdt.codan.provisional.core.model.cfg.IConnectorNode; import org.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph; @@ -29,6 +31,7 @@ import org.eclipse.cdt.codan.provisional.core.model.cfg.IStartNode; */ public class ControlFlowGraph implements IControlFlowGraph { private List exitNodes; + private List deadNodes = new ArrayList(); private IStartNode start; public ControlFlowGraph(IStartNode start, Collection exitNodes) { @@ -67,9 +70,11 @@ public class ControlFlowGraph implements IControlFlowGraph { } public void print(IBasicBlock node) { - System.out.println(node.toString()); + System.out.println(node.getClass().getSimpleName() + ": " + + ((AbstractBasicBlock) node).toStringData()); if (node instanceof IConnectorNode) - return; + if (((IConnectorNode) node).hasBackwardIncoming() == false) + return; if (node instanceof IDecisionNode) { // todo Iterator decisionArcs = ((IDecisionNode) node) @@ -96,4 +101,47 @@ public class ControlFlowGraph implements IControlFlowGraph { // TODO Auto-generated method stub return null; } + + /* + * (non-Javadoc) + * + * @seeorg.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph# + * getUnconnectedNodeSize() + */ + public int getUnconnectedNodeSize() { + // TODO Auto-generated method stub + return 0; + } + + /* + * (non-Javadoc) + * + * @see + * org.eclipse.cdt.codan.provisional.core.model.cfg.IControlFlowGraph#getNodes + * () + */ + public Collection getNodes() { + Collection result = new LinkedHashSet(); + getNodes(getStartNode(), result); + for (Iterator iterator = deadNodes.iterator(); iterator.hasNext();) { + IBasicBlock d = (IBasicBlock) iterator.next(); + getNodes(d, result); + } + return result; + } + + /** + * @param d + * @param result + */ + private void getNodes(IBasicBlock start, Collection result) { + if (result.contains(start)) + return; + result.add(start); + for (Iterator outgoingIterator = start + .getOutgoingIterator(); outgoingIterator.hasNext();) { + IBasicBlock b = outgoingIterator.next(); + getNodes(b, result); + } + } } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IControlFlowGraph.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IControlFlowGraph.java index a5fc8a488cc..1e81d9050f3 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IControlFlowGraph.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/provisional/core/model/cfg/IControlFlowGraph.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.eclipse.cdt.codan.provisional.core.model.cfg; +import java.util.Collection; import java.util.Iterator; /** @@ -27,4 +28,8 @@ public interface IControlFlowGraph { int getExitNodeSize(); Iterator getUnconnectedNodeIterator(); + + int getUnconnectedNodeSize(); + + Collection getNodes(); }