1
0
Fork 0
mirror of https://github.com/eclipse-cdt/cdt synced 2025-06-07 17:56:01 +02:00

Extracted interface for data object of Basic Block in control flow graph

This commit is contained in:
Alena Laskavaia 2010-05-09 01:54:29 +00:00
parent ed2cdbc529
commit a39fe6b4b2
6 changed files with 42 additions and 12 deletions

View file

@ -16,7 +16,7 @@ import org.eclipse.cdt.codan.core.cxx.model.AbstractAstFunctionChecker;
import org.eclipse.cdt.codan.core.cxx.model.CxxModelsCache; import org.eclipse.cdt.codan.core.cxx.model.CxxModelsCache;
import org.eclipse.cdt.codan.core.model.cfg.IControlFlowGraph; import org.eclipse.cdt.codan.core.model.cfg.IControlFlowGraph;
import org.eclipse.cdt.codan.core.model.cfg.IExitNode; import org.eclipse.cdt.codan.core.model.cfg.IExitNode;
import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock; import org.eclipse.cdt.codan.internal.core.cfg.ICfgData;
import org.eclipse.cdt.core.dom.ast.ASTVisitor; import org.eclipse.cdt.core.dom.ast.ASTVisitor;
import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier; import org.eclipse.cdt.core.dom.ast.IASTDeclSpecifier;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator; import org.eclipse.cdt.core.dom.ast.IASTFunctionDeclarator;
@ -100,7 +100,7 @@ public class ReturnChecker extends AbstractAstFunctionChecker {
boolean noexitop = false; boolean noexitop = false;
for (; exitNodeIterator.hasNext();) { for (; exitNodeIterator.hasNext();) {
IExitNode node = exitNodeIterator.next(); IExitNode node = exitNodeIterator.next();
if (((AbstractBasicBlock) node).getData() == null) { if (((ICfgData) node).getData() == null) {
// if it real exit node such as return, exit or throw data // if it real exit node such as return, exit or throw data
// will be an ast node, it is null it is fake node added by the // will be an ast node, it is null it is fake node added by the
// graph builder // graph builder

View file

@ -23,6 +23,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IPlainNode;
import org.eclipse.cdt.codan.core.model.cfg.IStartNode; 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.AbstractBasicBlock;
import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode; import org.eclipse.cdt.codan.internal.core.cfg.DecisionNode;
import org.eclipse.cdt.codan.internal.core.cfg.ICfgData;
import org.eclipse.cdt.codan.internal.core.cfg.JumpNode; import org.eclipse.cdt.codan.internal.core.cfg.JumpNode;
import org.eclipse.cdt.core.dom.ast.IASTBreakStatement; import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
import org.eclipse.cdt.core.dom.ast.IASTCaseStatement; import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
@ -440,7 +441,7 @@ public class ControlFlowGraphBuilder {
if (prev instanceof IExitNode || prev == null) { if (prev instanceof IExitNode || prev == null) {
dead.add(node); dead.add(node);
return; return;
} else if (prev instanceof AbstractBasicBlock) { } else if (prev instanceof ICfgData) {
((AbstractBasicBlock) prev).addOutgoing(node); ((AbstractBasicBlock) prev).addOutgoing(node);
} }
if (!(node instanceof IStartNode)) if (!(node instanceof IStartNode))

View file

@ -15,7 +15,7 @@ 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.IExitNode;
import org.eclipse.cdt.codan.core.model.cfg.INodeFactory; 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.IPlainNode;
import org.eclipse.cdt.codan.internal.core.cfg.AbstractBasicBlock; import org.eclipse.cdt.codan.internal.core.cfg.ICfgData;
import org.eclipse.cdt.codan.internal.core.cfg.NodeFactory; import org.eclipse.cdt.codan.internal.core.cfg.NodeFactory;
import org.eclipse.cdt.core.dom.ast.IASTNode; import org.eclipse.cdt.core.dom.ast.IASTNode;
@ -41,19 +41,19 @@ public class CxxNodeFactory extends NodeFactory implements INodeFactory {
public CxxPlainNode createPlainNode(IASTNode ast) { public CxxPlainNode createPlainNode(IASTNode ast) {
IPlainNode node = createPlainNode(); IPlainNode node = createPlainNode();
((AbstractBasicBlock) node).setData(ast); ((ICfgData) node).setData(ast);
return (CxxPlainNode) node; return (CxxPlainNode) node;
} }
public CxxDecisionNode createDecisionNode(IASTNode ast) { public CxxDecisionNode createDecisionNode(IASTNode ast) {
IDecisionNode node = createDecisionNode(); IDecisionNode node = createDecisionNode();
((AbstractBasicBlock) node).setData(ast); ((ICfgData) node).setData(ast);
return (CxxDecisionNode) node; return (CxxDecisionNode) node;
} }
public CxxExitNode createExitNode(IASTNode ast) { public CxxExitNode createExitNode(IASTNode ast) {
IExitNode node = createExitNode(); IExitNode node = createExitNode();
((AbstractBasicBlock) node).setData(ast); ((ICfgData) node).setData(ast);
return (CxxExitNode) node; return (CxxExitNode) node;
} }
@ -63,7 +63,7 @@ public class CxxNodeFactory extends NodeFactory implements INodeFactory {
*/ */
public IBranchNode createBranchNode(IASTNode caseSt) { public IBranchNode createBranchNode(IASTNode caseSt) {
IBranchNode node = createBranchNode(caseSt.getRawSignature()); IBranchNode node = createBranchNode(caseSt.getRawSignature());
((AbstractBasicBlock) node).setData(caseSt); ((ICfgData) node).setData(caseSt);
return node; return node;
} }
} }

View file

@ -4,13 +4,19 @@ import java.util.Iterator;
import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock; import org.eclipse.cdt.codan.core.model.cfg.IBasicBlock;
public abstract class AbstractBasicBlock implements IBasicBlock { public abstract class AbstractBasicBlock implements IBasicBlock, ICfgData {
private Object data; private Object data;
/* (non-Javadoc)
* @see org.eclipse.cdt.codan.internal.core.cfg.ICfgData#getData()
*/
public Object getData() { public Object getData() {
return data; return data;
} }
/* (non-Javadoc)
* @see org.eclipse.cdt.codan.internal.core.cfg.ICfgData#setData(java.lang.Object)
*/
public void setData(Object data) { public void setData(Object data) {
this.data = data; this.data = data;
} }

View file

@ -0,0 +1,22 @@
/*******************************************************************************
* Copyright (c) 2009,2010 Alena Laskavaia
* 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:
* Alena Laskavaia - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.codan.internal.core.cfg;
/**
* Interface to access data object that control flog graph block carries,
* usually
* it is an ast node
*/
public interface ICfgData {
public abstract Object getData();
public abstract void setData(Object data);
}

View file

@ -16,6 +16,7 @@ import org.eclipse.cdt.codan.core.model.cfg.IJumpNode;
import org.eclipse.cdt.codan.core.model.cfg.ISingleOutgoing; import org.eclipse.cdt.codan.core.model.cfg.ISingleOutgoing;
import org.eclipse.cdt.codan.core.model.cfg.IStartNode; 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.AbstractBasicBlock;
import org.eclipse.cdt.codan.internal.core.cfg.ICfgData;
import org.eclipse.cdt.codan.ui.cfgview.ControlFlowGraphPlugin; import org.eclipse.cdt.codan.ui.cfgview.ControlFlowGraphPlugin;
import org.eclipse.cdt.core.dom.ast.IASTDeclaration; import org.eclipse.cdt.core.dom.ast.IASTDeclaration;
import org.eclipse.cdt.core.dom.ast.IASTFileLocation; import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
@ -168,7 +169,7 @@ public class ControlFlowGraphView extends ViewPart {
if (obj == null) if (obj == null)
return null; return null;
String strdata = ""; String strdata = "";
if (obj instanceof AbstractBasicBlock) { if (obj instanceof ICfgData) {
strdata = ((AbstractBasicBlock) obj).toStringData(); strdata = ((AbstractBasicBlock) obj).toStringData();
} }
if (obj instanceof IConnectorNode) { if (obj instanceof IConnectorNode) {
@ -376,8 +377,8 @@ public class ControlFlowGraphView extends ViewPart {
public void run() { public void run() {
ISelection selection = viewer.getSelection(); ISelection selection = viewer.getSelection();
Object obj = ((IStructuredSelection) selection).getFirstElement(); Object obj = ((IStructuredSelection) selection).getFirstElement();
if (obj instanceof AbstractBasicBlock) { if (obj instanceof ICfgData) {
Object data = ((AbstractBasicBlock) obj).getData(); Object data = ((ICfgData) obj).getData();
if (data instanceof IASTNode) { if (data instanceof IASTNode) {
IASTNode node = (IASTNode) data; IASTNode node = (IASTNode) data;
if (node instanceof IASTTranslationUnit) // don't if (node instanceof IASTTranslationUnit) // don't