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