core: import edu.neu.ccs.demeter.dj.*; import java.util.*; import edu.neu.ccs.demeter.*; add: class Cd_graph { protected Adjacency_Nlist adjacencies; public Adjacency_Nlist get_adjacencies() {{ return adjacencies; }} public void set_adjacencies(Adjacency_Nlist new_adjacencies) {{ adjacencies = new_adjacencies; }} public constructor Cd_graph() {{ super(); }} public constructor Cd_graph(Adjacency_Nlist adjacencies) {{ super(); set_adjacencies(adjacencies); }} public static Cd_graph parse(java.io.Reader in) throws ParseException {{ return new Parser(in)._Cd_graph(); }} public static Cd_graph parse(java.io.InputStream in) throws ParseException {{ return new Parser(in)._Cd_graph(); }} public static Cd_graph parse(String s) {{ try { return parse(new java.io.StringReader(s)); } catch (ParseException e) { throw new RuntimeException(e.toString()); } }} {{ //Need to keep track of what classes are defined correctly HashSet definedClasses = new HashSet(); // Function which traverses the cg, records defined classes in hashset public void check_undefined(ClassGraph cg) { // Strategy bypasses Construct_ns Strategy sg = new Strategy("from Cd_graph bypassing Construct_ns to Vertex"); TraversalGraph tg = new TraversalGraph(sg,cg); tg.traverse(this, new Visitor() { HashSet hclasses; // First build hashset public void start() { hclasses = new HashSet(); } public void before(Vertex host) { Ident cname = host.get_vertex_name(); hclasses.add(cname); } // Need to return the hashset after traversal public Object getReturnValue() { return hclasses; } }); //end of traversal // See if classes are defined in the hashset Strategy sg2 = new Strategy("from Cd_graph through Construct_ns to Vertex"); TraversalGraph tg2 = new TraversalGraph(sg2,cg); tg2.traverse( this, new Visitor() { public void before(Vertex host){ Ident cname = host.get_vertex_name(); if(!definedClasses.contains(cname)) { System.err.println(" ERROR: Class " + cname + " is not defined. "); } } }); //end of traversal } //end of check_undefined }} {{ HashSet uniqueParts = new HashSet(); public void check_unique(ClassGraph cg1) { Strategy s1 = new Strategy("from Cd_graph through Adjacency to Vertex"); TraversalGraph tg = new TraversalGraph(s1, cg1); tg.traverse(this, new Visitor() { private Vertex defined_vertex; private Vertex current_vertex; public void before (Construct_ns host) { uniqueParts = new HashSet(); defined_vertex = current_vertex; } public void before (Regular host) { AddToStack(host.get_vertex().get_vertex().get_vertex_name().toString().toLowerCase()); } public void before (Labeled host) { AddToStack( host.get_label_name().toString() ); } public void before (Vertex host) { current_vertex = host; } private void AddToStack (String add) { //If class already defined, produce error message if (uniqueParts.contains(add)) { System.err.println(" ERROR: Part " + add + " of the class " + defined_vertex.get_vertex_name() + " is not unique. "); } else { //Add to list of defined classes uniqueParts.add(add); } } }); // End of traversal } // end of check_unique }} {{ public HashMap parents = new HashMap(); //helper method to get parent names public String getParent(String pname) { return (String) parents.get(String.valueOf(pname)); } public void check_singleInheritance(ClassGraph cg) { Strategy sg = new Strategy("from Cd_graph through Term_Bar_list to Vertex"); TraversalGraph tg = new TraversalGraph(sg,cg); tg.traverse( this, new Visitor() { //The current adjacency name being looked at Ident curAdj; public void start() { // Starts as empty curAdj = new Ident(""); } public void before(Adjacency host){ curAdj = host.get_source().get_vertex_name(); } public void before(Vertex host) { // get parent of host String parent = getParent(host.get_vertex_name().toString()); if ( parent == null ) { // Put in hashmap parents.put( host.get_vertex_name().toString(), curAdj.toString() ); } else { if( parent != curAdj.toString() ) System.err.println(" ERROR: The class "+ host.get_vertex_name().toString() + " has two super classes: " + parent + ", " + curAdj.toString() + "." ); } } //end of 2nd before method }); // end traversal } // end of singleInheritence }} void display() {{ DisplayVisitor v0 = new DisplayVisitor(); v0.start(); __trav_display(v0); v0.finish(); }} {{ void universal_trv0_bef(UniversalVisitor _v_) { ((UniversalVisitor) _v_).before(this); } }} {{ void universal_trv0_aft(UniversalVisitor _v_) { ((UniversalVisitor) _v_).after(this); } }} {{ void universal_trv0(UniversalVisitor _v_) { universal_trv0_bef(_v_); ((UniversalVisitor) _v_).before_adjacencies(this, adjacencies); adjacencies.universal_trv0(_v_); ((UniversalVisitor) _v_).after_adjacencies(this, adjacencies); universal_trv0_aft(_v_); } }} {{ public void __trav_display(DisplayVisitor __v0) { __trav_display_Cd_graph_trv(__v0); } }} {{ void __trav_display_Cd_graph_trv_bef(DisplayVisitor __v0) { ((DisplayVisitor) __v0).before(this); } }} {{ void __trav_display_Cd_graph_trv_aft(DisplayVisitor __v0) { ((DisplayVisitor) __v0).after(this); } }} {{ void __trav_display_Cd_graph_trv(DisplayVisitor __v0) { __trav_display_Cd_graph_trv_bef(__v0); ((DisplayVisitor) __v0).before_adjacencies(this, adjacencies); adjacencies.__trav_display_Cd_graph_trv(__v0); ((UniversalVisitor) __v0).after_adjacencies(this, adjacencies); __trav_display_Cd_graph_trv_aft(__v0); } }} }