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