package kr.ac.snu.selab.soot.callgraph;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import kr.ac.snu.selab.soot.graph.DefaultHashMapGraph;
import kr.ac.snu.selab.soot.graph.MyNode;
import soot.Hierarchy;
import soot.SootClass;
import soot.SootMethod;
public abstract class CallGraph extends DefaultHashMapGraph<MyNode> {
private List<SootClass> getSubTypeClassOf(SootClass aType,
Hierarchy aHierarchy) {
if (aType.isInterface()) {
return aHierarchy.getImplementersOf(aType);
} else {
return aHierarchy.getSubclassesOf(aType);
}
}
public List<SootMethod> getOverrideMethodsOf(SootMethod aMethod,
Hierarchy aHierarchy,
Map<Map<SootClass, String>, SootMethod> aMethodMapBySubSignature) {
List<SootMethod> result = new ArrayList<SootMethod>();
SootClass receiverType = aMethod.getDeclaringClass();
List<SootClass> subTypeClassList = getSubTypeClassOf(receiverType,
aHierarchy);
if (!subTypeClassList.isEmpty()) {
for (SootClass aClass : subTypeClassList) {
Map<SootClass, String> key = new HashMap<SootClass, String>();
key.put(aClass, aMethod.getSubSignature());
SootMethod overrideMethod = aMethodMapBySubSignature.get(key);
if (overrideMethod != null) {
result.add(overrideMethod);
}
}
}
return result;
}
}