blob: 11bf50d8e8c253d8fb53748129b47ef2100387e4 [file] [log] [blame]
/**********************************************************************
* Copyright (c) 2007, 2008 IBM Corporation.
* 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:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.impl;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import org.eclipse.cdt.core.dom.ast.IASTDeclarator;
import org.eclipse.cdt.core.dom.ast.IASTFunctionDefinition;
import org.eclipse.cdt.core.dom.ast.IASTName;
import org.eclipse.core.resources.IResource;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.ICallGraphNode;
import org.eclipse.ptp.pldt.mpi.analysis.cdt.graphs.IControlFlowGraph;
/**
* Implementation of a call graph node, which represents a user-defined
* function
*
*/
public class CallGraphNode implements ICallGraphNode {
protected IResource resource_;
protected String fileName_;
protected String funcName_;
protected IASTFunctionDefinition fdef_;
protected List<ICallGraphNode> callers_;
protected List<ICallGraphNode> callees_;
protected boolean nested; //nested function declaration?
protected IControlFlowGraph CFG_;
/** next node in reverse-topological (bottom-up) order */
protected ICallGraphNode botNext_;
/** next node in topological (top-down) order */
protected ICallGraphNode topNext_;
protected Hashtable<String,Object> attrs_;
protected boolean recursive;
public CallGraphNode(IResource resource, String filename,
String funcname, IASTFunctionDefinition fdef){
resource_ = resource;
fileName_ = filename;
funcName_ = funcname;
fdef_ = fdef;
init();
}
public CallGraphNode(IResource resource, String filename,
IASTFunctionDefinition fdef){
resource_ = resource;
fileName_ = filename;
fdef_ = fdef;
funcName_ = getFuncName(fdef);
init();
}
private void init(){
callers_ = new ArrayList<ICallGraphNode>();
callees_ = new ArrayList<ICallGraphNode>();
nested = false;
CFG_ = null;
topNext_ = null;
botNext_ = null;
attrs_ = new Hashtable<String,Object>();
recursive = false;
}
private String getFuncName(IASTFunctionDefinition fdef){
IASTDeclarator fdecl = (IASTDeclarator)fdef.getDeclarator();
return new String(((IASTName)fdecl.getName()).toCharArray());
}
public String getFuncName(){
return funcName_;
}
public String getFileName(){
return fileName_;
}
public IResource getResource(){
return resource_;
}
public IASTFunctionDefinition getFuncDef(){
return fdef_;
}
public boolean isNested(){
return nested;
}
public List<ICallGraphNode> getCallers(){
return callers_;
}
public void addCaller(ICallGraphNode caller){
if(!callers_.contains(caller))
callers_.add(caller);
}
public List<ICallGraphNode> getCallees(){
return callees_;
}
public void addCallee(ICallGraphNode callee){
if(!callees_.contains(callee))
callees_.add(callee);
}
/** Returns next node in reverse-topological (bottom-up) order */
public ICallGraphNode botNext() {
return botNext_;
}
public void setBotNext(ICallGraphNode node){
botNext_ = node;
}
public IControlFlowGraph getCFG() {
return CFG_;
}
/** Returns next node in topological (top-down) order */
public ICallGraphNode topNext() {
return topNext_;
}
public void setTopNext(ICallGraphNode node){
topNext_ = node;
}
public void setCFG(IControlFlowGraph cfg) {
CFG_ = cfg;
}
public void setAttr(String name, Object attr){
attrs_.put(name, attr);
}
public Object getAttr(String name){
return attrs_.get(name);
}
public void removeAttr(String name){
attrs_.remove(name);
}
public void setRecursive(boolean val){
recursive = val;
}
public boolean isRecursive(){
return recursive;
}
}