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;
  @)
}