param.beh.html
Program{
private void expandParamDefs()to ClassSpec{
after ClassSpec (@
ClassName name = host.get_classname();
ClassSpec_Commalist actuals = host.get_actual_parameters();
if (actuals != null) {
// It's a parameterized class; make sure it hasn't already been
// defined.
ClassName newname = host.expandName();
if (!Program.prog.definesClass(newname)) {
// It hasn't; get the parameterized definition, copy it,
// replace the parameters with the actual parameters, and add
// it to the list of class defs.
ClassDef paramdef = Program.prog.findClassDef(name);
if (paramdef == null) {
System.err.println("Error: no such parameterized class \""
+ name + "\"");
} else {
ClassDef actualdef = paramdef.deepCopy();
ParamClassName pname = ParamClassName.parse(newname.toString());
actualdef.set_paramclassname(pname);
actualdef.allParts(new ParamReplacer(paramdef.get_parameters(),
actuals));
Program.prog.addClassDef(actualdef);
}
}
}
@)
after Program (@
// Remove the parameterized definitions from the class graph.
ClassGraph cg = new ClassGraph();
NonParamDefCollector coll = new NonParamDefCollector(cg);
host.allClassDefs(coll);
host.set_cg(coll.get_cg());
@)
}
}
ClassSpec{
ClassName expandName()(@
if (actual_parameters != null) {
String newname = actual_parameters.concatenateNames() + classname;
classname = ClassName.parse(newname);
actual_parameters = null;
}
return classname;
@)
}
ClassSpec_Commalist{
String concatenateNames()to ClassName{
init (@ return_val = ""; @)
before ClassName (@ return_val += host + "_"; @)
}
}
ParamReplacer{
before{ Part, RepeatedPart }(@
int i = params.indexOf(host.get_classname());
if (i != -1) {
ClassSpec actual = actuals.elementAt(i);
host.set_classname(actual.get_classname());
}
@)
}
NonParamDefCollector{
before ClassDef (@
if (host.get_parameters() == null) cg.addClassDef(host);
@)
}