subgraph.beh.html
Program{
void buildTraversalGraph()(@
prog.allClassDefs(new TGVertexCollector());
prog.collectTGEdges();
@)
}
TGVertexCollector{
before ClassGraph (@ tg = new TraversalGraph(); @)
before ClassDef (@
TGVertex v = new TGVertex(host.get_classname());
tg.addVertex(v);
host.set_tg(v);
@)
after ClassGraph (@ host.set_tg(tg); @)
}
Program{
void collectTGEdges()=allEdges{
(@ TraversalGraph tg; @)
before ClassGraph (@ tg = host.get_tg(); @)
(@ TGVertex source; @)
before ClassDef (@ source = tg.findVertex(host.get_classname(), true); @)
(@ TGEdge e; @)
before Part (@ e = new TGCEdge();
((TGCEdge)e).set_name(host.get_partname()); @)
before Subclass (@ e = new TGAEdge(); @)
before Superclass (@ e = new TGIEdge(); @)
after{ Part, Subclass, Superclass }(@
e.set_source(source);
e.set_dest(tg.findVertex(host.get_classname(), true));
tg.addEdge(e);
host.set_tg(e);
@)
}
}
Program{
void markEverything()(@ TraversalGraph.markEverything(); @)
}
ClassDef{
(@ TGVertex tg; @)
TGVertex get_tg()(@ return tg; @)
void set_tg(TGVertex v)(@ tg = v; @)
}
{ Part, Subclass, Superclass }{
(@ TGEdge tg; @)
TGEdge get_tg()(@ return tg; @)
void set_tg(TGEdge e)(@ tg = e; @)
}
{ ClassDef, Part, Subclass, Superclass }{
boolean is_in_trav()(@ return tg != null && tg.is_in_trav(); @)
}
ClassGraph{
boolean markSubgraph(StrategyGraph sg)(@
tg.makeCopies(sg.size());
tg.addIntercopyEdges(sg);
sg.markReachableForwardFromSources(tg);
sg.markReachableBackwardFromTargets(tg);
if (!sg.allSourcesAndTargetsMarked(tg)) {
System.err.println("Error: No path found.");
return false;
}
return true;
@)
}