// Terminal Buffer Rule /* * the following code is adapted from real DJ code found at: * http://www.ccs.neu.edu/research/demeter/DemeterJava/use/latest-demjava/ * aplib/cd/utils.beh * Note: This source is acknowledged from bob's directory (turacma) */ Opt_labeled_term { {{ private static String builtinTypes[] = { "boolean", "char", "byte", "short", "int", "long", "float", "double" }; private static String terminalClasses[] = { // from java.lang.*: "Boolean", "Character", "Integer", "Long", "Float", "Double", "Number", "String", "StringBuffer", // from demeter.*: "Ident", "Text", "Line", "Word" }; }} boolean isBuiltinType() {{ String s = get_class_name(); for (int i = 0; i < builtinTypes.length; i++) { if (builtinTypes[i].equals(s)) return true; } return false; }} boolean isTerminalClass() {{ String s = get_class_name(); for (int i = 0; i < terminalClasses.length; i++) { if (terminalClasses[i].equals(s)) return true; } return false; }} boolean isKnownTerminal() {{ return isBuiltinType() || isTerminalClass(); }} } /* * End of adapted code */ // Need to add a method get_class_name to Opt_labeled_term Opt_labeled_term { String get_class_name() to Vertex { before Vertex {{ return_val = host.get_vertex_name().toString(); }} } } AdjVisitor { (@ private boolean pass = true; protected TraversalGraph tg = new TraversalGraph("from Adjacency to Opt_labeled_term", Main.cg1); void before (Adjacency host) { BufferVisitor bv = new BufferVisitor(); tg.traverse(host, bv); if ((bv.counter() > 1) && (!bv.get_tset().isEmpty())) { System.out.println("** Warning ** Class "+host.get_source().get_vertex_name() + " violates TBR. Class "+bv.get_tset()+" not the only part class."); pass = false; } } public boolean isPass() { return pass; } @) } BufferVisitor { (@ Set tSet = new HashSet(); private int count=0;; void before (Opt_labeled_term host) { count++; if (host.isKnownTerminal()) tSet.add(host.get_class_name()); } public Set get_tset() { return tSet; } public int counter() { return count; } @) }