-end
-
-# Abstract standard visitor
-class Visitor
- # Ask the visitor to visit a given node.
- # Usually automatically called by visit_all* methods.
- # Concrete visitors should redefine this method.
- meth visit(e: PNode) is abstract
-end
-
-redef class AModule
- redef meth n_packagedecl=(n: PPackagedecl)
- do
- _n_packagedecl = n
- if n != null then
- n.parent = self
- end
- end
-
- private init empty_init do end
-
- init init_amodule (
- n_packagedecl: PPackagedecl ,
- n_imports: Array[Object] , # Should be Array[PImport]
- n_classdefs: Array[Object] # Should be Array[PClassdef]
- )
- do
- _n_packagedecl = n_packagedecl
- if n_packagedecl != null then
- n_packagedecl.parent = self
- end
- _n_imports = new List[PImport]
- for n in n_imports do
- assert n isa PImport
- _n_imports.add(n)
- n.parent = self
- end
- _n_classdefs = new List[PClassdef]
- for n in n_classdefs do
- assert n isa PClassdef
- _n_classdefs.add(n)
- n.parent = self
- end
- end
-
- redef meth replace_child(old_child: PNode, new_child: PNode)
- do
- assert old_child != null
- if _n_packagedecl == old_child then
- if new_child != null then
- new_child.parent = self
- assert new_child isa PPackagedecl
- _n_packagedecl = new_child
- else
- _n_packagedecl = null
- end
- return
- end
- for i in [0.._n_imports.length[ do
- if _n_imports[i] == old_child then
- if new_child != null then
- assert new_child isa PImport
- _n_imports[i] = new_child
- new_child.parent = self
- else
- _n_imports.remove_at(i)
- end
- return
- end
- end
- for i in [0.._n_classdefs.length[ do
- if _n_classdefs[i] == old_child then
- if new_child != null then
- assert new_child isa PClassdef
- _n_classdefs[i] = new_child
- new_child.parent = self
- else
- _n_classdefs.remove_at(i)
- end
- return
- end
- end
- end
-
- redef meth visit_all(v: Visitor)
- do
- if _n_packagedecl != null then
- v.visit(_n_packagedecl)
- end
- for n in _n_imports do
- v.visit(n)
- end
- for n in _n_classdefs do
- v.visit(n)
- end
- end