inherit.beh.html
Program{
private void markVisitors()to{ BeginVisitors, EndVisitors, ClassDef }{
(@ boolean visitor = false; @)
before BeginVisitors (@ visitor = true; @)
before EndVisitors (@ visitor = false; @)
before ClassDef (@ if (visitor) host.markVisitor(); @)
}
}
Program{
private void setInheritanceLinks()to Subclass{
(@ ClassName parent_name; @)
before ClassDef (@
parent_name = host.get_classname();
if (host.isVisitor() && !parent_name.equals(Program.univis)) {
host.set_parent(Program.univis);
}
@)
before Subclass (@
ClassName clname = host.get_classname();
ClassDef def = Program.prog.findClassDef(clname);
if (def == null) {
// should throw an exception...
System.err.println("Error: no such class \"" + clname + "\"");
} else {
def.set_parent(parent_name);
}
@)
}
}
ClassDef{
void set_parent(ClassName parent_name)to ClassParents{
(@ ClassName child_name; boolean isInterface; @)
before ClassDef (@
child_name = host.get_classname();
isInterface = host.isInterface();
@)
(@ static Superclass univis
= Superclass.parse(Program.univis.toString()); @)
before ClassParents (@
Superclass_Commalist parents = host.get_superclasses();
if (parents == null || parents.contains(univis)) {
parents = new Superclass_Commalist();
host.set_superclasses(parents);
}
Superclass newparent = Superclass.parse(parent_name.toString());
if (isInterface || parents.isEmpty()) {
parents.addElement(newparent);
} else if (!(newparent.equals(Program.univis)
|| parents.contains(newparent))) {
System.err.println(
"Error: class " + child_name + " cannot have more than one parent: " +
parent_name + " (previous parent: " + parents + ")");
}
@)
}
}