diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java index dbb82accc43..8f2809892a9 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/ControlFlowGraphBuilder.java @@ -22,7 +22,6 @@ import org.eclipse.cdt.codan.core.model.cfg.IJumpNode; import org.eclipse.cdt.codan.core.model.cfg.IPlainNode; import org.eclipse.cdt.codan.core.model.cfg.IStartNode; import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock; -import org.eclipse.cdt.codan.internal.core.cfg.ConnectorNode; import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode; import org.eclipse.cdt.codan.internal.core.cfg.JumpNode; import org.eclipse.cdt.core.dom.ast.IASTBreakStatement; @@ -45,10 +44,9 @@ import org.eclipse.cdt.core.dom.ast.IASTReturnStatement; import org.eclipse.cdt.core.dom.ast.IASTStatement; import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; -import org.eclipse.cdt.internal.core.dom.parser.IASTAmbiguousStatement; /** - * TODO: add description + * This class creates C control flow graph */ public class ControlFlowGraphBuilder { CxxStartNode start; @@ -152,15 +150,12 @@ public class ControlFlowGraphBuilder { addOutgoing(prev, gotoNode); return gotoNode; } else if (body instanceof IASTProblemStatement) { - System.err.println("problem"); + // System.err.println("problem"); CxxPlainNode node = factory.createPlainNode(body); addOutgoing(prev, node); return node; - - } else if (body instanceof IASTAmbiguousStatement) { - System.err.println("amb"); } else { - System.err.println("unknown statement for cfg: "+body); + System.err.println("unknown statement for cfg: " + body); //$NON-NLS-1$ } return prev; } @@ -211,7 +206,7 @@ public class ControlFlowGraphBuilder { DecisionNode node = factory.createDecisionNode(body .getControllerExpression()); addOutgoing(prev, node); - ConnectorNode conn = new ConnectorNode(); + IConnectorNode conn = factory.createConnectorNode(); node.setMergeNode(conn); createSwitchBody(node, conn, body.getBody()); return conn; @@ -224,7 +219,7 @@ public class ControlFlowGraphBuilder { * @param body */ private void createSwitchBody(DecisionNode switchNode, - ConnectorNode mergeNode, IASTStatement body) { + IConnectorNode mergeNode, IASTStatement body) { if (!(body instanceof IASTCompoundStatement)) return; // bad IASTCompoundStatement comp = (IASTCompoundStatement) body; @@ -232,17 +227,6 @@ public class ControlFlowGraphBuilder { IBasicBlock prev = switchNode; for (int i = 0; i < children.length; i++) { IASTNode elem = children[i]; - if (elem instanceof IASTCaseStatement) { - IASTCaseStatement caseSt = (IASTCaseStatement) elem; - } - if (elem instanceof IASTDefaultStatement) { - IBranchNode lbl = factory.createBranchNode(IBranchNode.DEFAULT); - if (!(prev instanceof IExitNode) && prev != switchNode) - addOutgoing(prev, lbl); - addOutgoing(switchNode, lbl); - prev = lbl; - continue; - } if (elem instanceof IASTCaseStatement || elem instanceof IASTDefaultStatement) { IBranchNode lbl = null; diff --git a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java index 40962f4bf8f..055ad23249b 100644 --- a/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java +++ b/codan/org.eclipse.cdt.codan.core.cxx/src/org/eclipse/cdt/codan/core/cxx/internal/model/cfg/CxxNodeFactory.java @@ -15,8 +15,8 @@ import org.eclipse.cdt.codan.core.model.cfg.IDecisionNode; import org.eclipse.cdt.codan.core.model.cfg.IExitNode; import org.eclipse.cdt.codan.core.model.cfg.INodeFactory; import org.eclipse.cdt.codan.core.model.cfg.IPlainNode; -import org.eclipse.cdt.codan.core.model.cfg.NodeFactory; import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock; +import org.eclipse.cdt.codan.internal.core.cfg.NodeFactory; import org.eclipse.cdt.core.dom.ast.IASTNode; /** diff --git a/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF b/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF index a0f9f2dc643..99da85a73e9 100644 --- a/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF +++ b/codan/org.eclipse.cdt.codan.core/META-INF/MANIFEST.MF @@ -11,7 +11,7 @@ Bundle-ActivationPolicy: lazy Bundle-RequiredExecutionEnvironment: J2SE-1.5 Export-Package: org.eclipse.cdt.codan.core, org.eclipse.cdt.codan.core.model, - org.eclipse.cdt.codan.core.model.cfg, + org.eclipse.cdt.codan.core.model.cfg;x-friends:="org.eclipse.cdt.codan.core.cxx", org.eclipse.cdt.codan.internal.core; x-friends:="org.eclipse.cdt.codan.core, org.eclipse.cdt.codan.core.cxx, diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java index 6b8ded9337f..60a5d404c59 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IConnectorNode.java @@ -1,5 +1,8 @@ package org.eclipse.cdt.codan.core.model.cfg; +/** + * Connector node has multiple incoming branches and single outgoing + */ public interface IConnectorNode extends IBasicBlock, ISingleOutgoing { /** Backward connector has incoming node which comes from backward arcs */ boolean hasBackwardIncoming(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java index 13a5aa02b26..04d43591220 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IControlFlowGraph.java @@ -14,15 +14,11 @@ import java.util.Collection; import java.util.Iterator; /** - * TODO: add description + * Represents control flow graph object */ public interface IControlFlowGraph { IStartNode getStartNode(); - /** - * - * @return - */ Iterator getExitNodeIterator(); int getExitNodeSize(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java index 280675f7fa5..e7b27063ab0 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IJumpNode.java @@ -1,6 +1,13 @@ package org.eclipse.cdt.codan.core.model.cfg; +/** + * Node that changes the control of the graph, i.e. passes control to non-next + * statement. Can be used to implement gotos, break, continue, end of branches + */ public interface IJumpNode extends IBasicBlock, ISingleOutgoing { + /** + * True of outgoing arc is backward one + */ boolean isBackwardArc(); IConnectorNode getJumpNode(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java index b23aec785c9..83b117f4e4e 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/IPlainNode.java @@ -1,5 +1,9 @@ package org.eclipse.cdt.codan.core.model.cfg; +/** + * Has one incoming, one outgoing connection. Usually expression statement or + * declaration. + */ public interface IPlainNode extends IBasicBlock, ISingleOutgoing, ISingleIncoming { } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/BranchNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/BranchNode.java index a14f2240273..97e943db625 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/BranchNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/BranchNode.java @@ -18,7 +18,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IBranchNode; public class BranchNode extends PlainNode implements IBranchNode { protected String label; - public BranchNode(String label) { + protected BranchNode(String label) { super(); this.label = label; } @@ -26,8 +26,7 @@ public class BranchNode extends PlainNode implements IBranchNode { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.IBranchNode#getLabel() + * @see org.eclipse.cdt.codan.core.model.cfg.IBranchNode#getLabel() */ public String getLabel() { return label; diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java index 779709933c0..cd7af61d8fc 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ConnectorNode.java @@ -24,7 +24,7 @@ public class ConnectorNode extends AbstractSingleOutgoingNode implements IConnectorNode { protected ArrayList incoming = new ArrayList(2); - public ConnectorNode() { + protected ConnectorNode() { super(); } @@ -46,9 +46,7 @@ public class ConnectorNode extends AbstractSingleOutgoingNode implements /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.IBasicBlock#getIncomingSize - * () + * @see org.eclipse.cdt.codan.core.model.cfg.IBasicBlock#getIncomingSize () */ public int getIncomingSize() { return incoming.size(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java index bfc6b98b230..6dc045a18e8 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/DecisionNode.java @@ -30,7 +30,7 @@ public class DecisionNode extends AbstractSingleIncomingNode implements /** * @param prev */ - public DecisionNode() { + protected DecisionNode() { super(); } @@ -53,9 +53,7 @@ public class DecisionNode extends AbstractSingleIncomingNode implements /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.IBasicBlock#getOutgoingSize - * () + * @see org.eclipse.cdt.codan.core.model.cfg.IBasicBlock#getOutgoingSize () */ public int getOutgoingSize() { return next.size(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java index bc662b2ffbb..1858e19a8ae 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/ExitNode.java @@ -14,7 +14,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IStartNode; public class ExitNode extends AbstractSingleIncomingNode implements IExitNode { private IStartNode start; - public ExitNode() { + protected ExitNode() { super(); } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java index b3463812d2c..470891b0793 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/JumpNode.java @@ -15,7 +15,7 @@ public class JumpNode extends AbstractSingleIncomingNode implements IJumpNode { private IConnectorNode jump; private boolean backward; - public JumpNode() { + protected JumpNode() { super(); } @@ -30,8 +30,7 @@ public class JumpNode extends AbstractSingleIncomingNode implements IJumpNode { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.IJumpNode#getJumpNode() + * @see org.eclipse.cdt.codan.core.model.cfg.IJumpNode#getJumpNode() */ public IConnectorNode getJumpNode() { return jump; diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/NodeFactory.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/NodeFactory.java similarity index 65% rename from codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/NodeFactory.java rename to codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/NodeFactory.java index 920e5ee2e47..49b01f5ce49 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/core/model/cfg/NodeFactory.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/NodeFactory.java @@ -8,18 +8,20 @@ * Contributors: * Alena Laskavaia - initial API and implementation *******************************************************************************/ -package org.eclipse.cdt.codan.core.model.cfg; +package org.eclipse.cdt.codan.internal.core.cfg; -import org.eclipse.cdt.codan.internal.core.cfg.ConnectorNode; -import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode; -import org.eclipse.cdt.codan.internal.core.cfg.ExitNode; -import org.eclipse.cdt.codan.internal.core.cfg.JumpNode; -import org.eclipse.cdt.codan.internal.core.cfg.BranchNode; -import org.eclipse.cdt.codan.internal.core.cfg.PlainNode; -import org.eclipse.cdt.codan.internal.core.cfg.StartNode; +import org.eclipse.cdt.codan.core.model.cfg.IBranchNode; +import org.eclipse.cdt.codan.core.model.cfg.IConnectorNode; +import org.eclipse.cdt.codan.core.model.cfg.IControlFlowGraph; +import org.eclipse.cdt.codan.core.model.cfg.IDecisionNode; +import org.eclipse.cdt.codan.core.model.cfg.IExitNode; +import org.eclipse.cdt.codan.core.model.cfg.IJumpNode; +import org.eclipse.cdt.codan.core.model.cfg.INodeFactory; +import org.eclipse.cdt.codan.core.model.cfg.IPlainNode; +import org.eclipse.cdt.codan.core.model.cfg.IStartNode; /** - * TODO: add description + * Factory that creates cfg nodes */ public class NodeFactory implements INodeFactory { IControlFlowGraph graph; @@ -40,9 +42,7 @@ public class NodeFactory implements INodeFactory { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createPlainNode - * () + * @see org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createPlainNode () */ public IPlainNode createPlainNode() { return new PlainNode(); @@ -51,9 +51,7 @@ public class NodeFactory implements INodeFactory { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createJumpNode - * () + * @see org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createJumpNode () */ public IJumpNode createJumpNode() { return new JumpNode(); @@ -82,9 +80,7 @@ public class NodeFactory implements INodeFactory { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createStartNode - * () + * @see org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createStartNode () */ public IStartNode createStartNode() { return new StartNode(); @@ -93,9 +89,7 @@ public class NodeFactory implements INodeFactory { /* * (non-Javadoc) * - * @see - * org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createExitNode - * () + * @see org.eclipse.cdt.codan.core.model.cfg.INodeFactory#createExitNode () */ public IExitNode createExitNode() { return new ExitNode(); diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java index 6ae9e394e20..448eef436fb 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/PlainNode.java @@ -12,7 +12,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IPlainNode; public class PlainNode extends AbstractSingleIncomingNode implements IPlainNode { protected IBasicBlock next; - public PlainNode() { + protected PlainNode() { super(); } diff --git a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java index fbc6613efc5..99e218667df 100644 --- a/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java +++ b/codan/org.eclipse.cdt.codan.core/src/org/eclipse/cdt/codan/internal/core/cfg/StartNode.java @@ -11,7 +11,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IStartNode; * */ public class StartNode extends AbstractSingleOutgoingNode implements IStartNode { - public StartNode() { + protected StartNode() { super(); }