genuniversal.beh.html
Program{
void addUniversalVisitor(ClassName name)(@
addClassDef(ClassDef.parse("*notparsed* *visitor* " + name + " : ."));
@)
void generateUniversalVisitor(ClassName name, File file)=allParts{
(@
boolean first = true;
String all = ""; // the names of all classes and parts
Hashtable partnames = new Hashtable();
Hashtable builtins = new Hashtable();
@)
before Program (@
host.openOutputFile(file);
@)
(@ ClassName classname; @)
around ClassDef (@
if (!host.isVisitor()) {
classname = host.get_classname();
if (first) first = false; else all += ",";
all += "\n " + classname;
subtraversal.apply();
}
@)
before Part (@
if (host.isFinal() || host.isStatic() || host.isDerived()) return;
PartName name = host.get_partname();
ClassName type = host.get_classname();
all += ", -> " + classname + "," + name + "," + type;
/* Bah. Fix this.
if (type.isBuiltinType()) {
String key = name + " " + type;
if (builtins.get(key) == null) {
builtins.put(key, key);
all += ", -> *," + name + "," + type;
}
} else if (partnames.get(name) == null) {
partnames.put(name, name);
all += ", -> *," + name + ",*";
}
*/
@)
after Program (@
Program.out.println(
"// This file is automatically generated by Demeter/Java.\n"
+"\n"
+ name + " {\n"
+" before { " + all + "\n } " + Text.begin + " " + Text.end + "\n"
/*
+" around { " + all + "\n } " + Text.begin + " subtraversal.apply(); "
+ Text.end + "\n"
*/
+" after { " + all + "\n } " + Text.begin + " " + Text.end + "\n"
+"}\n");
host.closeOutputFile();
@)
}
void expandUniversalTraversal(String trav, ClassName vis)(@
TraversalName name = TraversalName.parse(trav);
TraversalParms parms = TraversalParms.parse("(" + vis + " _v_)");
markEverything();
makeTraversalMethods(new TraversalMethodName(name), parms, "_v_", false);
@)
}