bench: enable HTML generation
[nit.git] / src / parser / parser_prod.nit
index aac684c..fe86fb2 100644 (file)
@@ -22,7 +22,7 @@ redef class ANode
        # Replace itself with an other node in the AST
        fun replace_with(node: ANode)
        do
-               if (_parent != null) then
+               if _parent != null then
                        _parent.replace_child(self, node)
                end
        end
@@ -47,7 +47,7 @@ redef class Prod
 end
 
 # Abstract standard visitor
-class Visitor
+abstract 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
@@ -73,6 +73,7 @@ redef class AModule
     init init_amodule (
             n_moduledecl: nullable AModuledecl,
             n_imports: Collection[Object], # Should be Collection[AImport]
+            n_extern_code_blocks: Collection[Object], # Should be Collection[AExternCodeBlock]
             n_classdefs: Collection[Object] # Should be Collection[AClassdef]
     )
     do
@@ -86,6 +87,11 @@ redef class AModule
                _n_imports.add(n)
                n.parent = self
        end
+       for n in n_extern_code_blocks do
+               assert n isa AExternCodeBlock
+               _n_extern_code_blocks.add(n)
+               n.parent = self
+       end
        for n in n_classdefs do
                assert n isa AClassdef
                _n_classdefs.add(n)
@@ -117,6 +123,18 @@ redef class AModule
                 return
             end
         end
+        for i in [0.._n_extern_code_blocks.length[ do
+            if _n_extern_code_blocks[i] == old_child then
+                if new_child != null then
+                   assert new_child isa AExternCodeBlock
+                    _n_extern_code_blocks[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_extern_code_blocks.remove_at(i)
+                end
+                return
+            end
+        end
         for i in [0.._n_classdefs.length[ do
             if _n_classdefs[i] == old_child then
                 if new_child != null then
@@ -139,6 +157,9 @@ redef class AModule
             for n in _n_imports do
                 v.enter_visit(n)
            end
+            for n in _n_extern_code_blocks do
+                v.enter_visit(n)
+           end
             for n in _n_classdefs do
                 v.enter_visit(n)
            end
@@ -444,6 +465,7 @@ redef class AStdClassdef
             n_classkind: nullable AClasskind,
             n_id: nullable TClassid,
             n_formaldefs: Collection[Object], # Should be Collection[AFormaldef]
+            n_extern_code_block: nullable AExternCodeBlock,
             n_superclasses: Collection[Object], # Should be Collection[ASuperclass]
             n_propdefs: Collection[Object], # Should be Collection[APropdef]
             n_kwend: nullable TKwend
@@ -471,6 +493,10 @@ redef class AStdClassdef
                _n_formaldefs.add(n)
                n.parent = self
        end
+        _n_extern_code_block = n_extern_code_block
+       if n_extern_code_block != null then
+               n_extern_code_block.parent = self
+       end
        for n in n_superclasses do
                assert n isa ASuperclass
                _n_superclasses.add(n)
@@ -549,6 +575,16 @@ redef class AStdClassdef
                 return
             end
         end
+        if _n_extern_code_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExternCodeBlock
+                _n_extern_code_block = new_child
+           else
+               _n_extern_code_block = null
+            end
+            return
+       end
         for i in [0.._n_superclasses.length[ do
             if _n_superclasses[i] == old_child then
                 if new_child != null then
@@ -601,6 +637,9 @@ redef class AStdClassdef
             for n in _n_formaldefs do
                 v.enter_visit(n)
            end
+        if _n_extern_code_block != null then
+            v.enter_visit(_n_extern_code_block.as(not null))
+        end
             for n in _n_superclasses do
                 v.enter_visit(n)
            end
@@ -828,12 +867,17 @@ redef class AExternClasskind
     private init empty_init do end
 
     init init_aexternclasskind (
-            n_kwextern: nullable TKwextern
+            n_kwextern: nullable TKwextern,
+            n_kwclass: nullable TKwclass
     )
     do
         empty_init
         _n_kwextern = n_kwextern.as(not null)
        n_kwextern.parent = self
+        _n_kwclass = n_kwclass
+       if n_kwclass != null then
+               n_kwclass.parent = self
+       end
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -848,11 +892,24 @@ redef class AExternClasskind
             end
             return
        end
+        if _n_kwclass == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwclass
+                _n_kwclass = new_child
+           else
+               _n_kwclass = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_kwextern)
+        if _n_kwclass != null then
+            v.enter_visit(_n_kwclass.as(not null))
+        end
     end
 end
 redef class AFormaldef
@@ -908,43 +965,26 @@ redef class ASuperclass
     private init empty_init do end
 
     init init_asuperclass (
-            n_kwspecial: nullable TKwspecial,
             n_kwsuper: nullable TKwsuper,
             n_type: nullable AType
     )
     do
         empty_init
-        _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_kwsuper = n_kwsuper.as(not null)
+       n_kwsuper.parent = self
         _n_type = n_type.as(not null)
        n_type.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
-        if _n_kwspecial == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa TKwspecial
-                _n_kwspecial = new_child
-           else
-               _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
+               abort
             end
             return
        end
@@ -962,12 +1002,7 @@ redef class ASuperclass
 
     redef fun visit_all(v: Visitor)
     do
-        if _n_kwspecial != null then
-            v.enter_visit(_n_kwspecial.as(not null))
-        end
-        if _n_kwsuper != null then
-            v.enter_visit(_n_kwsuper.as(not null))
-        end
+        v.enter_visit(_n_kwsuper)
         v.enter_visit(_n_type)
     end
 end
@@ -1484,7 +1519,8 @@ redef class AExternMethPropdef
             n_methid: nullable AMethid,
             n_signature: nullable ASignature,
             n_extern: nullable TString,
-            n_extern_calls: nullable AExternCalls
+            n_extern_calls: nullable AExternCalls,
+            n_extern_code_block: nullable AExternCodeBlock
     )
     do
         empty_init
@@ -1512,6 +1548,10 @@ redef class AExternMethPropdef
        if n_extern_calls != null then
                n_extern_calls.parent = self
        end
+        _n_extern_code_block = n_extern_code_block
+       if n_extern_code_block != null then
+               n_extern_code_block.parent = self
+       end
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -1596,6 +1636,16 @@ redef class AExternMethPropdef
             end
             return
        end
+        if _n_extern_code_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExternCodeBlock
+                _n_extern_code_block = new_child
+           else
+               _n_extern_code_block = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
@@ -1616,6 +1666,9 @@ redef class AExternMethPropdef
         if _n_extern_calls != null then
             v.enter_visit(_n_extern_calls.as(not null))
         end
+        if _n_extern_code_block != null then
+            v.enter_visit(_n_extern_code_block.as(not null))
+        end
     end
 end
 redef class AConcreteMethPropdef
@@ -1887,7 +1940,8 @@ redef class AExternInitPropdef
             n_methid: nullable AMethid,
             n_signature: nullable ASignature,
             n_extern: nullable TString,
-            n_extern_calls: nullable AExternCalls
+            n_extern_calls: nullable AExternCalls,
+            n_extern_code_block: nullable AExternCodeBlock
     )
     do
         empty_init
@@ -1917,6 +1971,10 @@ redef class AExternInitPropdef
        if n_extern_calls != null then
                n_extern_calls.parent = self
        end
+        _n_extern_code_block = n_extern_code_block
+       if n_extern_code_block != null then
+               n_extern_code_block.parent = self
+       end
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -2001,6 +2059,16 @@ redef class AExternInitPropdef
             end
             return
        end
+        if _n_extern_code_block == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExternCodeBlock
+                _n_extern_code_block = new_child
+           else
+               _n_extern_code_block = null
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
@@ -2023,6 +2091,9 @@ redef class AExternInitPropdef
         if _n_extern_calls != null then
             v.enter_visit(_n_extern_calls.as(not null))
         end
+        if _n_extern_code_block != null then
+            v.enter_visit(_n_extern_code_block.as(not null))
+        end
     end
 end
 redef class AMainMethPropdef
@@ -2921,17 +2992,27 @@ redef class ASignature
     private init empty_init do end
 
     init init_asignature (
+            n_opar: nullable TOpar,
             n_params: Collection[Object], # Should be Collection[AParam]
+            n_cpar: nullable TCpar,
             n_type: nullable AType,
             n_closure_decls: Collection[Object] # Should be Collection[AClosureDecl]
     )
     do
         empty_init
+        _n_opar = n_opar
+       if n_opar != null then
+               n_opar.parent = self
+       end
        for n in n_params do
                assert n isa AParam
                _n_params.add(n)
                n.parent = self
        end
+        _n_cpar = n_cpar
+       if n_cpar != null then
+               n_cpar.parent = self
+       end
         _n_type = n_type
        if n_type != null then
                n_type.parent = self
@@ -2945,6 +3026,16 @@ redef class ASignature
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
+        if _n_opar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TOpar
+                _n_opar = new_child
+           else
+               _n_opar = null
+            end
+            return
+       end
         for i in [0.._n_params.length[ do
             if _n_params[i] == old_child then
                 if new_child != null then
@@ -2957,6 +3048,16 @@ redef class ASignature
                 return
             end
         end
+        if _n_cpar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCpar
+                _n_cpar = new_child
+           else
+               _n_cpar = null
+            end
+            return
+       end
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -2983,9 +3084,15 @@ redef class ASignature
 
     redef fun visit_all(v: Visitor)
     do
+        if _n_opar != null then
+            v.enter_visit(_n_opar.as(not null))
+        end
             for n in _n_params do
                 v.enter_visit(n)
            end
+        if _n_cpar != null then
+            v.enter_visit(_n_cpar.as(not null))
+        end
         if _n_type != null then
             v.enter_visit(_n_type.as(not null))
         end
@@ -5329,7 +5436,7 @@ redef class ANewExpr
             n_kwnew: nullable TKwnew,
             n_type: nullable AType,
             n_id: nullable TId,
-            n_args: Collection[Object] # Should be Collection[AExpr]
+            n_args: nullable AExprs
     )
     do
         empty_init
@@ -5341,11 +5448,8 @@ redef class ANewExpr
        if n_id != null then
                n_id.parent = self
        end
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -5380,18 +5484,16 @@ redef class ANewExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
@@ -5401,9 +5503,7 @@ redef class ANewExpr
         if _n_id != null then
             v.enter_visit(_n_id.as(not null))
         end
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
     end
 end
 redef class AAttrExpr
@@ -5603,7 +5703,7 @@ redef class ACallExpr
     init init_acallexpr (
             n_expr: nullable AExpr,
             n_id: nullable TId,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             n_closure_defs: Collection[Object] # Should be Collection[AClosureDef]
     )
     do
@@ -5612,11 +5712,8 @@ redef class ACallExpr
        n_expr.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
        for n in n_closure_defs do
                assert n isa AClosureDef
                _n_closure_defs.add(n)
@@ -5646,18 +5743,16 @@ redef class ACallExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
@@ -5676,9 +5771,7 @@ redef class ACallExpr
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_id)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
             for n in _n_closure_defs do
                 v.enter_visit(n)
            end
@@ -5690,7 +5783,7 @@ redef class ACallAssignExpr
     init init_acallassignexpr (
             n_expr: nullable AExpr,
             n_id: nullable TId,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             n_assign: nullable TAssign,
             n_value: nullable AExpr
     )
@@ -5700,11 +5793,8 @@ redef class ACallAssignExpr
        n_expr.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
         _n_assign = n_assign.as(not null)
        n_assign.parent = self
         _n_value = n_value.as(not null)
@@ -5733,18 +5823,16 @@ redef class ACallAssignExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         if _n_assign == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -5771,9 +5859,7 @@ redef class ACallAssignExpr
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_id)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
         v.enter_visit(_n_assign)
         v.enter_visit(_n_value)
     end
@@ -5784,7 +5870,7 @@ redef class ACallReassignExpr
     init init_acallreassignexpr (
             n_expr: nullable AExpr,
             n_id: nullable TId,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             n_assign_op: nullable AAssignOp,
             n_value: nullable AExpr
     )
@@ -5794,11 +5880,8 @@ redef class ACallReassignExpr
        n_expr.parent = self
         _n_id = n_id.as(not null)
        n_id.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
         _n_assign_op = n_assign_op.as(not null)
        n_assign_op.parent = self
         _n_value = n_value.as(not null)
@@ -5827,18 +5910,16 @@ redef class ACallReassignExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -5865,9 +5946,7 @@ redef class ACallReassignExpr
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_id)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
         v.enter_visit(_n_assign_op)
         v.enter_visit(_n_value)
     end
@@ -5878,7 +5957,7 @@ redef class ASuperExpr
     init init_asuperexpr (
             n_qualified: nullable AQualified,
             n_kwsuper: nullable TKwsuper,
-            n_args: Collection[Object] # Should be Collection[AExpr]
+            n_args: nullable AExprs
     )
     do
         empty_init
@@ -5888,11 +5967,8 @@ redef class ASuperExpr
        end
         _n_kwsuper = n_kwsuper.as(not null)
        n_kwsuper.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -5917,18 +5993,16 @@ redef class ASuperExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
@@ -5937,9 +6011,7 @@ redef class ASuperExpr
             v.enter_visit(_n_qualified.as(not null))
         end
         v.enter_visit(_n_kwsuper)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
     end
 end
 redef class AInitExpr
@@ -5948,7 +6020,7 @@ redef class AInitExpr
     init init_ainitexpr (
             n_expr: nullable AExpr,
             n_kwinit: nullable TKwinit,
-            n_args: Collection[Object] # Should be Collection[AExpr]
+            n_args: nullable AExprs
     )
     do
         empty_init
@@ -5956,11 +6028,8 @@ redef class AInitExpr
        n_expr.parent = self
         _n_kwinit = n_kwinit.as(not null)
        n_kwinit.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -5985,27 +6054,23 @@ redef class AInitExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_kwinit)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
     end
 end
 redef class ABraExpr
@@ -6013,18 +6078,15 @@ redef class ABraExpr
 
     init init_abraexpr (
             n_expr: nullable AExpr,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             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 AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
        for n in n_closure_defs do
                assert n isa AClosureDef
                _n_closure_defs.add(n)
@@ -6044,18 +6106,16 @@ redef class ABraExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
@@ -6073,9 +6133,7 @@ redef class ABraExpr
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
             for n in _n_closure_defs do
                 v.enter_visit(n)
            end
@@ -6086,7 +6144,7 @@ redef class ABraAssignExpr
 
     init init_abraassignexpr (
             n_expr: nullable AExpr,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             n_assign: nullable TAssign,
             n_value: nullable AExpr
     )
@@ -6094,11 +6152,8 @@ redef class ABraAssignExpr
         empty_init
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
         _n_assign = n_assign.as(not null)
        n_assign.parent = self
         _n_value = n_value.as(not null)
@@ -6117,18 +6172,16 @@ redef class ABraAssignExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         if _n_assign == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -6154,9 +6207,7 @@ redef class ABraAssignExpr
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
         v.enter_visit(_n_assign)
         v.enter_visit(_n_value)
     end
@@ -6166,7 +6217,7 @@ redef class ABraReassignExpr
 
     init init_abrareassignexpr (
             n_expr: nullable AExpr,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             n_assign_op: nullable AAssignOp,
             n_value: nullable AExpr
     )
@@ -6174,11 +6225,8 @@ redef class ABraReassignExpr
         empty_init
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
-       for n in n_args do
-               assert n isa AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
         _n_assign_op = n_assign_op.as(not null)
        n_assign_op.parent = self
         _n_value = n_value.as(not null)
@@ -6197,18 +6245,16 @@ redef class ABraReassignExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         if _n_assign_op == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -6234,9 +6280,7 @@ redef class ABraReassignExpr
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_args)
         v.enter_visit(_n_assign_op)
         v.enter_visit(_n_value)
     end
@@ -6246,18 +6290,15 @@ redef class AClosureCallExpr
 
     init init_aclosurecallexpr (
             n_id: nullable TId,
-            n_args: Collection[Object], # Should be Collection[AExpr]
+            n_args: nullable AExprs,
             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 AExpr
-               _n_args.add(n)
-               n.parent = self
-       end
+        _n_args = n_args.as(not null)
+       n_args.parent = self
        for n in n_closure_defs do
                assert n isa AClosureDef
                _n_closure_defs.add(n)
@@ -6277,18 +6318,16 @@ redef class AClosureCallExpr
             end
             return
        end
-        for i in [0.._n_args.length[ do
-            if _n_args[i] == old_child then
-                if new_child != null then
-                   assert new_child isa AExpr
-                    _n_args[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_args.remove_at(i)
-                end
-                return
+        if _n_args == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_args = new_child
+           else
+               abort
             end
-        end
+            return
+       end
         for i in [0.._n_closure_defs.length[ do
             if _n_closure_defs[i] == old_child then
                 if new_child != null then
@@ -6306,10 +6345,8 @@ redef class AClosureCallExpr
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_id)
-            for n in _n_args do
-                v.enter_visit(n)
-           end
-            for n in _n_closure_defs do
+        v.enter_visit(_n_args)
+            for n in _n_closure_defs do
                 v.enter_visit(n)
            end
     end
@@ -6512,19 +6549,35 @@ redef class ACrangeExpr
     private init empty_init do end
 
     init init_acrangeexpr (
+            n_obra: nullable TObra,
             n_expr: nullable AExpr,
-            n_expr2: nullable AExpr
+            n_expr2: nullable AExpr,
+            n_cbra: nullable TCbra
     )
     do
         empty_init
+        _n_obra = n_obra.as(not null)
+       n_obra.parent = self
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
         _n_expr2 = n_expr2.as(not null)
        n_expr2.parent = self
+        _n_cbra = n_cbra.as(not null)
+       n_cbra.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
+        if _n_obra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TObra
+                _n_obra = new_child
+           else
+               abort
+            end
+            return
+       end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -6545,31 +6598,59 @@ redef class ACrangeExpr
             end
             return
        end
+        if _n_cbra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCbra
+                _n_cbra = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
+        v.enter_visit(_n_obra)
         v.enter_visit(_n_expr)
         v.enter_visit(_n_expr2)
+        v.enter_visit(_n_cbra)
     end
 end
 redef class AOrangeExpr
     private init empty_init do end
 
     init init_aorangeexpr (
+            n_obra: nullable TObra,
             n_expr: nullable AExpr,
-            n_expr2: nullable AExpr
+            n_expr2: nullable AExpr,
+            n_cbra: nullable TObra
     )
     do
         empty_init
+        _n_obra = n_obra.as(not null)
+       n_obra.parent = self
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
         _n_expr2 = n_expr2.as(not null)
        n_expr2.parent = self
+        _n_cbra = n_cbra.as(not null)
+       n_cbra.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
+        if _n_obra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TObra
+                _n_obra = new_child
+           else
+               abort
+            end
+            return
+       end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -6590,50 +6671,55 @@ redef class AOrangeExpr
             end
             return
        end
+        if _n_cbra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TObra
+                _n_cbra = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
+        v.enter_visit(_n_obra)
         v.enter_visit(_n_expr)
         v.enter_visit(_n_expr2)
+        v.enter_visit(_n_cbra)
     end
 end
 redef class AArrayExpr
     private init empty_init do end
 
     init init_aarrayexpr (
-            n_exprs: Collection[Object] # Should be Collection[AExpr]
+            n_exprs: nullable AExprs
     )
     do
         empty_init
-       for n in n_exprs do
-               assert n isa AExpr
-               _n_exprs.add(n)
-               n.parent = self
-       end
+        _n_exprs = n_exprs.as(not null)
+       n_exprs.parent = self
     end
 
     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 AExpr
-                    _n_exprs[i] = new_child
-                    new_child.parent = self
-                else
-                    _n_exprs.remove_at(i)
-                end
-                return
+        if _n_exprs == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AExprs
+                _n_exprs = new_child
+           else
+               abort
             end
-        end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
-            for n in _n_exprs do
-                v.enter_visit(n)
-           end
+        v.enter_visit(_n_exprs)
     end
 end
 redef class ASelfExpr
@@ -7035,16 +7121,32 @@ redef class AParExpr
     private init empty_init do end
 
     init init_aparexpr (
-            n_expr: nullable AExpr
+            n_opar: nullable TOpar,
+            n_expr: nullable AExpr,
+            n_cpar: nullable TCpar
     )
     do
         empty_init
+        _n_opar = n_opar.as(not null)
+       n_opar.parent = self
         _n_expr = n_expr.as(not null)
        n_expr.parent = self
+        _n_cpar = n_cpar.as(not null)
+       n_cpar.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
+        if _n_opar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TOpar
+                _n_opar = new_child
+           else
+               abort
+            end
+            return
+       end
         if _n_expr == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -7055,11 +7157,23 @@ redef class AParExpr
             end
             return
        end
+        if _n_cpar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCpar
+                _n_cpar = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
+        v.enter_visit(_n_opar)
         v.enter_visit(_n_expr)
+        v.enter_visit(_n_cpar)
     end
 end
 redef class AAsCastExpr
@@ -7068,7 +7182,9 @@ redef class AAsCastExpr
     init init_aascastexpr (
             n_expr: nullable AExpr,
             n_kwas: nullable TKwas,
-            n_type: nullable AType
+            n_opar: nullable TOpar,
+            n_type: nullable AType,
+            n_cpar: nullable TCpar
     )
     do
         empty_init
@@ -7076,8 +7192,12 @@ redef class AAsCastExpr
        n_expr.parent = self
         _n_kwas = n_kwas.as(not null)
        n_kwas.parent = self
+        _n_opar = n_opar.as(not null)
+       n_opar.parent = self
         _n_type = n_type.as(not null)
        n_type.parent = self
+        _n_cpar = n_cpar.as(not null)
+       n_cpar.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -7102,6 +7222,16 @@ redef class AAsCastExpr
             end
             return
        end
+        if _n_opar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TOpar
+                _n_opar = new_child
+           else
+               abort
+            end
+            return
+       end
         if _n_type == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -7112,13 +7242,25 @@ redef class AAsCastExpr
             end
             return
        end
+        if _n_cpar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCpar
+                _n_cpar = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_kwas)
+        v.enter_visit(_n_opar)
         v.enter_visit(_n_type)
+        v.enter_visit(_n_cpar)
     end
 end
 redef class AAsNotnullExpr
@@ -7127,8 +7269,10 @@ redef class AAsNotnullExpr
     init init_aasnotnullexpr (
             n_expr: nullable AExpr,
             n_kwas: nullable TKwas,
+            n_opar: nullable TOpar,
             n_kwnot: nullable TKwnot,
-            n_kwnull: nullable TKwnull
+            n_kwnull: nullable TKwnull,
+            n_cpar: nullable TCpar
     )
     do
         empty_init
@@ -7136,10 +7280,14 @@ redef class AAsNotnullExpr
        n_expr.parent = self
         _n_kwas = n_kwas.as(not null)
        n_kwas.parent = self
+        _n_opar = n_opar.as(not null)
+       n_opar.parent = self
         _n_kwnot = n_kwnot.as(not null)
        n_kwnot.parent = self
         _n_kwnull = n_kwnull.as(not null)
        n_kwnull.parent = self
+        _n_cpar = n_cpar.as(not null)
+       n_cpar.parent = self
     end
 
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
@@ -7164,6 +7312,16 @@ redef class AAsNotnullExpr
             end
             return
        end
+        if _n_opar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TOpar
+                _n_opar = new_child
+           else
+               abort
+            end
+            return
+       end
         if _n_kwnot == old_child then
             if new_child != null then
                 new_child.parent = self
@@ -7184,14 +7342,26 @@ redef class AAsNotnullExpr
             end
             return
        end
+        if _n_cpar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCpar
+                _n_cpar = new_child
+           else
+               abort
+            end
+            return
+       end
     end
 
     redef fun visit_all(v: Visitor)
     do
         v.enter_visit(_n_expr)
         v.enter_visit(_n_kwas)
+        v.enter_visit(_n_opar)
         v.enter_visit(_n_kwnot)
         v.enter_visit(_n_kwnull)
+        v.enter_visit(_n_cpar)
     end
 end
 redef class AIssetAttrExpr
@@ -7253,6 +7423,249 @@ redef class AIssetAttrExpr
         v.enter_visit(_n_id)
     end
 end
+redef class ADebugTypeExpr
+    private init empty_init do end
+
+    init init_adebugtypeexpr (
+            n_kwdebug: nullable TKwdebug,
+            n_kwtype: nullable TKwtype,
+            n_expr: nullable AExpr,
+            n_type: nullable AType
+    )
+    do
+        empty_init
+        _n_kwdebug = n_kwdebug.as(not null)
+       n_kwdebug.parent = self
+        _n_kwtype = n_kwtype.as(not null)
+       n_kwtype.parent = self
+        _n_expr = n_expr.as(not null)
+       n_expr.parent = self
+        _n_type = n_type.as(not null)
+       n_type.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwdebug == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwdebug
+                _n_kwdebug = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_kwtype == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwtype
+                _n_kwtype = new_child
+           else
+               abort
+            end
+            return
+       end
+        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_type == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AType
+                _n_type = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwdebug)
+        v.enter_visit(_n_kwtype)
+        v.enter_visit(_n_expr)
+        v.enter_visit(_n_type)
+    end
+end
+redef class AListExprs
+    private init empty_init do end
+
+    init init_alistexprs (
+            n_exprs: Collection[Object] # Should be Collection[AExpr]
+    )
+    do
+        empty_init
+       for n in n_exprs do
+               assert n isa AExpr
+               _n_exprs.add(n)
+               n.parent = self
+       end
+    end
+
+    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 AExpr
+                    _n_exprs[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_exprs.remove_at(i)
+                end
+                return
+            end
+        end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+            for n in _n_exprs do
+                v.enter_visit(n)
+           end
+    end
+end
+redef class AParExprs
+    private init empty_init do end
+
+    init init_aparexprs (
+            n_opar: nullable TOpar,
+            n_exprs: Collection[Object], # Should be Collection[AExpr]
+            n_cpar: nullable TCpar
+    )
+    do
+        empty_init
+        _n_opar = n_opar.as(not null)
+       n_opar.parent = self
+       for n in n_exprs do
+               assert n isa AExpr
+               _n_exprs.add(n)
+               n.parent = self
+       end
+        _n_cpar = n_cpar.as(not null)
+       n_cpar.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_opar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TOpar
+                _n_opar = new_child
+           else
+               abort
+            end
+            return
+       end
+        for i in [0.._n_exprs.length[ do
+            if _n_exprs[i] == old_child then
+                if new_child != null then
+                   assert new_child isa AExpr
+                    _n_exprs[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_exprs.remove_at(i)
+                end
+                return
+            end
+        end
+        if _n_cpar == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCpar
+                _n_cpar = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_opar)
+            for n in _n_exprs do
+                v.enter_visit(n)
+           end
+        v.enter_visit(_n_cpar)
+    end
+end
+redef class ABraExprs
+    private init empty_init do end
+
+    init init_abraexprs (
+            n_obra: nullable TObra,
+            n_exprs: Collection[Object], # Should be Collection[AExpr]
+            n_cbra: nullable TCbra
+    )
+    do
+        empty_init
+        _n_obra = n_obra.as(not null)
+       n_obra.parent = self
+       for n in n_exprs do
+               assert n isa AExpr
+               _n_exprs.add(n)
+               n.parent = self
+       end
+        _n_cbra = n_cbra.as(not null)
+       n_cbra.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_obra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TObra
+                _n_obra = new_child
+           else
+               abort
+            end
+            return
+       end
+        for i in [0.._n_exprs.length[ do
+            if _n_exprs[i] == old_child then
+                if new_child != null then
+                   assert new_child isa AExpr
+                    _n_exprs[i] = new_child
+                    new_child.parent = self
+                else
+                    _n_exprs.remove_at(i)
+                end
+                return
+            end
+        end
+        if _n_cbra == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TCbra
+                _n_cbra = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_obra)
+            for n in _n_exprs do
+                v.enter_visit(n)
+           end
+        v.enter_visit(_n_cbra)
+    end
+end
 redef class APlusAssignOp
     private init empty_init do end
 
@@ -7982,6 +8395,100 @@ redef class AAsNotNullableExternCall
         v.enter_visit(_n_kwnullable)
     end
 end
+redef class AInLanguage
+    private init empty_init do end
+
+    init init_ainlanguage (
+            n_kwin: nullable TKwin,
+            n_string: nullable TString
+    )
+    do
+        empty_init
+        _n_kwin = n_kwin.as(not null)
+       n_kwin.parent = self
+        _n_string = n_string.as(not null)
+       n_string.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_kwin == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TKwin
+                _n_kwin = new_child
+           else
+               abort
+            end
+            return
+       end
+        if _n_string == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TString
+                _n_string = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        v.enter_visit(_n_kwin)
+        v.enter_visit(_n_string)
+    end
+end
+redef class AExternCodeBlock
+    private init empty_init do end
+
+    init init_aexterncodeblock (
+            n_in_language: nullable AInLanguage,
+            n_extern_code_segment: nullable TExternCodeSegment
+    )
+    do
+        empty_init
+        _n_in_language = n_in_language
+       if n_in_language != null then
+               n_in_language.parent = self
+       end
+        _n_extern_code_segment = n_extern_code_segment.as(not null)
+       n_extern_code_segment.parent = self
+    end
+
+    redef fun replace_child(old_child: ANode, new_child: nullable ANode)
+    do
+        if _n_in_language == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa AInLanguage
+                _n_in_language = new_child
+           else
+               _n_in_language = null
+            end
+            return
+       end
+        if _n_extern_code_segment == old_child then
+            if new_child != null then
+                new_child.parent = self
+               assert new_child isa TExternCodeSegment
+                _n_extern_code_segment = new_child
+           else
+               abort
+            end
+            return
+       end
+    end
+
+    redef fun visit_all(v: Visitor)
+    do
+        if _n_in_language != null then
+            v.enter_visit(_n_in_language.as(not null))
+        end
+        v.enter_visit(_n_extern_code_segment)
+    end
+end
 redef class AQualified
     private init empty_init do end
 
@@ -8078,14 +8585,6 @@ redef class ADoc
 end
 
 redef class Start
-    init(
-        n_base: nullable AModule,
-        n_eof: EOF)
-    do
-        _n_base = n_base
-        _n_eof = n_eof
-    end
-
     redef fun replace_child(old_child: ANode, new_child: nullable ANode)
     do
         if _n_base == old_child then