genequalvis.beh.html

Program{
	void addEqualVisitor(String name)(@
    addClassDef(ClassDef.parse("*notparsed* *visitor* " + name + " = "
			       + "<is_equal> boolean *init* "
			       + Text.begin + " true " + Text.end + "."));
  @)
	void generateEqualVisitor(String name, File file)=allParts{
		before Program (@
      host.openOutputFile(file);
      Program.out.println(
 "// This file is automatically generated by Demeter/Java.\n"
+"\n"
+ name + " {\n"
+"  " + Text.begin + "\n"
+"    private java.util.Stack history = new java.util.Stack();\n"
+"    public " + name + "(Object obj) {\n"
+"      history.push(obj);\n"
+"    }\n"
+"  " + Text.end + "\n"
      );
    @)
		(@ ClassName classname; String body; @)
		before ClassDef (@
      classname = host.get_classname();
      body = "    Object obj = history.peek();\n"
	+ "    is_equal = is_equal && obj.getClass().equals(host.getClass())";
    @)
		before Part (@
      // Don't compare final, static or derived members.
      if (host.isFinal() || host.isStatic() || host.isDerived()) return;
      PartName partname = host.get_partname();
      ClassName dest = host.get_classname();
      if (Program.prog.definesClass(dest)) {
	String part_body =
	  "    if (is_equal) {\n"
	+ "      " + classname + " obj = (" + classname + ") history.peek();\n"
	+ "      history.push(obj.get_" + partname + "());\n"
	+ "    }\n";
	Program.out.println(
	  host.makeBefore(classname, part_body) + "\n"
	+ host.makeAfter(classname, "    if (is_equal) history.pop();\n")
	+ "\n");
      } else {
	body += "\n      && host.get_" + partname + "()";
	String rest = "((" + classname + ") obj).get_" + partname + "()";
	if (dest.isBuiltinType()) {
	  body += " == " + rest;
	} else {
	  body += ".equals(" + rest + ")";
	}
      }
    @)
		after ClassDef (@
      Program.out.println(classname.makeBefore(body + ";") + "\n");
    @)
		after Program (@
      Program.out.println(
	"  return boolean " + Text.begin + " is_equal " + Text.end + "\n}");
      host.closeOutputFile();
    @)
	}
}