parser: Add 'fun' and 'var'-as-attr keyword
[nit.git] / src / parser / parser_prod.nit
index 895feaa..2ec5db6 100644 (file)
@@ -1498,6 +1498,13 @@ redef class AAttrPropdef
            n.parent = self
         end
     end
+    redef meth n_kwvar=(n: TKwvar)
+    do
+        _n_kwvar = n
+        if n != null then
+           n.parent = self
+        end
+    end
     redef meth n_id=(n: TAttrid)
     do
         _n_id = n
@@ -1529,6 +1536,7 @@ redef class AAttrPropdef
             n_kwredef: TKwredef ,
             n_visibility: PVisibility ,
             n_kwattr: TKwattr ,
+            n_kwvar: TKwvar ,
             n_id: TAttrid ,
             n_type: PType ,
             n_expr: PExpr 
@@ -1559,6 +1567,10 @@ redef class AAttrPropdef
        if n_kwattr != null then
                n_kwattr.parent = self
        end
+        _n_kwvar = n_kwvar
+       if n_kwvar != null then
+               n_kwvar.parent = self
+       end
         _n_id = n_id
        if n_id != null then
                n_id.parent = self
@@ -1636,6 +1648,16 @@ redef class AAttrPropdef
             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
+            end
+            return
+       end
         if _n_id == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -1688,6 +1710,9 @@ redef class AAttrPropdef
         if _n_kwattr != null then
             v.visit(_n_kwattr)
         end
+        if _n_kwvar != null then
+            v.visit(_n_kwvar)
+        end
         if _n_id != null then
             v.visit(_n_id)
         end
@@ -1719,6 +1744,9 @@ redef class AAttrPropdef
         if _n_kwattr != null then
             v.visit(_n_kwattr)
         end
+        if _n_kwvar != null then
+            v.visit(_n_kwvar)
+        end
         if _n_id != null then
             v.visit(_n_id)
         end
@@ -4301,7 +4329,8 @@ redef class ASignature
 
     init init_asignature (
             n_params: Array[Object] , # Should be Array[PParam]
-            n_type: PType 
+            n_type: PType ,
+            n_closure_decls: Array[Object]  # Should be Array[PClosureDecl]
     )
     do
         empty_init
@@ -4315,6 +4344,12 @@ redef class ASignature
        if n_type != null then
                n_type.parent = self
        end
+        _n_closure_decls = new List[PClosureDecl]
+       for n in n_closure_decls do
+               assert n isa PClosureDecl
+               _n_closure_decls.add(n)
+               n.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -4342,6 +4377,18 @@ redef class ASignature
             end
             return
        end
+        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
+                    _n_closure_decls[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_closure_decls.remove_at(i)
+                end
+                return
+            end
+        end
     end
 
     redef meth visit_all(v: Visitor)
@@ -4352,6 +4399,9 @@ redef class ASignature
         if _n_type != null then
             v.visit(_n_type)
         end
+            for n in _n_closure_decls do
+                v.visit(n)
+           end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -4366,6 +4416,13 @@ redef class ASignature
         if _n_type != null then
             v.visit(_n_type)
         end
+       do
+           var i = _n_closure_decls.length
+            while i >= 0 do
+                v.visit(_n_closure_decls[i])
+               i = i - 1
+           end
+       end
     end
 end
 redef class AParam
@@ -4475,6 +4532,169 @@ redef class AParam
         end
     end
 end
+redef class AClosureDecl
+    redef meth n_kwwith=(n: TKwwith)
+    do
+        _n_kwwith = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_kwbreak=(n: TKwbreak)
+    do
+        _n_kwbreak = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_id=(n: TId)
+    do
+        _n_id = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_signature=(n: PSignature)
+    do
+        _n_signature = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_expr=(n: PExpr)
+    do
+        _n_expr = n
+        if n != null then
+           n.parent = self
+        end
+    end
+
+    private init empty_init do end
+
+    init init_aclosuredecl (
+            n_kwwith: TKwwith ,
+            n_kwbreak: TKwbreak ,
+            n_id: TId ,
+            n_signature: PSignature ,
+            n_expr: PExpr 
+    )
+    do
+        empty_init
+        _n_kwwith = n_kwwith
+       if n_kwwith != null then
+               n_kwwith.parent = self
+       end
+        _n_kwbreak = n_kwbreak
+       if n_kwbreak != null then
+               n_kwbreak.parent = self
+       end
+        _n_id = n_id
+       if n_id != null then
+               n_id.parent = self
+       end
+        _n_signature = n_signature
+       if n_signature != null then
+               n_signature.parent = self
+       end
+        _n_expr = n_expr
+       if n_expr != null then
+               n_expr.parent = self
+       end
+    end
+
+    redef meth replace_child(old_child: PNode, new_child: PNode)
+    do
+        assert old_child != null
+        if _n_kwwith == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwwith
+                _n_kwwith = new_child
+           else
+               _n_kwwith = null
+            end
+            return
+       end
+        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
+               _n_kwbreak = null
+            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
+               _n_id = null
+            end
+            return
+       end
+        if _n_signature == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa PSignature
+                _n_signature = new_child
+           else
+               _n_signature = null
+            end
+            return
+       end
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa PExpr
+                _n_expr = new_child
+           else
+               _n_expr = null
+            end
+            return
+       end
+    end
+
+    redef meth visit_all(v: Visitor)
+    do
+        if _n_kwwith != null then
+            v.visit(_n_kwwith)
+        end
+        if _n_kwbreak != null then
+            v.visit(_n_kwbreak)
+        end
+        if _n_id != null then
+            v.visit(_n_id)
+        end
+        if _n_signature != null then
+            v.visit(_n_signature)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
+    end
+
+    redef meth visit_all_reverse(v: Visitor)
+    do
+        if _n_kwwith != null then
+            v.visit(_n_kwwith)
+        end
+        if _n_kwbreak != null then
+            v.visit(_n_kwbreak)
+        end
+        if _n_id != null then
+            v.visit(_n_id)
+        end
+        if _n_signature != null then
+            v.visit(_n_signature)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
+    end
+end
 redef class AType
     redef meth n_id=(n: TClassid)
     do
@@ -4857,11 +5077,19 @@ redef class ABreakExpr
            n.parent = self
         end
     end
+    redef meth n_expr=(n: PExpr)
+    do
+        _n_expr = n
+        if n != null then
+           n.parent = self
+        end
+    end
 
     private init empty_init do end
 
     init init_abreakexpr (
-            n_kwbreak: TKwbreak 
+            n_kwbreak: TKwbreak ,
+            n_expr: PExpr 
     )
     do
         empty_init
@@ -4869,6 +5097,10 @@ redef class ABreakExpr
        if n_kwbreak != null then
                n_kwbreak.parent = self
        end
+        _n_expr = n_expr
+       if n_expr != null then
+               n_expr.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -4884,6 +5116,16 @@ redef class ABreakExpr
             end
             return
        end
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa PExpr
+                _n_expr = new_child
+           else
+               _n_expr = null
+            end
+            return
+       end
     end
 
     redef meth visit_all(v: Visitor)
@@ -4891,6 +5133,9 @@ redef class ABreakExpr
         if _n_kwbreak != null then
             v.visit(_n_kwbreak)
         end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -4898,6 +5143,9 @@ redef class ABreakExpr
         if _n_kwbreak != null then
             v.visit(_n_kwbreak)
         end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
     end
 end
 redef class AAbortExpr
@@ -4959,11 +5207,19 @@ redef class AContinueExpr
            n.parent = self
         end
     end
+    redef meth n_expr=(n: PExpr)
+    do
+        _n_expr = n
+        if n != null then
+           n.parent = self
+        end
+    end
 
     private init empty_init do end
 
     init init_acontinueexpr (
-            n_kwcontinue: TKwcontinue 
+            n_kwcontinue: TKwcontinue ,
+            n_expr: PExpr 
     )
     do
         empty_init
@@ -4971,6 +5227,10 @@ redef class AContinueExpr
        if n_kwcontinue != null then
                n_kwcontinue.parent = self
        end
+        _n_expr = n_expr
+       if n_expr != null then
+               n_expr.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -4986,6 +5246,16 @@ redef class AContinueExpr
             end
             return
        end
+        if _n_expr == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa PExpr
+                _n_expr = new_child
+           else
+               _n_expr = null
+            end
+            return
+       end
     end
 
     redef meth visit_all(v: Visitor)
@@ -4993,6 +5263,9 @@ redef class AContinueExpr
         if _n_kwcontinue != null then
             v.visit(_n_kwcontinue)
         end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -5000,6 +5273,9 @@ redef class AContinueExpr
         if _n_kwcontinue != null then
             v.visit(_n_kwcontinue)
         end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
     end
 end
 redef class ADoExpr
@@ -5411,141 +5687,13 @@ redef class AWhileExpr
     redef meth n_kwwhile=(n: TKwwhile)
     do
         _n_kwwhile = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef meth n_expr=(n: PExpr)
-    do
-        _n_expr = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef meth n_kwdo=(n: TKwdo)
-    do
-        _n_kwdo = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef meth n_block=(n: PExpr)
-    do
-        _n_block = n
-        if n != null then
-           n.parent = self
-        end
-    end
-
-    private init empty_init do end
-
-    init init_awhileexpr (
-            n_kwwhile: TKwwhile ,
-            n_expr: PExpr ,
-            n_kwdo: TKwdo ,
-            n_block: PExpr 
-    )
-    do
-        empty_init
-        _n_kwwhile = n_kwwhile
-       if n_kwwhile != null then
-               n_kwwhile.parent = self
-       end
-        _n_expr = n_expr
-       if n_expr != null then
-               n_expr.parent = self
-       end
-        _n_kwdo = n_kwdo
-       if n_kwdo != null then
-               n_kwdo.parent = self
-       end
-        _n_block = n_block
-       if n_block != null then
-               n_block.parent = self
-       end
-    end
-
-    redef meth replace_child(old_child: PNode, new_child: PNode)
-    do
-        assert old_child != null
-        if _n_kwwhile == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TKwwhile
-                _n_kwwhile = new_child
-           else
-               _n_kwwhile = null
-            end
-            return
-       end
-        if _n_expr == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa PExpr
-                _n_expr = new_child
-           else
-               _n_expr = null
-            end
-            return
-       end
-        if _n_kwdo == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TKwdo
-                _n_kwdo = new_child
-           else
-               _n_kwdo = null
-            end
-            return
-       end
-        if _n_block == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa PExpr
-                _n_block = new_child
-           else
-               _n_block = null
-            end
-            return
-       end
-    end
-
-    redef meth visit_all(v: Visitor)
-    do
-        if _n_kwwhile != null then
-            v.visit(_n_kwwhile)
-        end
-        if _n_expr != null then
-            v.visit(_n_expr)
-        end
-        if _n_kwdo != null then
-            v.visit(_n_kwdo)
-        end
-        if _n_block != null then
-            v.visit(_n_block)
-        end
-    end
-
-    redef meth visit_all_reverse(v: Visitor)
-    do
-        if _n_kwwhile != null then
-            v.visit(_n_kwwhile)
-        end
-        if _n_expr != null then
-            v.visit(_n_expr)
-        end
-        if _n_kwdo != null then
-            v.visit(_n_kwdo)
-        end
-        if _n_block != null then
-            v.visit(_n_block)
+        if n != null then
+           n.parent = self
         end
     end
-end
-redef class AForExpr
-    redef meth n_vardecl=(n: PExpr)
+    redef meth n_expr=(n: PExpr)
     do
-        _n_vardecl = n
+        _n_expr = n
         if n != null then
            n.parent = self
         end
@@ -5567,16 +5715,21 @@ redef class AForExpr
 
     private init empty_init do end
 
-    init init_aforexpr (
-            n_vardecl: PExpr ,
+    init init_awhileexpr (
+            n_kwwhile: TKwwhile ,
+            n_expr: PExpr ,
             n_kwdo: TKwdo ,
             n_block: PExpr 
     )
     do
         empty_init
-        _n_vardecl = n_vardecl
-       if n_vardecl != null then
-               n_vardecl.parent = self
+        _n_kwwhile = n_kwwhile
+       if n_kwwhile != null then
+               n_kwwhile.parent = self
+       end
+        _n_expr = n_expr
+       if n_expr != null then
+               n_expr.parent = self
        end
         _n_kwdo = n_kwdo
        if n_kwdo != null then
@@ -5591,13 +5744,23 @@ redef class AForExpr
     redef meth replace_child(old_child: PNode, new_child: PNode)
     do
         assert old_child != null
-        if _n_vardecl == old_child then
+        if _n_kwwhile == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwwhile
+                _n_kwwhile = new_child
+           else
+               _n_kwwhile = null
+            end
+            return
+       end
+        if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
                assert new_child isa PExpr
-                _n_vardecl = new_child
+                _n_expr = new_child
            else
-               _n_vardecl = null
+               _n_expr = null
             end
             return
        end
@@ -5625,8 +5788,11 @@ redef class AForExpr
 
     redef meth visit_all(v: Visitor)
     do
-        if _n_vardecl != null then
-            v.visit(_n_vardecl)
+        if _n_kwwhile != null then
+            v.visit(_n_kwwhile)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
         end
         if _n_kwdo != null then
             v.visit(_n_kwdo)
@@ -5638,8 +5804,11 @@ redef class AForExpr
 
     redef meth visit_all_reverse(v: Visitor)
     do
-        if _n_vardecl != null then
-            v.visit(_n_vardecl)
+        if _n_kwwhile != null then
+            v.visit(_n_kwwhile)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
         end
         if _n_kwdo != null then
             v.visit(_n_kwdo)
@@ -5649,7 +5818,7 @@ redef class AForExpr
         end
     end
 end
-redef class AForVardeclExpr
+redef class AForExpr
     redef meth n_kwfor=(n: TKwfor)
     do
         _n_kwfor = n
@@ -5671,13 +5840,29 @@ redef class AForVardeclExpr
            n.parent = self
         end
     end
+    redef meth n_kwdo=(n: TKwdo)
+    do
+        _n_kwdo = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_block=(n: PExpr)
+    do
+        _n_block = n
+        if n != null then
+           n.parent = self
+        end
+    end
 
     private init empty_init do end
 
-    init init_aforvardeclexpr (
+    init init_aforexpr (
             n_kwfor: TKwfor ,
             n_id: TId ,
-            n_expr: PExpr 
+            n_expr: PExpr ,
+            n_kwdo: TKwdo ,
+            n_block: PExpr 
     )
     do
         empty_init
@@ -5693,6 +5878,14 @@ redef class AForVardeclExpr
        if n_expr != null then
                n_expr.parent = self
        end
+        _n_kwdo = n_kwdo
+       if n_kwdo != null then
+               n_kwdo.parent = self
+       end
+        _n_block = n_block
+       if n_block != null then
+               n_block.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -5728,6 +5921,26 @@ redef class AForVardeclExpr
             end
             return
        end
+        if _n_kwdo == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwdo
+                _n_kwdo = new_child
+           else
+               _n_kwdo = null
+            end
+            return
+       end
+        if _n_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa PExpr
+                _n_block = new_child
+           else
+               _n_block = null
+            end
+            return
+       end
     end
 
     redef meth visit_all(v: Visitor)
@@ -5741,6 +5954,12 @@ redef class AForVardeclExpr
         if _n_expr != null then
             v.visit(_n_expr)
         end
+        if _n_kwdo != null then
+            v.visit(_n_kwdo)
+        end
+        if _n_block != null then
+            v.visit(_n_block)
+        end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -5754,6 +5973,12 @@ redef class AForVardeclExpr
         if _n_expr != null then
             v.visit(_n_expr)
         end
+        if _n_kwdo != null then
+            v.visit(_n_kwdo)
+        end
+        if _n_block != null then
+            v.visit(_n_block)
+        end
     end
 end
 redef class AAssertExpr
@@ -8000,7 +8225,8 @@ redef class ACallExpr
     init init_acallexpr (
             n_expr: PExpr ,
             n_id: TId ,
-            n_args: Array[Object]  # Should be Array[PExpr]
+            n_args: Array[Object] , # Should be Array[PExpr]
+            n_closure_defs: Array[Object]  # Should be Array[PClosureDef]
     )
     do
         empty_init
@@ -8018,6 +8244,12 @@ redef class ACallExpr
                _n_args.add(n)
                n.parent = self
        end
+        _n_closure_defs = new List[PClosureDef]
+       for n in n_closure_defs do
+               assert n isa PClosureDef
+               _n_closure_defs.add(n)
+               n.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -8055,6 +8287,18 @@ redef class ACallExpr
                 return
             end
         end
+        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
+                    _n_closure_defs[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_closure_defs.remove_at(i)
+                end
+                return
+            end
+        end
     end
 
     redef meth visit_all(v: Visitor)
@@ -8068,6 +8312,9 @@ redef class ACallExpr
             for n in _n_args do
                 v.visit(n)
            end
+            for n in _n_closure_defs do
+                v.visit(n)
+           end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -8085,6 +8332,13 @@ redef class ACallExpr
                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 ACallAssignExpr
@@ -8644,7 +8898,8 @@ redef class ABraExpr
 
     init init_abraexpr (
             n_expr: PExpr ,
-            n_args: Array[Object]  # Should be Array[PExpr]
+            n_args: Array[Object] , # Should be Array[PExpr]
+            n_closure_defs: Array[Object]  # Should be Array[PClosureDef]
     )
     do
         empty_init
@@ -8658,6 +8913,12 @@ redef class ABraExpr
                _n_args.add(n)
                n.parent = self
        end
+        _n_closure_defs = new List[PClosureDef]
+       for n in n_closure_defs do
+               assert n isa PClosureDef
+               _n_closure_defs.add(n)
+               n.parent = self
+       end
     end
 
     redef meth replace_child(old_child: PNode, new_child: PNode)
@@ -8685,6 +8946,18 @@ redef class ABraExpr
                 return
             end
         end
+        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
+                    _n_closure_defs[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_closure_defs.remove_at(i)
+                end
+                return
+            end
+        end
     end
 
     redef meth visit_all(v: Visitor)
@@ -8695,6 +8968,9 @@ redef class ABraExpr
             for n in _n_args do
                 v.visit(n)
            end
+            for n in _n_closure_defs do
+                v.visit(n)
+           end
     end
 
     redef meth visit_all_reverse(v: Visitor)
@@ -8709,6 +8985,13 @@ redef class ABraExpr
                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 ABraAssignExpr
@@ -10432,6 +10715,142 @@ redef class AMinusAssignOp
         end
     end
 end
+redef class AClosureDef
+    redef meth n_kwwith=(n: TKwwith)
+    do
+        _n_kwwith = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_kwdo=(n: TKwdo)
+    do
+        _n_kwdo = n
+        if n != null then
+           n.parent = self
+        end
+    end
+    redef meth n_expr=(n: PExpr)
+    do
+        _n_expr = n
+        if n != null then
+           n.parent = self
+        end
+    end
+
+    private init empty_init do end
+
+    init init_aclosuredef (
+            n_kwwith: TKwwith ,
+            n_id: Array[Object] , # Should be Array[TId]
+            n_kwdo: TKwdo ,
+            n_expr: PExpr 
+    )
+    do
+        empty_init
+        _n_kwwith = n_kwwith
+       if n_kwwith != null then
+               n_kwwith.parent = self
+       end
+        _n_id = new List[TId]
+       for n in n_id do
+               assert n isa TId
+               _n_id.add(n)
+               n.parent = self
+       end
+        _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
+    end
+
+    redef meth replace_child(old_child: PNode, new_child: PNode)
+    do
+        assert old_child != null
+        if _n_kwwith == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwwith
+                _n_kwwith = new_child
+           else
+               _n_kwwith = null
+            end
+            return
+       end
+        for i in [0.._n_id.length[ do
+            if _n_id[i] == old_child then
+                if new_child != null then
+                   assert new_child isa TId
+                    _n_id[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_id.remove_at(i)
+                end
+                return
+            end
+        end
+        if _n_kwdo == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwdo
+                _n_kwdo = new_child
+           else
+               _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
+                _n_expr = new_child
+           else
+               _n_expr = null
+            end
+            return
+       end
+    end
+
+    redef meth visit_all(v: Visitor)
+    do
+        if _n_kwwith != null then
+            v.visit(_n_kwwith)
+        end
+            for n in _n_id do
+                v.visit(n)
+           end
+        if _n_kwdo != null then
+            v.visit(_n_kwdo)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
+    end
+
+    redef meth visit_all_reverse(v: Visitor)
+    do
+        if _n_kwwith != null then
+            v.visit(_n_kwwith)
+        end
+       do
+           var i = _n_id.length
+            while i >= 0 do
+                v.visit(_n_id[i])
+               i = i - 1
+           end
+       end
+        if _n_kwdo != null then
+            v.visit(_n_kwdo)
+        end
+        if _n_expr != null then
+            v.visit(_n_expr)
+        end
+    end
+end
 redef class AQualified
     redef meth n_classid=(n: TClassid)
     do