core: import edu.neu.ccs.demeter.dj.*; import java.util.*; import java.lang.reflect.*; import edu.neu.ccs.demeter.*; add: class Adjacency { protected Vertex source; public Vertex get_source() {{ return source; }} public void set_source(Vertex new_source) {{ source = new_source; }} protected Vertex_Comma_list parameters; public Vertex_Comma_list get_parameters() {{ return parameters; }} public void set_parameters(Vertex_Comma_list new_parameters) {{ parameters = new_parameters; }} protected Neighbors ns; public Neighbors get_ns() {{ return ns; }} public void set_ns(Neighbors new_ns) {{ ns = new_ns; }} public constructor Adjacency() {{ super(); }} public constructor Adjacency(Vertex source, Vertex_Comma_list parameters, Neighbors ns) {{ super(); set_source(source); set_parameters(parameters); set_ns(ns); }} public static Adjacency parse(java.io.Reader in) throws ParseException {{ return new Parser(in)._Adjacency(); }} public static Adjacency parse(java.io.InputStream in) throws ParseException {{ return new Parser(in)._Adjacency(); }} public static Adjacency parse(String s) {{ try { return parse(new java.io.StringReader(s)); } catch (ParseException e) { throw new RuntimeException(e.toString()); } }} {{ public static final String bypassed = " bypassing {Strategy, TraversalGraph, ClassGraph, String} "; public static final Strategy nameStrategy = new Strategy("from Vertex to" + Main.FIDENT + bypassed); public static final Strategy allNormalStrategy = new Strategy("{Adjacency -> Normal}" + bypassed); public static final Strategy onlyPartsStrategy = new Strategy("from Adjacency through Any_vertex_List to Normal"); public final TraversalGraph nameGraph = new TraversalGraph(nameStrategy, Main.cg); List immediateSuperClasses = new ArrayList(); List inheritedParts = new ArrayList(); String getName() { return nameGraph.fetch(get_source()).toString(); } void addPart(String partName, String partClassName) { // System.out.println("Adding " + partClassName + "..." + getName()); inheritedParts.add(partClassName); ns.addPart(partName); } void addSuperClass(String superClassName) { immediateSuperClasses.add(superClassName); } boolean isMultiInherit() { return immediateSuperClasses.size()>1; } String getSuperClass() { int size = immediateSuperClasses.size(); switch (size) { case 0: return null; case 1: return (String)immediateSuperClasses.get(0); default: throw new RuntimeException("getSuperClass():Multiple Inheritance Failure"); } } void printSupers() { Iterator iter = immediateSuperClasses.iterator(); for (;iter.hasNext();) { System.out.print(iter.next()); if (iter.hasNext()) System.out.print(", "); } } List checkCycle() { String superName = getSuperClass(); List supers = new ArrayList(); Adjacency adj; if (superName == null) { return null; } else { while (superName != null && !supers.contains(superName)) { supers.add(superName); adj = (Adjacency)Cd_graph.adjs.get(superName); superName = adj.getSuperClass(); } if (supers.contains(superName)) { return supers; } return null; } } static final String paramStrategy = "from Vertex_Comma_list to "+ Main.FIDENT; boolean tbrV = false; boolean hasUndefinedParts() { TraversalGraph tgp; List params = null; if (parameters != null) { tgp = new TraversalGraph(paramStrategy, Main.cg); params = tgp.gather(parameters); Iterator pIter = params.iterator(); for (;pIter.hasNext();) { Cd_graph.definedClasses.add(pIter.next().toString()); } } TraversalGraph tg = new TraversalGraph(onlyPartsStrategy, Main.cg); List parts = tg.gather(this); Iterator iter = parts.iterator(); boolean terminalEncountered = false; String s; // System.out.print("["); for (; iter.hasNext();) { s = ((Normal)iter.next()).get_vertex().get_vertex_name().toString(); // System.out.print(" " + s + " "); if (!Cd_graph.definedClasses.contains(s)) { if (!ClassFinder.classExist(s)) { Cd_graph.undefinedParts.add(s); } else { terminalEncountered = true; if (parts.size()>1) tbrV = true; } } } // System.out.println("]"); if (inheritedParts.size()>0) { Iterator ipIter = inheritedParts.iterator(); for(;(!tbrV) && ipIter.hasNext() ;) { s = ipIter.next().toString(); if ((!Cd_graph.definedClasses.contains(s)) && ClassFinder.classExist(s)) { if (terminalEncountered) tbrV = true; else terminalEncountered = true; } } } if (parameters != null) { Iterator pIter = params.iterator(); for (;pIter.hasNext();) { Cd_graph.definedClasses.remove(pIter.next().toString()); } } if (tbrV) propagateTBRV(); // if (getSuperClass() != null) // tbrV = tbrV || ((Adjacency)(Cd_graph.adjs.get(getSuperClass()))).tbrV; // if (tbrV) System.out.println("WARNING: " + getName() + " violates the terminal buffer rule!"); return Cd_graph.undefinedParts.size()>0; } void propagateTBRV() { tbrV = true; get_ns().propagateTBRV(); } }} {{ 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_source(this, source); source.universal_trv0(_v_); ((UniversalVisitor) _v_).after_source(this, source); if (parameters != null) { ((UniversalVisitor) _v_).before_parameters(this, parameters); parameters.universal_trv0(_v_); ((UniversalVisitor) _v_).after_parameters(this, parameters); } ((UniversalVisitor) _v_).before_ns(this, ns); ns.universal_trv0(_v_); ((UniversalVisitor) _v_).after_ns(this, ns); universal_trv0_aft(_v_); } }} {{ 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_source(this, source); source.__trav_display_Cd_graph_trv(__v0); ((UniversalVisitor) __v0).after_source(this, source); if (parameters != null) { ((DisplayVisitor) __v0).before_parameters(this, parameters); parameters.__trav_display_Cd_graph_trv(__v0); ((UniversalVisitor) __v0).after_parameters(this, parameters); } ((DisplayVisitor) __v0).before_ns(this, ns); ns.__trav_display_Cd_graph_trv(__v0); ((UniversalVisitor) __v0).after_ns(this, ns); __trav_display_Cd_graph_trv_aft(__v0); } }} }