parser: add qualified module names
[nit.git] / src / parser / parser_prod.nit
index 83f62d7..9f442dd 100644 (file)
@@ -1,25 +1,26 @@
 # Production AST nodes full definition.
-# This file was generated by SableCC (http://www.sablecc.org/). 
+# This file was generated by SableCC (http://www.sablecc.org/).
 package parser_prod
 
 import lexer
 intrude import parser_nodes
+private import tables
 
-redef class PNode
+redef class ANode
        # Parent of the node in the AST
-       readable writable var _parent: nullable PNode
+       readable writable var _parent: nullable ANode
 
        # Remove a child from the AST
-       fun remove_child(child: PNode)
+       fun remove_child(child: ANode)
        do
                replace_child(child, null)
        end
 
        # Replace a child with an other node in the AST
-       fun replace_child(old_child: PNode, new_child: nullable PNode) is abstract
+       fun replace_child(old_child: ANode, new_child: nullable ANode) is abstract
 
        # Replace itself with an other node in the AST
-       fun replace_with(node: PNode)
+       fun replace_with(node: ANode)
        do
                if (_parent != null) then
                        _parent.replace_child(self, node)
@@ -29,108 +30,85 @@ redef class PNode
        # Visit all nodes in order.
        # Thus, call "v.visit(e)" for each node e
        fun visit_all(v: Visitor) is abstract
-
-       # Visit all nodes in reverse order.
-       # Thus, call "v.visit(e)" for each node e starting from the last child
-       fun visit_all_reverse(v: Visitor) is abstract
-
-       # Give a human readable location of the node.
-       fun locate: String
-       do
-               if location == null then
-                       return "????"
-               end
-               return location.to_s
-       end
-
-       # Debug method: output a message prefixed with the location.
-       fun printl(str: String)
-       do
-               print("{locate}: {str}\n")
-       end
 end
 
 redef class Token
        redef fun visit_all(v: Visitor) do end
-       redef fun visit_all_reverse(v: Visitor) do end
-       redef fun replace_child(old_child: PNode, new_child: nullable PNode) do end
+       redef fun replace_child(old_child: ANode, new_child: nullable ANode) do end
 end
 
 redef class Prod
-       # The first token of the production node
-       readable writable var _first_token: nullable Token
-
-       # The last token of the production node
-       readable writable var _last_token: nullable Token
-
-       redef fun replace_with(n: PNode)
+       redef fun replace_with(n: ANode)
         do
                 super
                 assert n isa Prod
-                n.first_token = first_token
-                n.last_token = last_token
                 n.location = location
         end
 end
 
 # Abstract standard visitor
 class Visitor
+       # What the visitor do when a node is visited
+        # Concrete visitors should redefine this method.
+        protected fun visit(e: nullable ANode) is abstract
+
         # Ask the visitor to visit a given node.
         # Usually automatically called by visit_all* methods.
-        # Concrete visitors should redefine this method.
-        fun visit(e: nullable PNode) is abstract
+       # This methos should not be redefined
+        fun enter_visit(e: nullable ANode)
+       do
+               var old = _current_node
+               _current_node = e
+               visit(e)
+               _current_node = old
+       end
+
+       # The current visited node
+       readable var _current_node: nullable ANode = null
 end
 
 redef class AModule
-    redef fun n_packagedecl=(n)
-    do
-        _n_packagedecl = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_amodule (
-            n_packagedecl: nullable PPackagedecl ,
-            n_imports: Collection[Object] , # Should be Collection[PImport]
-            n_classdefs: Collection[Object]  # Should be Collection[PClassdef]
+            n_moduledecl: nullable AModuledecl,
+            n_imports: Collection[Object], # Should be Collection[AImport]
+            n_classdefs: Collection[Object] # Should be Collection[AClassdef]
     )
     do
         empty_init
-        _n_packagedecl = n_packagedecl
-       if n_packagedecl != null then
-               n_packagedecl.parent = self
+        _n_moduledecl = n_moduledecl
+       if n_moduledecl != null then
+               n_moduledecl.parent = self
        end
        for n in n_imports do
-               assert n isa PImport
+               assert n isa AImport
                _n_imports.add(n)
                n.parent = self
        end
        for n in n_classdefs do
-               assert n isa PClassdef
+               assert n isa AClassdef
                _n_classdefs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_packagedecl == old_child then
+        if _n_moduledecl == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PPackagedecl
-                _n_packagedecl = new_child
+               assert new_child isa AModuledecl
+                _n_moduledecl = new_child
            else
-               _n_packagedecl = null
+               _n_moduledecl = 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
+                   assert new_child isa AImport
                     _n_imports[i] = new_child
                     new_child.parent = self
                 else
@@ -142,7 +120,7 @@ redef class AModule
         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
+                   assert new_child isa AClassdef
                     _n_classdefs[i] = new_child
                     new_child.parent = self
                 else
@@ -155,63 +133,24 @@ redef class AModule
 
     redef fun visit_all(v: Visitor)
     do
-        if _n_packagedecl != null then
-            v.visit(_n_packagedecl.as(not null))
+        if _n_moduledecl != null then
+            v.enter_visit(_n_moduledecl.as(not null))
         end
             for n in _n_imports do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_classdefs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_packagedecl != null then
-            v.visit(_n_packagedecl.as(not null))
-        end
-       do
-           var i = _n_imports.length
-            while i >= 0 do
-                v.visit(_n_imports[i])
-               i = i - 1
-           end
-       end
-       do
-           var i = _n_classdefs.length
-            while i >= 0 do
-                v.visit(_n_classdefs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
-redef class APackagedecl
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwpackage=(n)
-    do
-        _n_kwpackage = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
+redef class AModuledecl
     private init empty_init do end
 
-    init init_apackagedecl (
-            n_doc: nullable PDoc ,
-            n_kwpackage: nullable TKwpackage ,
-            n_id: nullable TId 
+    init init_amoduledecl (
+            n_doc: nullable ADoc,
+            n_kwmodule: nullable TKwmodule,
+            n_name: nullable AModuleName
     )
     do
         empty_init
@@ -219,39 +158,39 @@ redef class APackagedecl
        if n_doc != null then
                n_doc.parent = self
        end
-        _n_kwpackage = n_kwpackage.as(not null)
-       n_kwpackage.parent = self
-        _n_id = n_id.as(not null)
-       n_id.parent = self
+        _n_kwmodule = n_kwmodule.as(not null)
+       n_kwmodule.parent = self
+        _n_name = n_name.as(not null)
+       n_name.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
             end
             return
        end
-        if _n_kwpackage == old_child then
+        if _n_kwmodule == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwpackage
-                _n_kwpackage = new_child
+               assert new_child isa TKwmodule
+                _n_kwmodule = new_child
            else
                abort
             end
             return
        end
-        if _n_id == old_child then
+        if _n_name == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TId
-                _n_id = new_child
+               assert new_child isa AModuleName
+                _n_name = new_child
            else
                abort
             end
@@ -262,44 +201,19 @@ redef class APackagedecl
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        v.visit(_n_kwpackage)
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
-        v.visit(_n_kwpackage)
-        v.visit(_n_id)
+        v.enter_visit(_n_kwmodule)
+        v.enter_visit(_n_name)
     end
 end
-redef class AImport
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwimport=(n)
-    do
-        _n_kwimport = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
+redef class AStdImport
     private init empty_init do end
 
-    init init_aimport (
-            n_visibility: nullable PVisibility ,
-            n_kwimport: nullable TKwimport ,
-            n_id: nullable TId 
+    init init_astdimport (
+            n_visibility: nullable AVisibility,
+            n_kwimport: nullable TKwimport,
+            n_name: nullable AModuleName
     )
     do
         empty_init
@@ -307,16 +221,16 @@ redef class AImport
        n_visibility.parent = self
         _n_kwimport = n_kwimport.as(not null)
        n_kwimport.parent = self
-        _n_id = n_id.as(not null)
-       n_id.parent = self
+        _n_name = n_name.as(not null)
+       n_name.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -333,11 +247,11 @@ redef class AImport
             end
             return
        end
-        if _n_id == old_child then
+        if _n_name == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TId
-                _n_id = new_child
+               assert new_child isa AModuleName
+                _n_name = new_child
            else
                abort
             end
@@ -347,41 +261,18 @@ redef class AImport
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_visibility)
-        v.visit(_n_kwimport)
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_visibility)
-        v.visit(_n_kwimport)
-        v.visit(_n_id)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwimport)
+        v.enter_visit(_n_name)
     end
 end
 redef class ANoImport
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwimport=(n)
-    do
-        _n_kwimport = n
-       n.parent = self
-    end
-    redef fun n_kwend=(n)
-    do
-        _n_kwend = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_anoimport (
-            n_visibility: nullable PVisibility ,
-            n_kwimport: nullable TKwimport ,
-            n_kwend: nullable TKwend 
+            n_visibility: nullable AVisibility,
+            n_kwimport: nullable TKwimport,
+            n_kwend: nullable TKwend
     )
     do
         empty_init
@@ -393,12 +284,12 @@ redef class ANoImport
        n_kwend.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -429,20 +320,12 @@ redef class ANoImport
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_visibility)
-        v.visit(_n_kwimport)
-        v.visit(_n_kwend)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_visibility)
-        v.visit(_n_kwimport)
-        v.visit(_n_kwend)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwimport)
+        v.enter_visit(_n_kwend)
     end
 end
 redef class APublicVisibility
-
     private init empty_init do end
 
     init init_apublicvisibility
@@ -450,29 +333,19 @@ redef class APublicVisibility
         empty_init
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
     end
 
     redef fun visit_all(v: Visitor)
     do
     end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-    end
 end
 redef class APrivateVisibility
-    redef fun n_kwprivate=(n)
-    do
-        _n_kwprivate = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aprivatevisibility (
-            n_kwprivate: nullable TKwprivate 
+            n_kwprivate: nullable TKwprivate
     )
     do
         empty_init
@@ -480,7 +353,7 @@ redef class APrivateVisibility
        n_kwprivate.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwprivate == old_child then
             if new_child != null then
@@ -496,25 +369,14 @@ redef class APrivateVisibility
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwprivate)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwprivate)
+        v.enter_visit(_n_kwprivate)
     end
 end
 redef class AProtectedVisibility
-    redef fun n_kwprotected=(n)
-    do
-        _n_kwprotected = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aprotectedvisibility (
-            n_kwprotected: nullable TKwprotected 
+            n_kwprotected: nullable TKwprotected
     )
     do
         empty_init
@@ -522,7 +384,7 @@ redef class AProtectedVisibility
        n_kwprotected.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwprotected == old_child then
             if new_child != null then
@@ -538,25 +400,14 @@ redef class AProtectedVisibility
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwprotected)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwprotected)
+        v.enter_visit(_n_kwprotected)
     end
 end
 redef class AIntrudeVisibility
-    redef fun n_kwintrude=(n)
-    do
-        _n_kwintrude = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aintrudevisibility (
-            n_kwintrude: nullable TKwintrude 
+            n_kwintrude: nullable TKwintrude
     )
     do
         empty_init
@@ -564,7 +415,7 @@ redef class AIntrudeVisibility
        n_kwintrude.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwintrude == old_child then
             if new_child != null then
@@ -580,58 +431,21 @@ redef class AIntrudeVisibility
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwintrude)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwintrude)
+        v.enter_visit(_n_kwintrude)
     end
 end
-redef class AClassdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_classkind=(n)
-    do
-        _n_classkind = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
+redef class AStdClassdef
     private init empty_init do end
 
-    init init_aclassdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_classkind: nullable PClasskind ,
-            n_id: nullable TClassid ,
-            n_formaldefs: Collection[Object] , # Should be Collection[PFormaldef]
-            n_superclasses: Collection[Object] , # Should be Collection[PSuperclass]
-            n_propdefs: Collection[Object]  # Should be Collection[PPropdef]
+    init init_astdclassdef (
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_classkind: nullable AClasskind,
+            n_id: nullable TClassid,
+            n_formaldefs: Collection[Object], # Should be Collection[AFormaldef]
+            n_superclasses: Collection[Object], # Should be Collection[ASuperclass]
+            n_propdefs: Collection[Object] # Should be Collection[APropdef]
     )
     do
         empty_init
@@ -652,28 +466,28 @@ redef class AClassdef
                n_id.parent = self
        end
        for n in n_formaldefs do
-               assert n isa PFormaldef
+               assert n isa AFormaldef
                _n_formaldefs.add(n)
                n.parent = self
        end
        for n in n_superclasses do
-               assert n isa PSuperclass
+               assert n isa ASuperclass
                _n_superclasses.add(n)
                n.parent = self
        end
        for n in n_propdefs do
-               assert n isa PPropdef
+               assert n isa APropdef
                _n_propdefs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -693,7 +507,7 @@ redef class AClassdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -703,7 +517,7 @@ redef class AClassdef
         if _n_classkind == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PClasskind
+               assert new_child isa AClasskind
                 _n_classkind = new_child
            else
                abort
@@ -723,7 +537,7 @@ redef class AClassdef
         for i in [0.._n_formaldefs.length[ do
             if _n_formaldefs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PFormaldef
+                   assert new_child isa AFormaldef
                     _n_formaldefs[i] = new_child
                     new_child.parent = self
                 else
@@ -735,7 +549,7 @@ redef class AClassdef
         for i in [0.._n_superclasses.length[ do
             if _n_superclasses[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PSuperclass
+                   assert new_child isa ASuperclass
                     _n_superclasses[i] = new_child
                     new_child.parent = self
                 else
@@ -747,7 +561,7 @@ redef class AClassdef
         for i in [0.._n_propdefs.length[ do
             if _n_propdefs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PPropdef
+                   assert new_child isa APropdef
                     _n_propdefs[i] = new_child
                     new_child.parent = self
                 else
@@ -761,85 +575,48 @@ redef class AClassdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_classkind)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_classkind)
         if _n_id != null then
-            v.visit(_n_id.as(not null))
+            v.enter_visit(_n_id.as(not null))
         end
             for n in _n_formaldefs do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_superclasses do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_propdefs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_classkind)
-        if _n_id != null then
-            v.visit(_n_id.as(not null))
-        end
-       do
-           var i = _n_formaldefs.length
-            while i >= 0 do
-                v.visit(_n_formaldefs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
-       do
-           var i = _n_superclasses.length
-            while i >= 0 do
-                v.visit(_n_superclasses[i])
-               i = i - 1
-           end
-       end
-       do
-           var i = _n_propdefs.length
-            while i >= 0 do
-                v.visit(_n_propdefs[i])
-               i = i - 1
-           end
-       end
     end
 end
 redef class ATopClassdef
-
     private init empty_init do end
 
     init init_atopclassdef (
-            n_propdefs: Collection[Object]  # Should be Collection[PPropdef]
+            n_propdefs: Collection[Object] # Should be Collection[APropdef]
     )
     do
         empty_init
        for n in n_propdefs do
-               assert n isa PPropdef
+               assert n isa APropdef
                _n_propdefs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_propdefs.length[ do
             if _n_propdefs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PPropdef
+                   assert new_child isa APropdef
                     _n_propdefs[i] = new_child
                     new_child.parent = self
                 else
@@ -853,43 +630,31 @@ redef class ATopClassdef
     redef fun visit_all(v: Visitor)
     do
             for n in _n_propdefs do
-                v.visit(n)
+                v.enter_visit(n)
            end
     end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_propdefs.length
-            while i >= 0 do
-                v.visit(_n_propdefs[i])
-               i = i - 1
-           end
-       end
-    end
 end
 redef class AMainClassdef
-
     private init empty_init do end
 
     init init_amainclassdef (
-            n_propdefs: Collection[Object]  # Should be Collection[PPropdef]
+            n_propdefs: Collection[Object] # Should be Collection[APropdef]
     )
     do
         empty_init
        for n in n_propdefs do
-               assert n isa PPropdef
+               assert n isa APropdef
                _n_propdefs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_propdefs.length[ do
             if _n_propdefs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PPropdef
+                   assert new_child isa APropdef
                     _n_propdefs[i] = new_child
                     new_child.parent = self
                 else
@@ -903,32 +668,15 @@ redef class AMainClassdef
     redef fun visit_all(v: Visitor)
     do
             for n in _n_propdefs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_propdefs.length
-            while i >= 0 do
-                v.visit(_n_propdefs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AConcreteClasskind
-    redef fun n_kwclass=(n)
-    do
-        _n_kwclass = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aconcreteclasskind (
-            n_kwclass: nullable TKwclass 
+            n_kwclass: nullable TKwclass
     )
     do
         empty_init
@@ -936,7 +684,7 @@ redef class AConcreteClasskind
        n_kwclass.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwclass == old_child then
             if new_child != null then
@@ -952,31 +700,15 @@ redef class AConcreteClasskind
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwclass)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwclass)
+        v.enter_visit(_n_kwclass)
     end
 end
 redef class AAbstractClasskind
-    redef fun n_kwabstract=(n)
-    do
-        _n_kwabstract = n
-       n.parent = self
-    end
-    redef fun n_kwclass=(n)
-    do
-        _n_kwclass = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aabstractclasskind (
-            n_kwabstract: nullable TKwabstract ,
-            n_kwclass: nullable TKwclass 
+            n_kwabstract: nullable TKwabstract,
+            n_kwclass: nullable TKwclass
     )
     do
         empty_init
@@ -986,7 +718,7 @@ redef class AAbstractClasskind
        n_kwclass.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwabstract == old_child then
             if new_child != null then
@@ -1012,27 +744,15 @@ redef class AAbstractClasskind
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwabstract)
-        v.visit(_n_kwclass)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwabstract)
-        v.visit(_n_kwclass)
+        v.enter_visit(_n_kwabstract)
+        v.enter_visit(_n_kwclass)
     end
 end
 redef class AInterfaceClasskind
-    redef fun n_kwinterface=(n)
-    do
-        _n_kwinterface = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_ainterfaceclasskind (
-            n_kwinterface: nullable TKwinterface 
+            n_kwinterface: nullable TKwinterface
     )
     do
         empty_init
@@ -1040,7 +760,7 @@ redef class AInterfaceClasskind
        n_kwinterface.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwinterface == old_child then
             if new_child != null then
@@ -1056,39 +776,28 @@ redef class AInterfaceClasskind
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwinterface)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwinterface)
+        v.enter_visit(_n_kwinterface)
     end
 end
-redef class AUniversalClasskind
-    redef fun n_kwuniversal=(n)
-    do
-        _n_kwuniversal = n
-       n.parent = self
-    end
-
+redef class AEnumClasskind
     private init empty_init do end
 
-    init init_auniversalclasskind (
-            n_kwuniversal: nullable TKwuniversal 
+    init init_aenumclasskind (
+            n_kwenum: nullable TKwenum
     )
     do
         empty_init
-        _n_kwuniversal = n_kwuniversal.as(not null)
-       n_kwuniversal.parent = self
+        _n_kwenum = n_kwenum.as(not null)
+       n_kwenum.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwuniversal == old_child then
+        if _n_kwenum == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwuniversal
-                _n_kwuniversal = new_child
+               assert new_child isa TKwenum
+                _n_kwenum = new_child
            else
                abort
             end
@@ -1098,33 +807,15 @@ redef class AUniversalClasskind
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwuniversal)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwuniversal)
+        v.enter_visit(_n_kwenum)
     end
 end
 redef class AFormaldef
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aformaldef (
-            n_id: nullable TClassid ,
-            n_type: nullable PType 
+            n_id: nullable TClassid,
+            n_type: nullable AType
     )
     do
         empty_init
@@ -1136,7 +827,7 @@ redef class AFormaldef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -1151,7 +842,7 @@ redef class AFormaldef
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                _n_type = null
@@ -1162,47 +853,35 @@ redef class AFormaldef
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-        if _n_type != null then
-            v.visit(_n_type.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
         if _n_type != null then
-            v.visit(_n_type.as(not null))
+            v.enter_visit(_n_type.as(not null))
         end
     end
 end
 redef class ASuperclass
-    redef fun n_kwspecial=(n)
-    do
-        _n_kwspecial = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_asuperclass (
-            n_kwspecial: nullable TKwspecial ,
-            n_type: nullable PType 
+            n_kwspecial: nullable TKwspecial,
+            n_kwsuper: nullable TKwsuper,
+            n_type: nullable AType
     )
     do
         empty_init
-        _n_kwspecial = n_kwspecial.as(not null)
-       n_kwspecial.parent = self
+        _n_kwspecial = n_kwspecial
+       if n_kwspecial != null then
+               n_kwspecial.parent = self
+       end
+        _n_kwsuper = n_kwsuper
+       if n_kwsuper != null then
+               n_kwsuper.parent = self
+       end
         _n_type = n_type.as(not null)
        n_type.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwspecial == old_child then
             if new_child != null then
@@ -1210,14 +889,24 @@ redef class ASuperclass
                assert new_child isa TKwspecial
                 _n_kwspecial = new_child
            else
-               abort
+               _n_kwspecial = null
+            end
+            return
+       end
+        if _n_kwsuper == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwsuper
+                _n_kwsuper = new_child
+           else
+               _n_kwsuper = null
             end
             return
        end
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                abort
@@ -1228,97 +917,29 @@ redef class ASuperclass
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwspecial)
-        v.visit(_n_type)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwspecial)
-        v.visit(_n_type)
-    end
-end
-redef class AAttrPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_readable=(n)
-    do
-        _n_readable = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_writable=(n)
-    do
-        _n_writable = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwattr=(n)
-    do
-        _n_kwattr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwvar=(n)
-    do
-        _n_kwvar = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-        if n != null then
-           n.parent = self
+        if _n_kwspecial != null then
+            v.enter_visit(_n_kwspecial.as(not null))
         end
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
+        if _n_kwsuper != null then
+            v.enter_visit(_n_kwsuper.as(not null))
         end
+        v.enter_visit(_n_type)
     end
-
+end
+redef class AAttrPropdef
     private init empty_init do end
 
     init init_aattrpropdef (
-            n_doc: nullable PDoc ,
-            n_readable: nullable PAble ,
-            n_writable: nullable PAble ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwattr: nullable TKwattr ,
-            n_kwvar: nullable TKwvar ,
-            n_id: nullable TAttrid ,
-            n_type: nullable PType ,
-            n_expr: nullable PExpr 
+            n_doc: nullable ADoc,
+            n_readable: nullable AAble,
+            n_writable: nullable AAble,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwvar: nullable TKwvar,
+            n_id: nullable TAttrid,
+            n_id2: nullable TId,
+            n_type: nullable AType,
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -1340,16 +961,16 @@ redef class AAttrPropdef
        end
         _n_visibility = n_visibility.as(not null)
        n_visibility.parent = self
-        _n_kwattr = n_kwattr
-       if n_kwattr != null then
-               n_kwattr.parent = self
+        _n_kwvar = n_kwvar.as(not null)
+       n_kwvar.parent = self
+        _n_id = n_id
+       if n_id != null then
+               n_id.parent = self
        end
-        _n_kwvar = n_kwvar
-       if n_kwvar != null then
-               n_kwvar.parent = self
+        _n_id2 = n_id2
+       if n_id2 != null then
+               n_id2.parent = self
        end
-        _n_id = n_id.as(not null)
-       n_id.parent = self
         _n_type = n_type
        if n_type != null then
                n_type.parent = self
@@ -1360,12 +981,12 @@ redef class AAttrPropdef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -1375,7 +996,7 @@ redef class AAttrPropdef
         if _n_readable == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAble
+               assert new_child isa AAble
                 _n_readable = new_child
            else
                _n_readable = null
@@ -1385,7 +1006,7 @@ redef class AAttrPropdef
         if _n_writable == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAble
+               assert new_child isa AAble
                 _n_writable = new_child
            else
                _n_writable = null
@@ -1405,30 +1026,20 @@ redef class AAttrPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
             end
             return
        end
-        if _n_kwattr == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TKwattr
-                _n_kwattr = new_child
-           else
-               _n_kwattr = null
-            end
-            return
-       end
         if _n_kwvar == old_child then
             if new_child != null then
                 new_child.parent = self
                assert new_child isa TKwvar
                 _n_kwvar = new_child
            else
-               _n_kwvar = null
+               abort
             end
             return
        end
@@ -1438,14 +1049,24 @@ redef class AAttrPropdef
                assert new_child isa TAttrid
                 _n_id = new_child
            else
-               abort
+               _n_id = null
+            end
+            return
+       end
+        if _n_id2 == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TId
+                _n_id2 = new_child
+           else
+               _n_id2 = null
             end
             return
        end
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                _n_type = null
@@ -1455,7 +1076,7 @@ redef class AAttrPropdef
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -1467,102 +1088,42 @@ redef class AAttrPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_readable != null then
-            v.visit(_n_readable.as(not null))
+            v.enter_visit(_n_readable.as(not null))
         end
         if _n_writable != null then
-            v.visit(_n_writable.as(not null))
+            v.enter_visit(_n_writable.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        if _n_kwattr != null then
-            v.visit(_n_kwattr.as(not null))
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwvar)
+        if _n_id != null then
+            v.enter_visit(_n_id.as(not null))
         end
-        if _n_kwvar != null then
-            v.visit(_n_kwvar.as(not null))
+        if _n_id2 != null then
+            v.enter_visit(_n_id2.as(not null))
         end
-        v.visit(_n_id)
         if _n_type != null then
-            v.visit(_n_type.as(not null))
+            v.enter_visit(_n_type.as(not null))
         end
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_readable != null then
-            v.visit(_n_readable.as(not null))
-        end
-        if _n_writable != null then
-            v.visit(_n_writable.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        if _n_kwattr != null then
-            v.visit(_n_kwattr.as(not null))
-        end
-        if _n_kwvar != null then
-            v.visit(_n_kwvar.as(not null))
-        end
-        v.visit(_n_id)
-        if _n_type != null then
-            v.visit(_n_type.as(not null))
-        end
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
-        end
-    end
-end
-redef class AMethPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-
-    private init empty_init do end
+end
+redef class AMethPropdef
+    private init empty_init do end
 
     init init_amethpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature
     )
     do
         empty_init
@@ -1582,12 +1143,12 @@ redef class AMethPropdef
        n_signature.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -1607,7 +1168,7 @@ redef class AMethPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -1617,7 +1178,7 @@ redef class AMethPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                abort
@@ -1627,7 +1188,7 @@ redef class AMethPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -1639,74 +1200,26 @@ redef class AMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_methid)
+        v.enter_visit(_n_signature)
     end
 end
 redef class ADeferredMethPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwmeth=(n)
-    do
-        _n_kwmeth = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_adeferredmethpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwmeth: nullable TKwmeth ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwmeth: nullable TKwmeth,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature
     )
     do
         empty_init
@@ -1728,12 +1241,12 @@ redef class ADeferredMethPropdef
        n_signature.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -1753,7 +1266,7 @@ redef class ADeferredMethPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -1773,7 +1286,7 @@ redef class ADeferredMethPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                abort
@@ -1783,7 +1296,7 @@ redef class ADeferredMethPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -1795,76 +1308,27 @@ redef class ADeferredMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwmeth)
+        v.enter_visit(_n_methid)
+        v.enter_visit(_n_signature)
     end
 end
 redef class AInternMethPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwmeth=(n)
-    do
-        _n_kwmeth = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_ainternmethpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwmeth: nullable TKwmeth ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwmeth: nullable TKwmeth,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature
     )
     do
         empty_init
@@ -1886,12 +1350,12 @@ redef class AInternMethPropdef
        n_signature.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -1911,7 +1375,7 @@ redef class AInternMethPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -1931,7 +1395,7 @@ redef class AInternMethPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                abort
@@ -1941,7 +1405,7 @@ redef class AInternMethPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -1953,84 +1417,28 @@ redef class AInternMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwmeth)
+        v.enter_visit(_n_methid)
+        v.enter_visit(_n_signature)
     end
 end
 redef class AExternMethPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwmeth=(n)
-    do
-        _n_kwmeth = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-    redef fun n_extern=(n)
-    do
-        _n_extern = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aexternmethpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwmeth: nullable TKwmeth ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature ,
-            n_extern: nullable TString 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwmeth: nullable TKwmeth,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature,
+            n_extern: nullable TString
     )
     do
         empty_init
@@ -2056,12 +1464,12 @@ redef class AExternMethPropdef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -2081,7 +1489,7 @@ redef class AExternMethPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -2101,7 +1509,7 @@ redef class AExternMethPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                abort
@@ -2111,7 +1519,7 @@ redef class AExternMethPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -2133,90 +1541,31 @@ redef class AExternMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
-        if _n_extern != null then
-            v.visit(_n_extern.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwmeth)
+        v.enter_visit(_n_methid)
+        v.enter_visit(_n_signature)
         if _n_extern != null then
-            v.visit(_n_extern.as(not null))
+            v.enter_visit(_n_extern.as(not null))
         end
     end
 end
 redef class AConcreteMethPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwmeth=(n)
-    do
-        _n_kwmeth = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-    redef fun n_block=(n)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aconcretemethpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwmeth: nullable TKwmeth ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature ,
-            n_block: nullable PExpr 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwmeth: nullable TKwmeth,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature,
+            n_block: nullable AExpr
     )
     do
         empty_init
@@ -2242,12 +1591,12 @@ redef class AConcreteMethPropdef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -2267,7 +1616,7 @@ redef class AConcreteMethPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -2287,7 +1636,7 @@ redef class AConcreteMethPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                abort
@@ -2297,7 +1646,7 @@ redef class AConcreteMethPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -2307,7 +1656,7 @@ redef class AConcreteMethPropdef
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
@@ -2319,92 +1668,31 @@ redef class AConcreteMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwmeth)
-        v.visit(_n_methid)
-        v.visit(_n_signature)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwmeth)
+        v.enter_visit(_n_methid)
+        v.enter_visit(_n_signature)
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
     end
 end
 redef class AConcreteInitPropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwinit=(n)
-    do
-        _n_kwinit = n
-       n.parent = self
-    end
-    redef fun n_methid=(n)
-    do
-        _n_methid = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-    redef fun n_block=(n)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aconcreteinitpropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwinit: nullable TKwinit ,
-            n_methid: nullable PMethid ,
-            n_signature: nullable PSignature ,
-            n_block: nullable PExpr 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwinit: nullable TKwinit,
+            n_methid: nullable AMethid,
+            n_signature: nullable ASignature,
+            n_block: nullable AExpr
     )
     do
         empty_init
@@ -2432,12 +1720,12 @@ redef class AConcreteInitPropdef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -2457,7 +1745,7 @@ redef class AConcreteInitPropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -2477,7 +1765,7 @@ redef class AConcreteInitPropdef
         if _n_methid == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PMethid
+               assert new_child isa AMethid
                 _n_methid = new_child
            else
                _n_methid = null
@@ -2487,7 +1775,7 @@ redef class AConcreteInitPropdef
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -2497,7 +1785,7 @@ redef class AConcreteInitPropdef
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
@@ -2509,62 +1797,28 @@ redef class AConcreteInitPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwinit)
-        if _n_methid != null then
-            v.visit(_n_methid.as(not null))
-        end
-        v.visit(_n_signature)
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwinit)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwinit)
         if _n_methid != null then
-            v.visit(_n_methid.as(not null))
+            v.enter_visit(_n_methid.as(not null))
         end
-        v.visit(_n_signature)
+        v.enter_visit(_n_signature)
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
     end
 end
 redef class AMainMethPropdef
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_block=(n)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_amainmethpropdef (
-            n_kwredef: nullable TKwredef ,
-            n_block: nullable PExpr 
+            n_kwredef: nullable TKwredef,
+            n_block: nullable AExpr
     )
     do
         empty_init
@@ -2578,7 +1832,7 @@ redef class AMainMethPropdef
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwredef == old_child then
             if new_child != null then
@@ -2593,7 +1847,7 @@ redef class AMainMethPropdef
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
@@ -2605,68 +1859,23 @@ redef class AMainMethPropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
     end
 end
 redef class ATypePropdef
-    redef fun n_doc=(n)
-    do
-        _n_doc = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_visibility=(n)
-    do
-        _n_visibility = n
-       n.parent = self
-    end
-    redef fun n_kwtype=(n)
-    do
-        _n_kwtype = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_atypepropdef (
-            n_doc: nullable PDoc ,
-            n_kwredef: nullable TKwredef ,
-            n_visibility: nullable PVisibility ,
-            n_kwtype: nullable TKwtype ,
-            n_id: nullable TClassid ,
-            n_type: nullable PType 
+            n_doc: nullable ADoc,
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwtype: nullable TKwtype,
+            n_id: nullable TClassid,
+            n_type: nullable AType
     )
     do
         empty_init
@@ -2688,12 +1897,12 @@ redef class ATypePropdef
        n_type.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_doc == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PDoc
+               assert new_child isa ADoc
                 _n_doc = new_child
            else
                _n_doc = null
@@ -2713,7 +1922,7 @@ redef class ATypePropdef
         if _n_visibility == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PVisibility
+               assert new_child isa AVisibility
                 _n_visibility = new_child
            else
                abort
@@ -2743,7 +1952,7 @@ redef class ATypePropdef
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                abort
@@ -2755,50 +1964,23 @@ redef class ATypePropdef
     redef fun visit_all(v: Visitor)
     do
         if _n_doc != null then
-            v.visit(_n_doc.as(not null))
-        end
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_visibility)
-        v.visit(_n_kwtype)
-        v.visit(_n_id)
-        v.visit(_n_type)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_doc != null then
-            v.visit(_n_doc.as(not null))
+            v.enter_visit(_n_doc.as(not null))
         end
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_visibility)
-        v.visit(_n_kwtype)
-        v.visit(_n_id)
-        v.visit(_n_type)
+        v.enter_visit(_n_visibility)
+        v.enter_visit(_n_kwtype)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_type)
     end
 end
 redef class AReadAble
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwreadable=(n)
-    do
-        _n_kwreadable = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_areadable (
-            n_kwredef: nullable TKwredef ,
-            n_kwreadable: nullable TKwreadable 
+            n_kwredef: nullable TKwredef,
+            n_kwreadable: nullable TKwreadable
     )
     do
         empty_init
@@ -2810,7 +1992,7 @@ redef class AReadAble
        n_kwreadable.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwredef == old_child then
             if new_child != null then
@@ -2837,38 +2019,18 @@ redef class AReadAble
     redef fun visit_all(v: Visitor)
     do
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
-        end
-        v.visit(_n_kwreadable)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_kwreadable)
+        v.enter_visit(_n_kwreadable)
     end
 end
 redef class AWriteAble
-    redef fun n_kwredef=(n)
-    do
-        _n_kwredef = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwwritable=(n)
-    do
-        _n_kwwritable = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_awriteable (
-            n_kwredef: nullable TKwredef ,
-            n_kwwritable: nullable TKwwritable 
+            n_kwredef: nullable TKwredef,
+            n_visibility: nullable AVisibility,
+            n_kwwritable: nullable TKwwritable
     )
     do
         empty_init
@@ -2876,11 +2038,15 @@ redef class AWriteAble
        if n_kwredef != null then
                n_kwredef.parent = self
        end
+        _n_visibility = n_visibility
+       if n_visibility != null then
+               n_visibility.parent = self
+       end
         _n_kwwritable = n_kwwritable.as(not null)
        n_kwwritable.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwredef == old_child then
             if new_child != null then
@@ -2892,6 +2058,16 @@ redef class AWriteAble
             end
             return
        end
+        if _n_visibility == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AVisibility
+                _n_visibility = new_child
+           else
+               _n_visibility = null
+            end
+            return
+       end
         if _n_kwwritable == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -2907,30 +2083,19 @@ redef class AWriteAble
     redef fun visit_all(v: Visitor)
     do
         if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+            v.enter_visit(_n_kwredef.as(not null))
         end
-        v.visit(_n_kwwritable)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_kwredef != null then
-            v.visit(_n_kwredef.as(not null))
+        if _n_visibility != null then
+            v.enter_visit(_n_visibility.as(not null))
         end
-        v.visit(_n_kwwritable)
+        v.enter_visit(_n_kwwritable)
     end
 end
 redef class AIdMethid
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aidmethid (
-            n_id: nullable TId 
+            n_id: nullable TId
     )
     do
         empty_init
@@ -2938,7 +2103,7 @@ redef class AIdMethid
        n_id.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -2954,25 +2119,14 @@ redef class AIdMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
     end
 end
 redef class APlusMethid
-    redef fun n_plus=(n)
-    do
-        _n_plus = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aplusmethid (
-            n_plus: nullable TPlus 
+            n_plus: nullable TPlus
     )
     do
         empty_init
@@ -2980,7 +2134,7 @@ redef class APlusMethid
        n_plus.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_plus == old_child then
             if new_child != null then
@@ -2996,25 +2150,14 @@ redef class APlusMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_plus)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_plus)
+        v.enter_visit(_n_plus)
     end
 end
 redef class AMinusMethid
-    redef fun n_minus=(n)
-    do
-        _n_minus = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aminusmethid (
-            n_minus: nullable TMinus 
+            n_minus: nullable TMinus
     )
     do
         empty_init
@@ -3022,7 +2165,7 @@ redef class AMinusMethid
        n_minus.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_minus == old_child then
             if new_child != null then
@@ -3038,25 +2181,14 @@ redef class AMinusMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_minus)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_minus)
+        v.enter_visit(_n_minus)
     end
 end
 redef class AStarMethid
-    redef fun n_star=(n)
-    do
-        _n_star = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astarmethid (
-            n_star: nullable TStar 
+            n_star: nullable TStar
     )
     do
         empty_init
@@ -3064,7 +2196,7 @@ redef class AStarMethid
        n_star.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_star == old_child then
             if new_child != null then
@@ -3080,25 +2212,14 @@ redef class AStarMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_star)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_star)
+        v.enter_visit(_n_star)
     end
 end
 redef class ASlashMethid
-    redef fun n_slash=(n)
-    do
-        _n_slash = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aslashmethid (
-            n_slash: nullable TSlash 
+            n_slash: nullable TSlash
     )
     do
         empty_init
@@ -3106,7 +2227,7 @@ redef class ASlashMethid
        n_slash.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_slash == old_child then
             if new_child != null then
@@ -3122,25 +2243,14 @@ redef class ASlashMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_slash)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_slash)
+        v.enter_visit(_n_slash)
     end
 end
 redef class APercentMethid
-    redef fun n_percent=(n)
-    do
-        _n_percent = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_apercentmethid (
-            n_percent: nullable TPercent 
+            n_percent: nullable TPercent
     )
     do
         empty_init
@@ -3148,7 +2258,7 @@ redef class APercentMethid
        n_percent.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_percent == old_child then
             if new_child != null then
@@ -3164,25 +2274,14 @@ redef class APercentMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_percent)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_percent)
+        v.enter_visit(_n_percent)
     end
 end
 redef class AEqMethid
-    redef fun n_eq=(n)
-    do
-        _n_eq = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aeqmethid (
-            n_eq: nullable TEq 
+            n_eq: nullable TEq
     )
     do
         empty_init
@@ -3190,7 +2289,7 @@ redef class AEqMethid
        n_eq.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_eq == old_child then
             if new_child != null then
@@ -3206,25 +2305,14 @@ redef class AEqMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_eq)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_eq)
+        v.enter_visit(_n_eq)
     end
 end
 redef class ANeMethid
-    redef fun n_ne=(n)
-    do
-        _n_ne = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_anemethid (
-            n_ne: nullable TNe 
+            n_ne: nullable TNe
     )
     do
         empty_init
@@ -3232,7 +2320,7 @@ redef class ANeMethid
        n_ne.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_ne == old_child then
             if new_child != null then
@@ -3248,25 +2336,14 @@ redef class ANeMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_ne)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_ne)
+        v.enter_visit(_n_ne)
     end
 end
 redef class ALeMethid
-    redef fun n_le=(n)
-    do
-        _n_le = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_alemethid (
-            n_le: nullable TLe 
+            n_le: nullable TLe
     )
     do
         empty_init
@@ -3274,7 +2351,7 @@ redef class ALeMethid
        n_le.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_le == old_child then
             if new_child != null then
@@ -3290,25 +2367,14 @@ redef class ALeMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_le)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_le)
+        v.enter_visit(_n_le)
     end
 end
 redef class AGeMethid
-    redef fun n_ge=(n)
-    do
-        _n_ge = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_agemethid (
-            n_ge: nullable TGe 
+            n_ge: nullable TGe
     )
     do
         empty_init
@@ -3316,7 +2382,7 @@ redef class AGeMethid
        n_ge.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_ge == old_child then
             if new_child != null then
@@ -3332,25 +2398,14 @@ redef class AGeMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_ge)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_ge)
+        v.enter_visit(_n_ge)
     end
 end
 redef class ALtMethid
-    redef fun n_lt=(n)
-    do
-        _n_lt = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_altmethid (
-            n_lt: nullable TLt 
+            n_lt: nullable TLt
     )
     do
         empty_init
@@ -3358,7 +2413,7 @@ redef class ALtMethid
        n_lt.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_lt == old_child then
             if new_child != null then
@@ -3374,25 +2429,14 @@ redef class ALtMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_lt)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_lt)
+        v.enter_visit(_n_lt)
     end
 end
 redef class AGtMethid
-    redef fun n_gt=(n)
-    do
-        _n_gt = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_agtmethid (
-            n_gt: nullable TGt 
+            n_gt: nullable TGt
     )
     do
         empty_init
@@ -3400,7 +2444,7 @@ redef class AGtMethid
        n_gt.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_gt == old_child then
             if new_child != null then
@@ -3416,31 +2460,77 @@ redef class AGtMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_gt)
+        v.enter_visit(_n_gt)
+    end
+end
+redef class ALlMethid
+    private init empty_init do end
+
+    init init_allmethid (
+            n_ll: nullable TLl
+    )
+    do
+        empty_init
+        _n_ll = n_ll.as(not null)
+       n_ll.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_ll == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TLl
+                _n_ll = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
-    redef fun visit_all_reverse(v: Visitor)
+    redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_gt)
+        v.enter_visit(_n_ll)
     end
 end
-redef class ABraMethid
-    redef fun n_obra=(n)
+redef class AGgMethid
+    private init empty_init do end
+
+    init init_aggmethid (
+            n_gg: nullable TGg
+    )
     do
-        _n_obra = n
-       n.parent = self
+        empty_init
+        _n_gg = n_gg.as(not null)
+       n_gg.parent = self
     end
-    redef fun n_cbra=(n)
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_cbra = n
-       n.parent = self
+        if _n_gg == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TGg
+                _n_gg = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_gg)
+    end
+end
+redef class ABraMethid
     private init empty_init do end
 
     init init_abramethid (
-            n_obra: nullable TObra ,
-            n_cbra: nullable TCbra 
+            n_obra: nullable TObra,
+            n_cbra: nullable TCbra
     )
     do
         empty_init
@@ -3450,7 +2540,7 @@ redef class ABraMethid
        n_cbra.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_obra == old_child then
             if new_child != null then
@@ -3476,27 +2566,15 @@ redef class ABraMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_obra)
-        v.visit(_n_cbra)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_obra)
-        v.visit(_n_cbra)
+        v.enter_visit(_n_obra)
+        v.enter_visit(_n_cbra)
     end
 end
 redef class AStarshipMethid
-    redef fun n_starship=(n)
-    do
-        _n_starship = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astarshipmethid (
-            n_starship: nullable TStarship 
+            n_starship: nullable TStarship
     )
     do
         empty_init
@@ -3504,7 +2582,7 @@ redef class AStarshipMethid
        n_starship.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_starship == old_child then
             if new_child != null then
@@ -3520,31 +2598,15 @@ redef class AStarshipMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_starship)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_starship)
+        v.enter_visit(_n_starship)
     end
 end
 redef class AAssignMethid
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aassignmethid (
-            n_id: nullable TId ,
-            n_assign: nullable TAssign 
+            n_id: nullable TId,
+            n_assign: nullable TAssign
     )
     do
         empty_init
@@ -3554,7 +2616,7 @@ redef class AAssignMethid
        n_assign.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -3580,39 +2642,17 @@ redef class AAssignMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-        v.visit(_n_assign)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
-        v.visit(_n_assign)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_assign)
     end
 end
 redef class ABraassignMethid
-    redef fun n_obra=(n)
-    do
-        _n_obra = n
-       n.parent = self
-    end
-    redef fun n_cbra=(n)
-    do
-        _n_cbra = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_abraassignmethid (
-            n_obra: nullable TObra ,
-            n_cbra: nullable TCbra ,
-            n_assign: nullable TAssign 
+            n_obra: nullable TObra,
+            n_cbra: nullable TCbra,
+            n_assign: nullable TAssign
     )
     do
         empty_init
@@ -3624,7 +2664,7 @@ redef class ABraassignMethid
        n_assign.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_obra == old_child then
             if new_child != null then
@@ -3660,38 +2700,23 @@ redef class ABraassignMethid
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_obra)
-        v.visit(_n_cbra)
-        v.visit(_n_assign)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_obra)
-        v.visit(_n_cbra)
-        v.visit(_n_assign)
+        v.enter_visit(_n_obra)
+        v.enter_visit(_n_cbra)
+        v.enter_visit(_n_assign)
     end
 end
 redef class ASignature
-    redef fun n_type=(n)
-    do
-        _n_type = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_asignature (
-            n_params: Collection[Object] , # Should be Collection[PParam]
-            n_type: nullable PType ,
-            n_closure_decls: Collection[Object]  # Should be Collection[PClosureDecl]
+            n_params: Collection[Object], # Should be Collection[AParam]
+            n_type: nullable AType,
+            n_closure_decls: Collection[Object] # Should be Collection[AClosureDecl]
     )
     do
         empty_init
        for n in n_params do
-               assert n isa PParam
+               assert n isa AParam
                _n_params.add(n)
                n.parent = self
        end
@@ -3700,18 +2725,18 @@ redef class ASignature
                n_type.parent = self
        end
        for n in n_closure_decls do
-               assert n isa PClosureDecl
+               assert n isa AClosureDecl
                _n_closure_decls.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_params.length[ do
             if _n_params[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PParam
+                   assert new_child isa AParam
                     _n_params[i] = new_child
                     new_child.parent = self
                 else
@@ -3723,7 +2748,7 @@ redef class ASignature
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                _n_type = null
@@ -3733,7 +2758,7 @@ redef class ASignature
         for i in [0.._n_closure_decls.length[ do
             if _n_closure_decls[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PClosureDecl
+                   assert new_child isa AClosureDecl
                     _n_closure_decls[i] = new_child
                     new_child.parent = self
                 else
@@ -3747,64 +2772,23 @@ redef class ASignature
     redef fun visit_all(v: Visitor)
     do
             for n in _n_params do
-                v.visit(n)
+                v.enter_visit(n)
            end
         if _n_type != null then
-            v.visit(_n_type.as(not null))
+            v.enter_visit(_n_type.as(not null))
         end
             for n in _n_closure_decls do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_params.length
-            while i >= 0 do
-                v.visit(_n_params[i])
-               i = i - 1
-           end
-       end
-        if _n_type != null then
-            v.visit(_n_type.as(not null))
-        end
-       do
-           var i = _n_closure_decls.length
-            while i >= 0 do
-                v.visit(_n_closure_decls[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AParam
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_dotdotdot=(n)
-    do
-        _n_dotdotdot = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aparam (
-            n_id: nullable TId ,
-            n_type: nullable PType ,
-            n_dotdotdot: nullable TDotdotdot 
+            n_id: nullable TId,
+            n_type: nullable AType,
+            n_dotdotdot: nullable TDotdotdot
     )
     do
         empty_init
@@ -3820,7 +2804,7 @@ redef class AParam
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -3835,7 +2819,7 @@ redef class AParam
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                _n_type = null
@@ -3856,74 +2840,33 @@ redef class AParam
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-        if _n_type != null then
-            v.visit(_n_type.as(not null))
-        end
-        if _n_dotdotdot != null then
-            v.visit(_n_dotdotdot.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
         if _n_type != null then
-            v.visit(_n_type.as(not null))
+            v.enter_visit(_n_type.as(not null))
         end
         if _n_dotdotdot != null then
-            v.visit(_n_dotdotdot.as(not null))
+            v.enter_visit(_n_dotdotdot.as(not null))
         end
     end
 end
 redef class AClosureDecl
-    redef fun n_kwwith=(n)
-    do
-        _n_kwwith = n
-       n.parent = self
-    end
-    redef fun n_kwbreak=(n)
-    do
-        _n_kwbreak = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_signature=(n)
-    do
-        _n_signature = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aclosuredecl (
-            n_kwwith: nullable TKwwith ,
-            n_kwbreak: nullable TKwbreak ,
-            n_id: nullable TId ,
-            n_signature: nullable PSignature ,
-            n_expr: nullable PExpr 
+            n_kwbreak: nullable TKwbreak,
+            n_bang: nullable TBang,
+            n_id: nullable TId,
+            n_signature: nullable ASignature,
+            n_expr: nullable AExpr
     )
     do
         empty_init
-        _n_kwwith = n_kwwith.as(not null)
-       n_kwwith.parent = self
         _n_kwbreak = n_kwbreak
        if n_kwbreak != null then
                n_kwbreak.parent = self
        end
+        _n_bang = n_bang.as(not null)
+       n_bang.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
         _n_signature = n_signature.as(not null)
@@ -3934,25 +2877,25 @@ redef class AClosureDecl
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwwith == old_child then
+        if _n_kwbreak == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwwith
-                _n_kwwith = new_child
+               assert new_child isa TKwbreak
+                _n_kwbreak = new_child
            else
-               abort
+               _n_kwbreak = null
             end
             return
        end
-        if _n_kwbreak == old_child then
+        if _n_bang == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwbreak
-                _n_kwbreak = new_child
+               assert new_child isa TBang
+                _n_bang = new_child
            else
-               _n_kwbreak = null
+               abort
             end
             return
        end
@@ -3969,7 +2912,7 @@ redef class AClosureDecl
         if _n_signature == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PSignature
+               assert new_child isa ASignature
                 _n_signature = new_child
            else
                abort
@@ -3979,7 +2922,7 @@ redef class AClosureDecl
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -3990,50 +2933,24 @@ redef class AClosureDecl
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwwith)
-        if _n_kwbreak != null then
-            v.visit(_n_kwbreak.as(not null))
-        end
-        v.visit(_n_id)
-        v.visit(_n_signature)
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwwith)
         if _n_kwbreak != null then
-            v.visit(_n_kwbreak.as(not null))
+            v.enter_visit(_n_kwbreak.as(not null))
         end
-        v.visit(_n_id)
-        v.visit(_n_signature)
+        v.enter_visit(_n_bang)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_signature)
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
 end
 redef class AType
-    redef fun n_kwnullable=(n)
-    do
-        _n_kwnullable = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_atype (
-            n_kwnullable: nullable TKwnullable ,
-            n_id: nullable TClassid ,
-            n_types: Collection[Object]  # Should be Collection[PType]
+            n_kwnullable: nullable TKwnullable,
+            n_id: nullable TClassid,
+            n_types: Collection[Object] # Should be Collection[AType]
     )
     do
         empty_init
@@ -4044,13 +2961,13 @@ redef class AType
         _n_id = n_id.as(not null)
        n_id.parent = self
        for n in n_types do
-               assert n isa PType
+               assert n isa AType
                _n_types.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwnullable == old_child then
             if new_child != null then
@@ -4075,7 +2992,7 @@ redef class AType
         for i in [0.._n_types.length[ do
             if _n_types[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PType
+                   assert new_child isa AType
                     _n_types[i] = new_child
                     new_child.parent = self
                 else
@@ -4089,51 +3006,80 @@ redef class AType
     redef fun visit_all(v: Visitor)
     do
         if _n_kwnullable != null then
-            v.visit(_n_kwnullable.as(not null))
+            v.enter_visit(_n_kwnullable.as(not null))
         end
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
             for n in _n_types do
-                v.visit(n)
+                v.enter_visit(n)
            end
     end
+end
+redef class ALabel
+    private init empty_init do end
 
-    redef fun visit_all_reverse(v: Visitor)
+    init init_alabel (
+            n_kwlabel: nullable TKwlabel,
+            n_id: nullable TId
+    )
     do
-        if _n_kwnullable != null then
-            v.visit(_n_kwnullable.as(not null))
-        end
-        v.visit(_n_id)
-       do
-           var i = _n_types.length
-            while i >= 0 do
-                v.visit(_n_types[i])
-               i = i - 1
-           end
+        empty_init
+        _n_kwlabel = n_kwlabel.as(not null)
+       n_kwlabel.parent = self
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwlabel == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwlabel
+                _n_kwlabel = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
        end
     end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwlabel)
+        v.enter_visit(_n_id)
+    end
 end
 redef class ABlockExpr
-
     private init empty_init do end
 
     init init_ablockexpr (
-            n_expr: Collection[Object]  # Should be Collection[PExpr]
+            n_expr: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
        for n in n_expr do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_expr.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_expr.length[ do
             if _n_expr[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_expr[i] = new_child
                     new_child.parent = self
                 else
@@ -4147,62 +3093,19 @@ redef class ABlockExpr
     redef fun visit_all(v: Visitor)
     do
             for n in _n_expr do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_expr.length
-            while i >= 0 do
-                v.visit(_n_expr[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AVardeclExpr
-    redef fun n_kwvar=(n)
-    do
-        _n_kwvar = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_avardeclexpr (
-            n_kwvar: nullable TKwvar ,
-            n_id: nullable TId ,
-            n_type: nullable PType ,
-            n_assign: nullable TAssign ,
-            n_expr: nullable PExpr 
+            n_kwvar: nullable TKwvar,
+            n_id: nullable TId,
+            n_type: nullable AType,
+            n_assign: nullable TAssign,
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -4224,7 +3127,7 @@ redef class AVardeclExpr
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwvar == old_child then
             if new_child != null then
@@ -4249,7 +3152,7 @@ redef class AVardeclExpr
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                _n_type = null
@@ -4269,7 +3172,7 @@ redef class AVardeclExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -4280,65 +3183,39 @@ redef class AVardeclExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwvar)
-        v.visit(_n_id)
-        if _n_type != null then
-            v.visit(_n_type.as(not null))
-        end
-        if _n_assign != null then
-            v.visit(_n_assign.as(not null))
-        end
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwvar)
-        v.visit(_n_id)
+        v.enter_visit(_n_kwvar)
+        v.enter_visit(_n_id)
         if _n_type != null then
-            v.visit(_n_type.as(not null))
+            v.enter_visit(_n_type.as(not null))
         end
         if _n_assign != null then
-            v.visit(_n_assign.as(not null))
+            v.enter_visit(_n_assign.as(not null))
         end
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
 end
 redef class AReturnExpr
-    redef fun n_kwreturn=(n)
-    do
-        _n_kwreturn = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_areturnexpr (
-            n_kwreturn: nullable TKwreturn ,
-            n_expr: nullable PExpr 
+            n_kwreturn: nullable TKwreturn,
+            n_expr: nullable AExpr
     )
     do
         empty_init
-        _n_kwreturn = n_kwreturn.as(not null)
-       n_kwreturn.parent = self
+        _n_kwreturn = n_kwreturn
+       if n_kwreturn != null then
+               n_kwreturn.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwreturn == old_child then
             if new_child != null then
@@ -4346,14 +3223,14 @@ redef class AReturnExpr
                assert new_child isa TKwreturn
                 _n_kwreturn = new_child
            else
-               abort
+               _n_kwreturn = null
             end
             return
        end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -4364,51 +3241,37 @@ redef class AReturnExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwreturn)
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+        if _n_kwreturn != null then
+            v.enter_visit(_n_kwreturn.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwreturn)
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
 end
 redef class ABreakExpr
-    redef fun n_kwbreak=(n)
-    do
-        _n_kwbreak = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
-    private init empty_init do end
-
-    init init_abreakexpr (
-            n_kwbreak: nullable TKwbreak ,
-            n_expr: nullable PExpr 
-    )
+    private init empty_init do end
+
+    init init_abreakexpr (
+            n_kwbreak: nullable TKwbreak,
+            n_label: nullable ALabel,
+            n_expr: nullable AExpr
+    )
     do
         empty_init
         _n_kwbreak = n_kwbreak.as(not null)
        n_kwbreak.parent = self
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwbreak == old_child then
             if new_child != null then
@@ -4420,10 +3283,20 @@ redef class ABreakExpr
             end
             return
        end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -4434,31 +3307,20 @@ redef class ABreakExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwbreak)
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+        v.enter_visit(_n_kwbreak)
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwbreak)
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
 end
 redef class AAbortExpr
-    redef fun n_kwabort=(n)
-    do
-        _n_kwabort = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aabortexpr (
-            n_kwabort: nullable TKwabort 
+            n_kwabort: nullable TKwabort
     )
     do
         empty_init
@@ -4466,7 +3328,7 @@ redef class AAbortExpr
        n_kwabort.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwabort == old_child then
             if new_child != null then
@@ -4482,45 +3344,34 @@ redef class AAbortExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwabort)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwabort)
+        v.enter_visit(_n_kwabort)
     end
 end
 redef class AContinueExpr
-    redef fun n_kwcontinue=(n)
-    do
-        _n_kwcontinue = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_acontinueexpr (
-            n_kwcontinue: nullable TKwcontinue ,
-            n_expr: nullable PExpr 
+            n_kwcontinue: nullable TKwcontinue,
+            n_label: nullable ALabel,
+            n_expr: nullable AExpr
     )
     do
         empty_init
-        _n_kwcontinue = n_kwcontinue.as(not null)
-       n_kwcontinue.parent = self
+        _n_kwcontinue = n_kwcontinue
+       if n_kwcontinue != null then
+               n_kwcontinue.parent = self
+       end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwcontinue == old_child then
             if new_child != null then
@@ -4528,14 +3379,24 @@ redef class AContinueExpr
                assert new_child isa TKwcontinue
                 _n_kwcontinue = new_child
            else
-               abort
+               _n_kwcontinue = null
+            end
+            return
+       end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
             end
             return
        end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
@@ -4546,39 +3407,24 @@ redef class AContinueExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwcontinue)
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+        if _n_kwcontinue != null then
+            v.enter_visit(_n_kwcontinue.as(not null))
+        end
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwcontinue)
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
         end
     end
 end
 redef class ADoExpr
-    redef fun n_kwdo=(n)
-    do
-        _n_kwdo = n
-       n.parent = self
-    end
-    redef fun n_block=(n)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_adoexpr (
-            n_kwdo: nullable TKwdo ,
-            n_block: nullable PExpr 
+            n_kwdo: nullable TKwdo,
+            n_block: nullable AExpr,
+            n_label: nullable ALabel
     )
     do
         empty_init
@@ -4588,9 +3434,13 @@ redef class ADoExpr
        if n_block != null then
                n_block.parent = self
        end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwdo == old_child then
             if new_child != null then
@@ -4605,64 +3455,44 @@ redef class ADoExpr
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
             end
             return
        end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwdo)
+        v.enter_visit(_n_kwdo)
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwdo)
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
     end
 end
 redef class AIfExpr
-    redef fun n_kwif=(n)
-    do
-        _n_kwif = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_then=(n)
-    do
-        _n_then = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_else=(n)
-    do
-        _n_else = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aifexpr (
-            n_kwif: nullable TKwif ,
-            n_expr: nullable PExpr ,
-            n_then: nullable PExpr ,
-            n_else: nullable PExpr 
+            n_kwif: nullable TKwif,
+            n_expr: nullable AExpr,
+            n_then: nullable AExpr,
+            n_else: nullable AExpr
     )
     do
         empty_init
@@ -4680,7 +3510,7 @@ redef class AIfExpr
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwif == old_child then
             if new_child != null then
@@ -4695,7 +3525,7 @@ redef class AIfExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -4705,7 +3535,7 @@ redef class AIfExpr
         if _n_then == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_then = new_child
            else
                _n_then = null
@@ -4715,7 +3545,7 @@ redef class AIfExpr
         if _n_else == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_else = new_child
            else
                _n_else = null
@@ -4726,69 +3556,26 @@ redef class AIfExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwif)
-        v.visit(_n_expr)
-        if _n_then != null then
-            v.visit(_n_then.as(not null))
-        end
-        if _n_else != null then
-            v.visit(_n_else.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwif)
-        v.visit(_n_expr)
+        v.enter_visit(_n_kwif)
+        v.enter_visit(_n_expr)
         if _n_then != null then
-            v.visit(_n_then.as(not null))
+            v.enter_visit(_n_then.as(not null))
         end
         if _n_else != null then
-            v.visit(_n_else.as(not null))
+            v.enter_visit(_n_else.as(not null))
         end
     end
 end
 redef class AIfexprExpr
-    redef fun n_kwif=(n)
-    do
-        _n_kwif = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_kwthen=(n)
-    do
-        _n_kwthen = n
-       n.parent = self
-    end
-    redef fun n_then=(n)
-    do
-        _n_then = n
-       n.parent = self
-    end
-    redef fun n_kwelse=(n)
-    do
-        _n_kwelse = n
-       n.parent = self
-    end
-    redef fun n_else=(n)
-    do
-        _n_else = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aifexprexpr (
-            n_kwif: nullable TKwif ,
-            n_expr: nullable PExpr ,
-            n_kwthen: nullable TKwthen ,
-            n_then: nullable PExpr ,
-            n_kwelse: nullable TKwelse ,
-            n_else: nullable PExpr 
+            n_kwif: nullable TKwif,
+            n_expr: nullable AExpr,
+            n_kwthen: nullable TKwthen,
+            n_then: nullable AExpr,
+            n_kwelse: nullable TKwelse,
+            n_else: nullable AExpr
     )
     do
         empty_init
@@ -4806,7 +3593,7 @@ redef class AIfexprExpr
        n_else.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwif == old_child then
             if new_child != null then
@@ -4821,7 +3608,7 @@ redef class AIfexprExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -4841,7 +3628,7 @@ redef class AIfexprExpr
         if _n_then == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_then = new_child
            else
                abort
@@ -4861,7 +3648,7 @@ redef class AIfexprExpr
         if _n_else == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_else = new_child
            else
                abort
@@ -4872,55 +3659,23 @@ redef class AIfexprExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwif)
-        v.visit(_n_expr)
-        v.visit(_n_kwthen)
-        v.visit(_n_then)
-        v.visit(_n_kwelse)
-        v.visit(_n_else)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwif)
-        v.visit(_n_expr)
-        v.visit(_n_kwthen)
-        v.visit(_n_then)
-        v.visit(_n_kwelse)
-        v.visit(_n_else)
+        v.enter_visit(_n_kwif)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwthen)
+        v.enter_visit(_n_then)
+        v.enter_visit(_n_kwelse)
+        v.enter_visit(_n_else)
     end
 end
 redef class AWhileExpr
-    redef fun n_kwwhile=(n)
-    do
-        _n_kwwhile = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_kwdo=(n)
-    do
-        _n_kwdo = n
-       n.parent = self
-    end
-    redef fun n_block=(n)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_awhileexpr (
-            n_kwwhile: nullable TKwwhile ,
-            n_expr: nullable PExpr ,
-            n_kwdo: nullable TKwdo ,
-            n_block: nullable PExpr 
+            n_kwwhile: nullable TKwwhile,
+            n_expr: nullable AExpr,
+            n_kwdo: nullable TKwdo,
+            n_block: nullable AExpr,
+            n_label: nullable ALabel
     )
     do
         empty_init
@@ -4934,9 +3689,13 @@ redef class AWhileExpr
        if n_block != null then
                n_block.parent = self
        end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwwhile == old_child then
             if new_child != null then
@@ -4951,7 +3710,7 @@ redef class AWhileExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -4971,79 +3730,125 @@ redef class AWhileExpr
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
             end
             return
        end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwwhile)
-        v.visit(_n_expr)
-        v.visit(_n_kwdo)
+        v.enter_visit(_n_kwwhile)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwdo)
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwwhile)
-        v.visit(_n_expr)
-        v.visit(_n_kwdo)
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
     end
 end
-redef class AForExpr
-    redef fun n_kwfor=(n)
-    do
-        _n_kwfor = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
+redef class ALoopExpr
+    private init empty_init do end
+
+    init init_aloopexpr (
+            n_kwloop: nullable TKwloop,
+            n_block: nullable AExpr,
+            n_label: nullable ALabel
+    )
     do
-        _n_expr = n
-       n.parent = self
+        empty_init
+        _n_kwloop = n_kwloop.as(not null)
+       n_kwloop.parent = self
+        _n_block = n_block
+       if n_block != null then
+               n_block.parent = self
+       end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
     end
-    redef fun n_kwdo=(n)
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_kwdo = n
-       n.parent = self
+        if _n_kwloop == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwloop
+                _n_kwloop = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_block = new_child
+           else
+               _n_block = null
+            end
+            return
+       end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
     end
-    redef fun n_block=(n)
+
+    redef fun visit_all(v: Visitor)
     do
-        _n_block = n
-        if n != null then
-           n.parent = self
+        v.enter_visit(_n_kwloop)
+        if _n_block != null then
+            v.enter_visit(_n_block.as(not null))
+        end
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
     end
-
+end
+redef class AForExpr
     private init empty_init do end
 
     init init_aforexpr (
-            n_kwfor: nullable TKwfor ,
-            n_id: nullable TId ,
-            n_expr: nullable PExpr ,
-            n_kwdo: nullable TKwdo ,
-            n_block: nullable PExpr 
+            n_kwfor: nullable TKwfor,
+            n_ids: Collection[Object], # Should be Collection[TId]
+            n_expr: nullable AExpr,
+            n_kwdo: nullable TKwdo,
+            n_block: nullable AExpr,
+            n_label: nullable ALabel
     )
     do
         empty_init
         _n_kwfor = n_kwfor.as(not null)
        n_kwfor.parent = self
-        _n_id = n_id.as(not null)
-       n_id.parent = self
+       for n in n_ids do
+               assert n isa TId
+               _n_ids.add(n)
+               n.parent = self
+       end
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
         _n_kwdo = n_kwdo.as(not null)
@@ -5052,9 +3857,13 @@ redef class AForExpr
        if n_block != null then
                n_block.parent = self
        end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwfor == old_child then
             if new_child != null then
@@ -5066,20 +3875,22 @@ redef class AForExpr
             end
             return
        end
-        if _n_id == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TId
-                _n_id = new_child
-           else
-               abort
+        for i in [0.._n_ids.length[ do
+            if _n_ids[i] == old_child then
+                if new_child != null then
+                   assert new_child isa TId
+                    _n_ids[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_ids.remove_at(i)
+                end
+                return
             end
-            return
-       end
+        end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5099,62 +3910,49 @@ redef class AForExpr
         if _n_block == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_block = new_child
            else
                _n_block = null
             end
             return
        end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwfor)
-        v.visit(_n_id)
-        v.visit(_n_expr)
-        v.visit(_n_kwdo)
+        v.enter_visit(_n_kwfor)
+            for n in _n_ids do
+                v.enter_visit(n)
+           end
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwdo)
         if _n_block != null then
-            v.visit(_n_block.as(not null))
+            v.enter_visit(_n_block.as(not null))
         end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwfor)
-        v.visit(_n_id)
-        v.visit(_n_expr)
-        v.visit(_n_kwdo)
-        if _n_block != null then
-            v.visit(_n_block.as(not null))
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
     end
 end
 redef class AAssertExpr
-    redef fun n_kwassert=(n)
-    do
-        _n_kwassert = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aassertexpr (
-            n_kwassert: nullable TKwassert ,
-            n_id: nullable TId ,
-            n_expr: nullable PExpr 
+            n_kwassert: nullable TKwassert,
+            n_id: nullable TId,
+            n_expr: nullable AExpr,
+            n_else: nullable AExpr
     )
     do
         empty_init
@@ -5166,9 +3964,13 @@ redef class AAssertExpr
        end
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
+        _n_else = n_else
+       if n_else != null then
+               n_else.parent = self
+       end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwassert == old_child then
             if new_child != null then
@@ -5193,50 +3995,43 @@ redef class AAssertExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
             end
             return
        end
+        if _n_else == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_else = new_child
+           else
+               _n_else = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwassert)
+        v.enter_visit(_n_kwassert)
         if _n_id != null then
-            v.visit(_n_id.as(not null))
+            v.enter_visit(_n_id.as(not null))
         end
-        v.visit(_n_expr)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwassert)
-        if _n_id != null then
-            v.visit(_n_id.as(not null))
+        v.enter_visit(_n_expr)
+        if _n_else != null then
+            v.enter_visit(_n_else.as(not null))
         end
-        v.visit(_n_expr)
     end
 end
 redef class AOnceExpr
-    redef fun n_kwonce=(n)
-    do
-        _n_kwonce = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aonceexpr (
-            n_kwonce: nullable TKwonce ,
-            n_expr: nullable PExpr 
+            n_kwonce: nullable TKwonce,
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -5246,7 +4041,7 @@ redef class AOnceExpr
        n_expr.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwonce == old_child then
             if new_child != null then
@@ -5261,7 +4056,7 @@ redef class AOnceExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5272,27 +4067,15 @@ redef class AOnceExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwonce)
-        v.visit(_n_expr)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwonce)
-        v.visit(_n_expr)
+        v.enter_visit(_n_kwonce)
+        v.enter_visit(_n_expr)
     end
 end
 redef class ASendExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_asendexpr (
-            n_expr: nullable PExpr 
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -5300,12 +4083,12 @@ redef class ASendExpr
        n_expr.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5316,31 +4099,15 @@ redef class ASendExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
+        v.enter_visit(_n_expr)
     end
 end
 redef class ABinopExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_abinopexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5350,12 +4117,12 @@ redef class ABinopExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5365,7 +4132,7 @@ redef class ABinopExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5376,33 +4143,16 @@ redef class ABinopExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AOrExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aorexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5412,12 +4162,12 @@ redef class AOrExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5427,7 +4177,7 @@ redef class AOrExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5438,33 +4188,16 @@ redef class AOrExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AAndExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aandexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5474,12 +4207,12 @@ redef class AAndExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5489,7 +4222,7 @@ redef class AAndExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5500,33 +4233,61 @@ redef class AAndExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
+end
+redef class AOrElseExpr
+    private init empty_init do end
 
-    redef fun visit_all_reverse(v: Visitor)
+    init init_aorelseexpr (
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
+    )
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        empty_init
+        _n_expr = n_expr.as(not null)
+       n_expr.parent = self
+        _n_expr2 = n_expr2.as(not null)
+       n_expr2.parent = self
     end
-end
-redef class ANotExpr
-    redef fun n_kwnot=(n)
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_kwnot = n
-       n.parent = self
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_expr2 == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr2 = new_child
+           else
+               abort
+            end
+            return
+       end
     end
-    redef fun n_expr=(n)
+
+    redef fun visit_all(v: Visitor)
     do
-        _n_expr = n
-       n.parent = self
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
-
+end
+redef class ANotExpr
     private init empty_init do end
 
     init init_anotexpr (
-            n_kwnot: nullable TKwnot ,
-            n_expr: nullable PExpr 
+            n_kwnot: nullable TKwnot,
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -5536,7 +4297,7 @@ redef class ANotExpr
        n_expr.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwnot == old_child then
             if new_child != null then
@@ -5551,7 +4312,7 @@ redef class ANotExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5562,33 +4323,16 @@ redef class ANotExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwnot)
-        v.visit(_n_expr)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwnot)
-        v.visit(_n_expr)
+        v.enter_visit(_n_kwnot)
+        v.enter_visit(_n_expr)
     end
 end
 redef class AEqExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aeqexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5598,12 +4342,12 @@ redef class AEqExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5613,7 +4357,7 @@ redef class AEqExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5624,33 +4368,16 @@ redef class AEqExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AEeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aeeexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5660,12 +4387,12 @@ redef class AEeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5675,7 +4402,7 @@ redef class AEeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5686,33 +4413,16 @@ redef class AEeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class ANeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aneexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5722,12 +4432,12 @@ redef class ANeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5737,7 +4447,7 @@ redef class ANeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5748,33 +4458,16 @@ redef class ANeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class ALtExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_altexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5784,12 +4477,12 @@ redef class ALtExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5799,7 +4492,7 @@ redef class ALtExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5810,33 +4503,16 @@ redef class ALtExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class ALeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aleexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5846,12 +4522,12 @@ redef class ALeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5861,7 +4537,7 @@ redef class ALeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5872,33 +4548,61 @@ redef class ALeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
+end
+redef class ALlExpr
+    private init empty_init do end
 
-    redef fun visit_all_reverse(v: Visitor)
+    init init_allexpr (
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
+    )
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        empty_init
+        _n_expr = n_expr.as(not null)
+       n_expr.parent = self
+        _n_expr2 = n_expr2.as(not null)
+       n_expr2.parent = self
     end
-end
-redef class AGtExpr
-    redef fun n_expr=(n)
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_expr = n
-       n.parent = self
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_expr2 == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr2 = new_child
+           else
+               abort
+            end
+            return
+       end
     end
-    redef fun n_expr2=(n)
+
+    redef fun visit_all(v: Visitor)
     do
-        _n_expr2 = n
-       n.parent = self
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
-
+end
+redef class AGtExpr
     private init empty_init do end
 
     init init_agtexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5908,12 +4612,12 @@ redef class AGtExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5923,7 +4627,7 @@ redef class AGtExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5934,33 +4638,16 @@ redef class AGtExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AGeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_ageexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -5970,12 +4657,12 @@ redef class AGeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -5985,7 +4672,7 @@ redef class AGeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -5996,33 +4683,61 @@ redef class AGeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
+end
+redef class AGgExpr
+    private init empty_init do end
 
-    redef fun visit_all_reverse(v: Visitor)
+    init init_aggexpr (
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
+    )
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        empty_init
+        _n_expr = n_expr.as(not null)
+       n_expr.parent = self
+        _n_expr2 = n_expr2.as(not null)
+       n_expr2.parent = self
     end
-end
-redef class AIsaExpr
-    redef fun n_expr=(n)
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_expr = n
-       n.parent = self
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_expr2 == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExpr
+                _n_expr2 = new_child
+           else
+               abort
+            end
+            return
+       end
     end
-    redef fun n_type=(n)
+
+    redef fun visit_all(v: Visitor)
     do
-        _n_type = n
-       n.parent = self
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
-
+end
+redef class AIsaExpr
     private init empty_init do end
 
     init init_aisaexpr (
-            n_expr: nullable PExpr ,
-            n_type: nullable PType 
+            n_expr: nullable AExpr,
+            n_type: nullable AType
     )
     do
         empty_init
@@ -6032,12 +4747,12 @@ redef class AIsaExpr
        n_type.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6047,7 +4762,7 @@ redef class AIsaExpr
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                abort
@@ -6058,33 +4773,16 @@ redef class AIsaExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_type)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_type)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_type)
     end
 end
 redef class APlusExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aplusexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6094,12 +4792,12 @@ redef class APlusExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6109,7 +4807,7 @@ redef class APlusExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6120,33 +4818,16 @@ redef class APlusExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AMinusExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aminusexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6156,12 +4837,12 @@ redef class AMinusExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6171,7 +4852,7 @@ redef class AMinusExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6182,33 +4863,16 @@ redef class AMinusExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AStarshipExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astarshipexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6218,12 +4882,12 @@ redef class AStarshipExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6233,7 +4897,7 @@ redef class AStarshipExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6244,33 +4908,16 @@ redef class AStarshipExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AStarExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astarexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6280,12 +4927,12 @@ redef class AStarExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6295,7 +4942,7 @@ redef class AStarExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6306,33 +4953,16 @@ redef class AStarExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class ASlashExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aslashexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6342,12 +4972,12 @@ redef class ASlashExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6357,7 +4987,7 @@ redef class ASlashExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6368,33 +4998,16 @@ redef class ASlashExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class APercentExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_apercentexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -6404,12 +5017,12 @@ redef class APercentExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6419,7 +5032,7 @@ redef class APercentExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -6430,33 +5043,16 @@ redef class APercentExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AUminusExpr
-    redef fun n_minus=(n)
-    do
-        _n_minus = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_auminusexpr (
-            n_minus: nullable TMinus ,
-            n_expr: nullable PExpr 
+            n_minus: nullable TMinus,
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -6466,7 +5062,7 @@ redef class AUminusExpr
        n_expr.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_minus == old_child then
             if new_child != null then
@@ -6481,53 +5077,29 @@ redef class AUminusExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
             end
             return
-       end
-    end
-
-    redef fun visit_all(v: Visitor)
-    do
-        v.visit(_n_minus)
-        v.visit(_n_expr)
+       end
     end
 
-    redef fun visit_all_reverse(v: Visitor)
+    redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_minus)
-        v.visit(_n_expr)
+        v.enter_visit(_n_minus)
+        v.enter_visit(_n_expr)
     end
 end
 redef class ANewExpr
-    redef fun n_kwnew=(n)
-    do
-        _n_kwnew = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_anewexpr (
-            n_kwnew: nullable TKwnew ,
-            n_type: nullable PType ,
-            n_id: nullable TId ,
-            n_args: Collection[Object]  # Should be Collection[PExpr]
+            n_kwnew: nullable TKwnew,
+            n_type: nullable AType,
+            n_id: nullable TId,
+            n_args: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
@@ -6540,13 +5112,13 @@ redef class ANewExpr
                n_id.parent = self
        end
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwnew == old_child then
             if new_child != null then
@@ -6561,7 +5133,7 @@ redef class ANewExpr
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                abort
@@ -6581,7 +5153,7 @@ redef class ANewExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -6594,49 +5166,22 @@ redef class ANewExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwnew)
-        v.visit(_n_type)
+        v.enter_visit(_n_kwnew)
+        v.enter_visit(_n_type)
         if _n_id != null then
-            v.visit(_n_id.as(not null))
+            v.enter_visit(_n_id.as(not null))
         end
             for n in _n_args do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwnew)
-        v.visit(_n_type)
-        if _n_id != null then
-            v.visit(_n_id.as(not null))
-        end
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AAttrExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aattrexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TAttrid 
+            n_expr: nullable AExpr,
+            n_id: nullable TAttrid
     )
     do
         empty_init
@@ -6646,12 +5191,12 @@ redef class AAttrExpr
        n_id.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6672,45 +5217,18 @@ redef class AAttrExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
     end
 end
 redef class AAttrAssignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aattrassignexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TAttrid ,
-            n_assign: nullable TAssign ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_id: nullable TAttrid,
+            n_assign: nullable TAssign,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -6724,12 +5242,12 @@ redef class AAttrAssignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6759,7 +5277,7 @@ redef class AAttrAssignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -6770,49 +5288,20 @@ redef class AAttrAssignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-        v.visit(_n_assign)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-        v.visit(_n_assign)
-        v.visit(_n_value)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_assign)
+        v.enter_visit(_n_value)
     end
 end
 redef class AAttrReassignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign_op=(n)
-    do
-        _n_assign_op = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aattrreassignexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TAttrid ,
-            n_assign_op: nullable PAssignOp ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_id: nullable TAttrid,
+            n_assign_op: nullable AAssignOp,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -6826,12 +5315,12 @@ redef class AAttrReassignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6851,7 +5340,7 @@ redef class AAttrReassignExpr
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAssignOp
+               assert new_child isa AAssignOp
                 _n_assign_op = new_child
            else
                abort
@@ -6861,7 +5350,7 @@ redef class AAttrReassignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -6872,39 +5361,20 @@ redef class AAttrReassignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_assign_op)
+        v.enter_visit(_n_value)
     end
 end
 redef class ACallExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_acallexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TId ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_closure_defs: Collection[Object]  # Should be Collection[PClosureDef]
+            n_expr: nullable AExpr,
+            n_id: nullable TId,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_closure_defs: Collection[Object] # Should be Collection[AClosureDef]
     )
     do
         empty_init
@@ -6913,23 +5383,23 @@ redef class ACallExpr
         _n_id = n_id.as(not null)
        n_id.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
        for n in n_closure_defs do
-               assert n isa PClosureDef
+               assert n isa AClosureDef
                _n_closure_defs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -6949,7 +5419,7 @@ redef class ACallExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -6961,7 +5431,7 @@ redef class ACallExpr
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PClosureDef
+                   assert new_child isa AClosureDef
                     _n_closure_defs[i] = new_child
                     new_child.parent = self
                 else
@@ -6974,66 +5444,25 @@ redef class ACallExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
             for n in _n_args do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_closure_defs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
-       do
-           var i = _n_closure_defs.length
-            while i >= 0 do
-                v.visit(_n_closure_defs[i])
-               i = i - 1
-           end
-       end
     end
 end
 redef class ACallAssignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_acallassignexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TId ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_assign: nullable TAssign ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_id: nullable TId,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_assign: nullable TAssign,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -7042,7 +5471,7 @@ redef class ACallAssignExpr
         _n_id = n_id.as(not null)
        n_id.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
@@ -7052,12 +5481,12 @@ redef class ACallAssignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7077,7 +5506,7 @@ redef class ACallAssignExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7099,7 +5528,7 @@ redef class ACallAssignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -7110,60 +5539,24 @@ redef class ACallAssignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
             for n in _n_args do
-                v.visit(n)
-           end
-        v.visit(_n_assign)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
-        v.visit(_n_assign)
-        v.visit(_n_value)
+        v.enter_visit(_n_assign)
+        v.enter_visit(_n_value)
     end
 end
 redef class ACallReassignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign_op=(n)
-    do
-        _n_assign_op = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_acallreassignexpr (
-            n_expr: nullable PExpr ,
-            n_id: nullable TId ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_assign_op: nullable PAssignOp ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_id: nullable TId,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_assign_op: nullable AAssignOp,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -7172,7 +5565,7 @@ redef class ACallReassignExpr
         _n_id = n_id.as(not null)
        n_id.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
@@ -7182,12 +5575,12 @@ redef class ACallReassignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7207,7 +5600,7 @@ redef class ACallReassignExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7219,7 +5612,7 @@ redef class ACallReassignExpr
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAssignOp
+               assert new_child isa AAssignOp
                 _n_assign_op = new_child
            else
                abort
@@ -7229,7 +5622,7 @@ redef class ACallReassignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -7240,50 +5633,22 @@ redef class ACallReassignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_id)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
             for n in _n_args do
-                v.visit(n)
+                v.enter_visit(n)
            end
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_id)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
-           end
-       end
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
+        v.enter_visit(_n_assign_op)
+        v.enter_visit(_n_value)
     end
 end
 redef class ASuperExpr
-    redef fun n_qualified=(n)
-    do
-        _n_qualified = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef fun n_kwsuper=(n)
-    do
-        _n_kwsuper = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_asuperexpr (
-            n_qualified: nullable PQualified ,
-            n_kwsuper: nullable TKwsuper ,
-            n_args: Collection[Object]  # Should be Collection[PExpr]
+            n_qualified: nullable AQualified,
+            n_kwsuper: nullable TKwsuper,
+            n_args: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
@@ -7294,18 +5659,18 @@ redef class ASuperExpr
         _n_kwsuper = n_kwsuper.as(not null)
        n_kwsuper.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_qualified == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PQualified
+               assert new_child isa AQualified
                 _n_qualified = new_child
            else
                _n_qualified = null
@@ -7325,7 +5690,7 @@ redef class ASuperExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7339,47 +5704,21 @@ redef class ASuperExpr
     redef fun visit_all(v: Visitor)
     do
         if _n_qualified != null then
-            v.visit(_n_qualified.as(not null))
+            v.enter_visit(_n_qualified.as(not null))
         end
-        v.visit(_n_kwsuper)
+        v.enter_visit(_n_kwsuper)
             for n in _n_args do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_qualified != null then
-            v.visit(_n_qualified.as(not null))
-        end
-        v.visit(_n_kwsuper)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AInitExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_kwinit=(n)
-    do
-        _n_kwinit = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_ainitexpr (
-            n_expr: nullable PExpr ,
-            n_kwinit: nullable TKwinit ,
-            n_args: Collection[Object]  # Should be Collection[PExpr]
+            n_expr: nullable AExpr,
+            n_kwinit: nullable TKwinit,
+            n_args: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
@@ -7388,18 +5727,18 @@ redef class AInitExpr
         _n_kwinit = n_kwinit.as(not null)
        n_kwinit.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7419,7 +5758,7 @@ redef class AInitExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7432,62 +5771,43 @@ redef class AInitExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_kwinit)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwinit)
             for n in _n_args do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_kwinit)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class ABraExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_abraexpr (
-            n_expr: nullable PExpr ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_closure_defs: Collection[Object]  # Should be Collection[PClosureDef]
+            n_expr: nullable AExpr,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_closure_defs: Collection[Object] # Should be Collection[AClosureDef]
     )
     do
         empty_init
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
        for n in n_closure_defs do
-               assert n isa PClosureDef
+               assert n isa AClosureDef
                _n_closure_defs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7497,7 +5817,7 @@ redef class ABraExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7509,7 +5829,7 @@ redef class ABraExpr
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PClosureDef
+                   assert new_child isa AClosureDef
                     _n_closure_defs[i] = new_child
                     new_child.parent = self
                 else
@@ -7522,65 +5842,30 @@ redef class ABraExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
+        v.enter_visit(_n_expr)
             for n in _n_args do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_closure_defs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
-           end
-       end
-       do
-           var i = _n_closure_defs.length
-            while i >= 0 do
-                v.visit(_n_closure_defs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class ABraAssignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_abraassignexpr (
-            n_expr: nullable PExpr ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_assign: nullable TAssign ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_assign: nullable TAssign,
+            n_value: nullable AExpr
     )
     do
         empty_init
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
@@ -7590,12 +5875,12 @@ redef class ABraAssignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7605,7 +5890,7 @@ redef class ABraAssignExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7627,7 +5912,7 @@ redef class ABraAssignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -7638,59 +5923,29 @@ redef class ABraAssignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
+        v.enter_visit(_n_expr)
             for n in _n_args do
-                v.visit(n)
-           end
-        v.visit(_n_assign)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
-        v.visit(_n_assign)
-        v.visit(_n_value)
+        v.enter_visit(_n_assign)
+        v.enter_visit(_n_value)
     end
 end
 redef class ABraReassignExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_assign_op=(n)
-    do
-        _n_assign_op = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_abrareassignexpr (
-            n_expr: nullable PExpr ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_assign_op: nullable PAssignOp ,
-            n_value: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_assign_op: nullable AAssignOp,
+            n_value: nullable AExpr
     )
     do
         empty_init
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
@@ -7700,12 +5955,12 @@ redef class ABraReassignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -7715,7 +5970,7 @@ redef class ABraReassignExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7727,7 +5982,7 @@ redef class ABraReassignExpr
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAssignOp
+               assert new_child isa AAssignOp
                 _n_assign_op = new_child
            else
                abort
@@ -7737,7 +5992,7 @@ redef class ABraReassignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -7748,59 +6003,39 @@ redef class ABraReassignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
+        v.enter_visit(_n_expr)
             for n in _n_args do
-                v.visit(n)
-           end
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
+        v.enter_visit(_n_assign_op)
+        v.enter_visit(_n_value)
     end
 end
 redef class AClosureCallExpr
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aclosurecallexpr (
-            n_id: nullable TId ,
-            n_args: Collection[Object] , # Should be Collection[PExpr]
-            n_closure_defs: Collection[Object]  # Should be Collection[PClosureDef]
+            n_id: nullable TId,
+            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_closure_defs: Collection[Object] # Should be Collection[AClosureDef]
     )
     do
         empty_init
         _n_id = n_id.as(not null)
        n_id.parent = self
        for n in n_args do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_args.add(n)
                n.parent = self
        end
        for n in n_closure_defs do
-               assert n isa PClosureDef
+               assert n isa AClosureDef
                _n_closure_defs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -7815,7 +6050,7 @@ redef class AClosureCallExpr
         for i in [0.._n_args.length[ do
             if _n_args[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_args[i] = new_child
                     new_child.parent = self
                 else
@@ -7827,7 +6062,7 @@ redef class AClosureCallExpr
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PClosureDef
+                   assert new_child isa AClosureDef
                     _n_closure_defs[i] = new_child
                     new_child.parent = self
                 else
@@ -7840,45 +6075,20 @@ redef class AClosureCallExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
             for n in _n_args do
-                v.visit(n)
+                v.enter_visit(n)
            end
             for n in _n_closure_defs do
-                v.visit(n)
+                v.enter_visit(n)
            end
     end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
-       do
-           var i = _n_args.length
-            while i >= 0 do
-                v.visit(_n_args[i])
-               i = i - 1
-           end
-       end
-       do
-           var i = _n_closure_defs.length
-            while i >= 0 do
-                v.visit(_n_closure_defs[i])
-               i = i - 1
-           end
-       end
-    end
 end
 redef class AVarExpr
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_avarexpr (
-            n_id: nullable TId 
+            n_id: nullable TId
     )
     do
         empty_init
@@ -7886,7 +6096,7 @@ redef class AVarExpr
        n_id.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -7902,37 +6112,16 @@ redef class AVarExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
+        v.enter_visit(_n_id)
     end
 end
 redef class AVarAssignExpr
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign=(n)
-    do
-        _n_assign = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_avarassignexpr (
-            n_id: nullable TId ,
-            n_assign: nullable TAssign ,
-            n_value: nullable PExpr 
+            n_id: nullable TId,
+            n_assign: nullable TAssign,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -7944,7 +6133,7 @@ redef class AVarAssignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -7969,7 +6158,7 @@ redef class AVarAssignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -7980,41 +6169,18 @@ redef class AVarAssignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-        v.visit(_n_assign)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
-        v.visit(_n_assign)
-        v.visit(_n_value)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_assign)
+        v.enter_visit(_n_value)
     end
 end
 redef class AVarReassignExpr
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-    redef fun n_assign_op=(n)
-    do
-        _n_assign_op = n
-       n.parent = self
-    end
-    redef fun n_value=(n)
-    do
-        _n_value = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_avarreassignexpr (
-            n_id: nullable TId ,
-            n_assign_op: nullable PAssignOp ,
-            n_value: nullable PExpr 
+            n_id: nullable TId,
+            n_assign_op: nullable AAssignOp,
+            n_value: nullable AExpr
     )
     do
         empty_init
@@ -8026,7 +6192,7 @@ redef class AVarReassignExpr
        n_value.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_id == old_child then
             if new_child != null then
@@ -8041,7 +6207,7 @@ redef class AVarReassignExpr
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PAssignOp
+               assert new_child isa AAssignOp
                 _n_assign_op = new_child
            else
                abort
@@ -8051,7 +6217,7 @@ redef class AVarReassignExpr
         if _n_value == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_value = new_child
            else
                abort
@@ -8062,35 +6228,17 @@ redef class AVarReassignExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_id)
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_id)
-        v.visit(_n_assign_op)
-        v.visit(_n_value)
+        v.enter_visit(_n_id)
+        v.enter_visit(_n_assign_op)
+        v.enter_visit(_n_value)
     end
 end
 redef class ARangeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_arangeexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -8100,12 +6248,12 @@ redef class ARangeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -8115,7 +6263,7 @@ redef class ARangeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -8126,33 +6274,16 @@ redef class ARangeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class ACrangeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_acrangeexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -8162,12 +6293,12 @@ redef class ACrangeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -8177,7 +6308,7 @@ redef class ACrangeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -8188,33 +6319,16 @@ redef class ACrangeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AOrangeExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_expr2=(n)
-    do
-        _n_expr2 = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aorangeexpr (
-            n_expr: nullable PExpr ,
-            n_expr2: nullable PExpr 
+            n_expr: nullable AExpr,
+            n_expr2: nullable AExpr
     )
     do
         empty_init
@@ -8224,12 +6338,12 @@ redef class AOrangeExpr
        n_expr2.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -8239,7 +6353,7 @@ redef class AOrangeExpr
         if _n_expr2 == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr2 = new_child
            else
                abort
@@ -8250,38 +6364,31 @@ redef class AOrangeExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_expr2)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_expr2)
     end
 end
 redef class AArrayExpr
-
     private init empty_init do end
 
     init init_aarrayexpr (
-            n_exprs: Collection[Object]  # Should be Collection[PExpr]
+            n_exprs: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
        for n in n_exprs do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_exprs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_exprs.length[ do
             if _n_exprs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_exprs[i] = new_child
                     new_child.parent = self
                 else
@@ -8295,32 +6402,15 @@ redef class AArrayExpr
     redef fun visit_all(v: Visitor)
     do
             for n in _n_exprs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_exprs.length
-            while i >= 0 do
-                v.visit(_n_exprs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class ASelfExpr
-    redef fun n_kwself=(n)
-    do
-        _n_kwself = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aselfexpr (
-            n_kwself: nullable TKwself 
+            n_kwself: nullable TKwself
     )
     do
         empty_init
@@ -8328,7 +6418,7 @@ redef class ASelfExpr
        n_kwself.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwself == old_child then
             if new_child != null then
@@ -8344,16 +6434,10 @@ redef class ASelfExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwself)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwself)
+        v.enter_visit(_n_kwself)
     end
 end
 redef class AImplicitSelfExpr
-
     private init empty_init do end
 
     init init_aimplicitselfexpr
@@ -8361,29 +6445,19 @@ redef class AImplicitSelfExpr
         empty_init
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
     end
 
     redef fun visit_all(v: Visitor)
     do
     end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-    end
 end
 redef class ATrueExpr
-    redef fun n_kwtrue=(n)
-    do
-        _n_kwtrue = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_atrueexpr (
-            n_kwtrue: nullable TKwtrue 
+            n_kwtrue: nullable TKwtrue
     )
     do
         empty_init
@@ -8391,7 +6465,7 @@ redef class ATrueExpr
        n_kwtrue.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwtrue == old_child then
             if new_child != null then
@@ -8407,25 +6481,14 @@ redef class ATrueExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwtrue)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwtrue)
+        v.enter_visit(_n_kwtrue)
     end
 end
 redef class AFalseExpr
-    redef fun n_kwfalse=(n)
-    do
-        _n_kwfalse = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_afalseexpr (
-            n_kwfalse: nullable TKwfalse 
+            n_kwfalse: nullable TKwfalse
     )
     do
         empty_init
@@ -8433,7 +6496,7 @@ redef class AFalseExpr
        n_kwfalse.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwfalse == old_child then
             if new_child != null then
@@ -8449,25 +6512,14 @@ redef class AFalseExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwfalse)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwfalse)
+        v.enter_visit(_n_kwfalse)
     end
 end
 redef class ANullExpr
-    redef fun n_kwnull=(n)
-    do
-        _n_kwnull = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_anullexpr (
-            n_kwnull: nullable TKwnull 
+            n_kwnull: nullable TKwnull
     )
     do
         empty_init
@@ -8475,7 +6527,7 @@ redef class ANullExpr
        n_kwnull.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwnull == old_child then
             if new_child != null then
@@ -8486,30 +6538,19 @@ redef class ANullExpr
                abort
             end
             return
-       end
-    end
-
-    redef fun visit_all(v: Visitor)
-    do
-        v.visit(_n_kwnull)
+       end
     end
 
-    redef fun visit_all_reverse(v: Visitor)
+    redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwnull)
+        v.enter_visit(_n_kwnull)
     end
 end
 redef class AIntExpr
-    redef fun n_number=(n)
-    do
-        _n_number = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aintexpr (
-            n_number: nullable TNumber 
+            n_number: nullable TNumber
     )
     do
         empty_init
@@ -8517,7 +6558,7 @@ redef class AIntExpr
        n_number.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_number == old_child then
             if new_child != null then
@@ -8533,25 +6574,14 @@ redef class AIntExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_number)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_number)
+        v.enter_visit(_n_number)
     end
 end
 redef class AFloatExpr
-    redef fun n_float=(n)
-    do
-        _n_float = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_afloatexpr (
-            n_float: nullable TFloat 
+            n_float: nullable TFloat
     )
     do
         empty_init
@@ -8559,7 +6589,7 @@ redef class AFloatExpr
        n_float.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_float == old_child then
             if new_child != null then
@@ -8575,25 +6605,14 @@ redef class AFloatExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_float)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_float)
+        v.enter_visit(_n_float)
     end
 end
 redef class ACharExpr
-    redef fun n_char=(n)
-    do
-        _n_char = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_acharexpr (
-            n_char: nullable TChar 
+            n_char: nullable TChar
     )
     do
         empty_init
@@ -8601,7 +6620,7 @@ redef class ACharExpr
        n_char.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_char == old_child then
             if new_child != null then
@@ -8617,25 +6636,14 @@ redef class ACharExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_char)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_char)
+        v.enter_visit(_n_char)
     end
 end
 redef class AStringExpr
-    redef fun n_string=(n)
-    do
-        _n_string = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astringexpr (
-            n_string: nullable TString 
+            n_string: nullable TString
     )
     do
         empty_init
@@ -8643,7 +6651,7 @@ redef class AStringExpr
        n_string.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_string == old_child then
             if new_child != null then
@@ -8659,25 +6667,14 @@ redef class AStringExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_string)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_string)
+        v.enter_visit(_n_string)
     end
 end
 redef class AStartStringExpr
-    redef fun n_string=(n)
-    do
-        _n_string = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_astartstringexpr (
-            n_string: nullable TStartString 
+            n_string: nullable TStartString
     )
     do
         empty_init
@@ -8685,7 +6682,7 @@ redef class AStartStringExpr
        n_string.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_string == old_child then
             if new_child != null then
@@ -8701,25 +6698,14 @@ redef class AStartStringExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_string)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_string)
+        v.enter_visit(_n_string)
     end
 end
 redef class AMidStringExpr
-    redef fun n_string=(n)
-    do
-        _n_string = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_amidstringexpr (
-            n_string: nullable TMidString 
+            n_string: nullable TMidString
     )
     do
         empty_init
@@ -8727,7 +6713,7 @@ redef class AMidStringExpr
        n_string.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_string == old_child then
             if new_child != null then
@@ -8743,25 +6729,14 @@ redef class AMidStringExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_string)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_string)
+        v.enter_visit(_n_string)
     end
 end
 redef class AEndStringExpr
-    redef fun n_string=(n)
-    do
-        _n_string = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aendstringexpr (
-            n_string: nullable TEndString 
+            n_string: nullable TEndString
     )
     do
         empty_init
@@ -8769,7 +6744,7 @@ redef class AEndStringExpr
        n_string.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_string == old_child then
             if new_child != null then
@@ -8785,36 +6760,30 @@ redef class AEndStringExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_string)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_string)
+        v.enter_visit(_n_string)
     end
 end
 redef class ASuperstringExpr
-
     private init empty_init do end
 
     init init_asuperstringexpr (
-            n_exprs: Collection[Object]  # Should be Collection[PExpr]
+            n_exprs: Collection[Object] # Should be Collection[AExpr]
     )
     do
         empty_init
        for n in n_exprs do
-               assert n isa PExpr
+               assert n isa AExpr
                _n_exprs.add(n)
                n.parent = self
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_exprs.length[ do
             if _n_exprs[i] == old_child then
                 if new_child != null then
-                   assert new_child isa PExpr
+                   assert new_child isa AExpr
                     _n_exprs[i] = new_child
                     new_child.parent = self
                 else
@@ -8828,32 +6797,15 @@ redef class ASuperstringExpr
     redef fun visit_all(v: Visitor)
     do
             for n in _n_exprs do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_exprs.length
-            while i >= 0 do
-                v.visit(_n_exprs[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 redef class AParExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aparexpr (
-            n_expr: nullable PExpr 
+            n_expr: nullable AExpr
     )
     do
         empty_init
@@ -8861,12 +6813,12 @@ redef class AParExpr
        n_expr.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -8877,37 +6829,16 @@ redef class AParExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
+        v.enter_visit(_n_expr)
     end
 end
 redef class AAsCastExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_kwas=(n)
-    do
-        _n_kwas = n
-       n.parent = self
-    end
-    redef fun n_type=(n)
-    do
-        _n_type = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aascastexpr (
-            n_expr: nullable PExpr ,
-            n_kwas: nullable TKwas ,
-            n_type: nullable PType 
+            n_expr: nullable AExpr,
+            n_kwas: nullable TKwas,
+            n_type: nullable AType
     )
     do
         empty_init
@@ -8919,12 +6850,12 @@ redef class AAsCastExpr
        n_type.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -8944,7 +6875,7 @@ redef class AAsCastExpr
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PType
+               assert new_child isa AType
                 _n_type = new_child
            else
                abort
@@ -8955,47 +6886,19 @@ redef class AAsCastExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_kwas)
-        v.visit(_n_type)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_kwas)
-        v.visit(_n_type)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwas)
+        v.enter_visit(_n_type)
     end
 end
 redef class AAsNotnullExpr
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_kwas=(n)
-    do
-        _n_kwas = n
-       n.parent = self
-    end
-    redef fun n_kwnot=(n)
-    do
-        _n_kwnot = n
-       n.parent = self
-    end
-    redef fun n_kwnull=(n)
-    do
-        _n_kwnull = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aasnotnullexpr (
-            n_expr: nullable PExpr ,
-            n_kwas: nullable TKwas ,
-            n_kwnot: nullable TKwnot ,
-            n_kwnull: nullable TKwnull 
+            n_expr: nullable AExpr,
+            n_kwas: nullable TKwas,
+            n_kwnot: nullable TKwnot,
+            n_kwnull: nullable TKwnull
     )
     do
         empty_init
@@ -9009,12 +6912,12 @@ redef class AAsNotnullExpr
        n_kwnull.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -9055,43 +6958,19 @@ redef class AAsNotnullExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_expr)
-        v.visit(_n_kwas)
-        v.visit(_n_kwnot)
-        v.visit(_n_kwnull)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_expr)
-        v.visit(_n_kwas)
-        v.visit(_n_kwnot)
-        v.visit(_n_kwnull)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_kwas)
+        v.enter_visit(_n_kwnot)
+        v.enter_visit(_n_kwnull)
     end
 end
 redef class AIssetAttrExpr
-    redef fun n_kwisset=(n)
-    do
-        _n_kwisset = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-       n.parent = self
-    end
-    redef fun n_id=(n)
-    do
-        _n_id = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aissetattrexpr (
-            n_kwisset: nullable TKwisset ,
-            n_expr: nullable PExpr ,
-            n_id: nullable TAttrid 
+            n_kwisset: nullable TKwisset,
+            n_expr: nullable AExpr,
+            n_id: nullable TAttrid
     )
     do
         empty_init
@@ -9103,7 +6982,7 @@ redef class AIssetAttrExpr
        n_id.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_kwisset == old_child then
             if new_child != null then
@@ -9118,7 +6997,7 @@ redef class AIssetAttrExpr
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                abort
@@ -9139,29 +7018,16 @@ redef class AIssetAttrExpr
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwisset)
-        v.visit(_n_expr)
-        v.visit(_n_id)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_kwisset)
-        v.visit(_n_expr)
-        v.visit(_n_id)
+        v.enter_visit(_n_kwisset)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_id)
     end
 end
 redef class APlusAssignOp
-    redef fun n_pluseq=(n)
-    do
-        _n_pluseq = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aplusassignop (
-            n_pluseq: nullable TPluseq 
+            n_pluseq: nullable TPluseq
     )
     do
         empty_init
@@ -9169,7 +7035,7 @@ redef class APlusAssignOp
        n_pluseq.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_pluseq == old_child then
             if new_child != null then
@@ -9185,25 +7051,14 @@ redef class APlusAssignOp
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_pluseq)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_pluseq)
+        v.enter_visit(_n_pluseq)
     end
 end
 redef class AMinusAssignOp
-    redef fun n_minuseq=(n)
-    do
-        _n_minuseq = n
-       n.parent = self
-    end
-
     private init empty_init do end
 
     init init_aminusassignop (
-            n_minuseq: nullable TMinuseq 
+            n_minuseq: nullable TMinuseq
     )
     do
         empty_init
@@ -9211,7 +7066,7 @@ redef class AMinusAssignOp
        n_minuseq.parent = self
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_minuseq == old_child then
             if new_child != null then
@@ -9227,78 +7082,75 @@ redef class AMinusAssignOp
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_minuseq)
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        v.visit(_n_minuseq)
+        v.enter_visit(_n_minuseq)
     end
 end
 redef class AClosureDef
-    redef fun n_kwwith=(n)
-    do
-        _n_kwwith = n
-       n.parent = self
-    end
-    redef fun n_kwdo=(n)
-    do
-        _n_kwdo = n
-       n.parent = self
-    end
-    redef fun n_expr=(n)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
     private init empty_init do end
 
     init init_aclosuredef (
-            n_kwwith: nullable TKwwith ,
-            n_id: Collection[Object] , # Should be Collection[TId]
-            n_kwdo: nullable TKwdo ,
-            n_expr: nullable PExpr 
+            n_bang: nullable TBang,
+            n_id: nullable AClosureId,
+            n_ids: Collection[Object], # Should be Collection[TId]
+            n_kwdo: nullable TKwdo,
+            n_expr: nullable AExpr,
+            n_label: nullable ALabel
     )
     do
         empty_init
-        _n_kwwith = n_kwwith.as(not null)
-       n_kwwith.parent = self
-       for n in n_id do
+        _n_bang = n_bang.as(not null)
+       n_bang.parent = self
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+       for n in n_ids do
                assert n isa TId
-               _n_id.add(n)
+               _n_ids.add(n)
                n.parent = self
        end
-        _n_kwdo = n_kwdo.as(not null)
-       n_kwdo.parent = self
+        _n_kwdo = n_kwdo
+       if n_kwdo != null then
+               n_kwdo.parent = self
+       end
         _n_expr = n_expr
        if n_expr != null then
                n_expr.parent = self
        end
+        _n_label = n_label
+       if n_label != null then
+               n_label.parent = self
+       end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwwith == old_child then
+        if _n_bang == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa TKwwith
-                _n_kwwith = new_child
+               assert new_child isa TBang
+                _n_bang = new_child
            else
                abort
             end
             return
        end
-        for i in [0.._n_id.length[ do
-            if _n_id[i] == old_child then
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AClosureId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
+       end
+        for i in [0.._n_ids.length[ do
+            if _n_ids[i] == old_child then
                 if new_child != null then
                    assert new_child isa TId
-                    _n_id[i] = new_child
+                    _n_ids[i] = new_child
                     new_child.parent = self
                 else
-                    _n_id.remove_at(i)
+                    _n_ids.remove_at(i)
                 end
                 return
             end
@@ -9309,64 +7161,188 @@ redef class AClosureDef
                assert new_child isa TKwdo
                 _n_kwdo = new_child
            else
-               abort
+               _n_kwdo = null
             end
             return
        end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
-               assert new_child isa PExpr
+               assert new_child isa AExpr
                 _n_expr = new_child
            else
                _n_expr = null
             end
             return
        end
+        if _n_label == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa ALabel
+                _n_label = new_child
+           else
+               _n_label = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-        v.visit(_n_kwwith)
-            for n in _n_id do
-                v.visit(n)
+        v.enter_visit(_n_bang)
+        v.enter_visit(_n_id)
+            for n in _n_ids do
+                v.enter_visit(n)
            end
-        v.visit(_n_kwdo)
+        if _n_kwdo != null then
+            v.enter_visit(_n_kwdo.as(not null))
+        end
         if _n_expr != null then
-            v.visit(_n_expr.as(not null))
+            v.enter_visit(_n_expr.as(not null))
+        end
+        if _n_label != null then
+            v.enter_visit(_n_label.as(not null))
         end
     end
+end
+redef class ASimpleClosureId
+    private init empty_init do end
 
-    redef fun visit_all_reverse(v: Visitor)
+    init init_asimpleclosureid (
+            n_id: nullable TId
+    )
     do
-        v.visit(_n_kwwith)
-       do
-           var i = _n_id.length
-            while i >= 0 do
-                v.visit(_n_id[i])
-               i = i - 1
-           end
+        empty_init
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
        end
-        v.visit(_n_kwdo)
-        if _n_expr != null then
-            v.visit(_n_expr.as(not null))
-        end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_id)
     end
 end
-redef class AQualified
-    redef fun n_classid=(n)
+redef class ABreakClosureId
+    private init empty_init do end
+
+    init init_abreakclosureid (
+            n_kwbreak: nullable TKwbreak
+    )
+    do
+        empty_init
+        _n_kwbreak = n_kwbreak.as(not null)
+       n_kwbreak.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwbreak == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwbreak
+                _n_kwbreak = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwbreak)
+    end
+end
+redef class AModuleName
+    private init empty_init do end
+
+    init init_amodulename (
+            n_quad: nullable TQuad,
+            n_path: Collection[Object], # Should be Collection[TId]
+            n_id: nullable TId
+    )
+    do
+        empty_init
+        _n_quad = n_quad
+       if n_quad != null then
+               n_quad.parent = self
+       end
+       for n in n_path do
+               assert n isa TId
+               _n_path.add(n)
+               n.parent = self
+       end
+        _n_id = n_id.as(not null)
+       n_id.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        _n_classid = n
-        if n != null then
-           n.parent = self
+        if _n_quad == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TQuad
+                _n_quad = new_child
+           else
+               _n_quad = null
+            end
+            return
+       end
+        for i in [0.._n_path.length[ do
+            if _n_path[i] == old_child then
+                if new_child != null then
+                   assert new_child isa TId
+                    _n_path[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_path.remove_at(i)
+                end
+                return
+            end
         end
+        if _n_id == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TId
+                _n_id = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
+    redef fun visit_all(v: Visitor)
+    do
+        if _n_quad != null then
+            v.enter_visit(_n_quad.as(not null))
+        end
+            for n in _n_path do
+                v.enter_visit(n)
+           end
+        v.enter_visit(_n_id)
+    end
+end
+redef class AQualified
     private init empty_init do end
 
     init init_aqualified (
-            n_id: Collection[Object] , # Should be Collection[TId]
-            n_classid: nullable TClassid 
+            n_id: Collection[Object], # Should be Collection[TId]
+            n_classid: nullable TClassid
     )
     do
         empty_init
@@ -9381,7 +7357,7 @@ redef class AQualified
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_id.length[ do
             if _n_id[i] == old_child then
@@ -9410,33 +7386,18 @@ redef class AQualified
     redef fun visit_all(v: Visitor)
     do
             for n in _n_id do
-                v.visit(n)
-           end
-        if _n_classid != null then
-            v.visit(_n_classid.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_id.length
-            while i >= 0 do
-                v.visit(_n_id[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
         if _n_classid != null then
-            v.visit(_n_classid.as(not null))
+            v.enter_visit(_n_classid.as(not null))
         end
     end
 end
 redef class ADoc
-
     private init empty_init do end
 
     init init_adoc (
-            n_comment: Collection[Object]  # Should be Collection[TComment]
+            n_comment: Collection[Object] # Should be Collection[TComment]
     )
     do
         empty_init
@@ -9447,7 +7408,7 @@ redef class ADoc
        end
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         for i in [0.._n_comment.length[ do
             if _n_comment[i] == old_child then
@@ -9466,38 +7427,27 @@ redef class ADoc
     redef fun visit_all(v: Visitor)
     do
             for n in _n_comment do
-                v.visit(n)
-           end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-       do
-           var i = _n_comment.length
-            while i >= 0 do
-                v.visit(_n_comment[i])
-               i = i - 1
+                v.enter_visit(n)
            end
-       end
     end
 end
 
 redef class Start
     init(
-        n_base: nullable PModule,
+        n_base: nullable AModule,
         n_eof: EOF)
     do
         _n_base = n_base
         _n_eof = n_eof
     end
 
-    redef fun replace_child(old_child: PNode, new_child: nullable PNode)
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_base == old_child then
             if new_child == null then
             else
                 new_child.parent = self
-               assert new_child isa PModule
+               assert new_child isa AModule
                 _n_base = new_child
             end
             old_child.parent = null
@@ -9508,14 +7458,8 @@ redef class Start
     redef fun visit_all(v: Visitor)
     do
         if _n_base != null then
-            v.visit(_n_base.as(not null))
-        end
-    end
-
-    redef fun visit_all_reverse(v: Visitor)
-    do
-        if _n_base != null then
-            v.visit(_n_base.as(not null))
+            v.enter_visit(_n_base.as(not null))
         end
+       v.enter_visit(_n_eof)
     end
 end