ast: Merge classes AForExpr and AForVardeclExpr
authorJean Privat <jean@pryen.org>
Mon, 6 Apr 2009 22:20:59 +0000 (18:20 -0400)
committerJean Privat <jean@pryen.org>
Wed, 10 Jun 2009 13:59:07 +0000 (09:59 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/compiling/compiling_methods.nit
src/parser/nit.sablecc3xx
src/parser/parser_abs.nit
src/parser/parser_nodes.nit
src/parser/parser_prod.nit
src/syntax/syntax_base.nit
src/syntax/typing.nit

index 2dfb4a4..60cc4b5 100644 (file)
@@ -994,13 +994,6 @@ end
 redef class AForExpr
        redef meth compile_inside_block(v)
        do
-               v.compile_stmt(n_vardecl)
-       end
-end
-
-redef class AForVardeclExpr
-       redef meth compile_stmt(v)
-       do
                var e = v.compile_expr(n_expr)
                var ittype = meth_iterator.signature.return_type
                v.cfc.free_var(e)
@@ -1016,9 +1009,7 @@ redef class AForVardeclExpr
                e = v.ensure_var(e)
                var cname = v.cfc.register_variable(variable)
                v.add_assignment(cname, e)
-               var par = parent
-               assert par isa AForExpr
-               var n_block = par.n_block
+               var n_block = n_block
                if n_block != null then
                        v.compile_stmt(n_block)
                end
index 93be63a..4a5137e 100644 (file)
@@ -374,9 +374,7 @@ while~withelse {-> expr}
        = kwwhile no expr [n2]:no kwdo stmtso~withelse {-> New expr.while(kwwhile, expr, kwdo, stmtso~withelse.expr)};
  
 for~withelse {-> expr}
-       = for_vardecl [n4]:no kwdo stmtso~withelse {-> New expr.for(for_vardecl.expr, kwdo, stmtso~withelse.expr)};
-for_vardecl {-> expr}
-       = kwfor no id [n2]:no kwin [n3]:no expr {-> New expr.for_vardecl(kwfor, id, expr)};
+       = kwfor no id [n2]:no kwin [n3]:no expr [n4]:no kwdo stmtso~withelse {-> New expr.for(kwfor, id, expr, kwdo, stmtso~withelse.expr)};
 
 assert~withelse {-> expr}
        = kwassert assertid? expr_final~withelse {-> New expr.assert(kwassert, assertid.id, expr_final~withelse.expr)};
@@ -601,8 +599,7 @@ expr        = {block} expr*
        | {if} kwif expr [then]:expr? [else]:expr? 
        | {ifexpr} kwif expr kwthen [then]:expr kwelse [else]:expr
        | {while} kwwhile expr kwdo [block]:expr? 
-       | {for} [vardecl]:expr kwdo [block]:expr? 
-       | {for_vardecl} kwfor id expr
+       | {for} kwfor id expr kwdo [block]:expr? 
        | {assert} kwassert id? expr 
        | {once} kwonce expr 
        | {send} expr 
index cbf5159..429c721 100644 (file)
@@ -628,15 +628,11 @@ special PExpr
 end
 class AForExpr
 special PExpr
-    readable writable attr _n_vardecl: PExpr = null
-    readable writable attr _n_kwdo: TKwdo = null
-    readable writable attr _n_block: PExpr = null
-end
-class AForVardeclExpr
-special PExpr
     readable writable attr _n_kwfor: TKwfor = null
     readable writable attr _n_id: TId = null
     readable writable attr _n_expr: PExpr = null
+    readable writable attr _n_kwdo: TKwdo = null
+    readable writable attr _n_block: PExpr = null
 end
 class AAssertExpr
 special PExpr
index ad2da68..b626615 100644 (file)
@@ -604,15 +604,11 @@ special PExpr
 end
 class AForExpr
 special PExpr
-    readable writable attr _n_vardecl: PExpr = null
-    readable writable attr _n_kwdo: TKwdo = null
-    readable writable attr _n_block: PExpr = null
-end
-class AForVardeclExpr
-special PExpr
     readable writable attr _n_kwfor: TKwfor = null
     readable writable attr _n_id: TId = null
     readable writable attr _n_expr: PExpr = null
+    readable writable attr _n_kwdo: TKwdo = null
+    readable writable attr _n_block: PExpr = null
 end
 class AAssertExpr
 special PExpr
index a33bd58..362dbf7 100644 (file)
@@ -5791,130 +5791,37 @@ redef class AWhileExpr
     end
 end
 redef class AForExpr
-    redef meth n_vardecl=(n: PExpr)
-    do
-        _n_vardecl = n
-        if n != null then
-           n.parent = self
-        end
-    end
-    redef meth n_kwdo=(n: TKwdo)
+    redef meth n_kwfor=(n: TKwfor)
     do
-        _n_kwdo = n
+        _n_kwfor = n
         if n != null then
            n.parent = self
         end
     end
-    redef meth n_block=(n: PExpr)
+    redef meth n_id=(n: TId)
     do
-        _n_block = n
+        _n_id = n
         if n != null then
            n.parent = self
         end
     end
-
-    private init empty_init do end
-
-    init init_aforexpr (
-            n_vardecl: PExpr ,
-            n_kwdo: TKwdo ,
-            n_block: PExpr 
-    )
-    do
-        empty_init
-        _n_vardecl = n_vardecl
-       if n_vardecl != null then
-               n_vardecl.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_vardecl == old_child then
-            if new_child != null then
-                new_child.parent = self
-               assert new_child isa PExpr
-                _n_vardecl = new_child
-           else
-               _n_vardecl = 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_vardecl != null then
-            v.visit(_n_vardecl)
-        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_vardecl != null then
-            v.visit(_n_vardecl)
-        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 AForVardeclExpr
-    redef meth n_kwfor=(n: TKwfor)
+    redef meth n_expr=(n: PExpr)
     do
-        _n_kwfor = n
+        _n_expr = n
         if n != null then
            n.parent = self
         end
     end
-    redef meth n_id=(n: TId)
+    redef meth n_kwdo=(n: TKwdo)
     do
-        _n_id = n
+        _n_kwdo = n
         if n != null then
            n.parent = self
         end
     end
-    redef meth n_expr=(n: PExpr)
+    redef meth n_block=(n: PExpr)
     do
-        _n_expr = n
+        _n_block = n
         if n != null then
            n.parent = self
         end
@@ -5922,10 +5829,12 @@ redef class AForVardeclExpr
 
     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
@@ -5941,6 +5850,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)
@@ -5976,6 +5893,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)
@@ -5989,6 +5926,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)
@@ -6002,6 +5945,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
index 77177c3..977be5b 100644 (file)
@@ -603,7 +603,7 @@ redef class AVardeclExpr
        readable writable attr _variable: VarVariable
 end
 
-redef class AForVardeclExpr
+redef class AForExpr
        # Associated automatic local variable
        readable writable attr _variable: AutoVariable
 end
index f303d7e..6553885 100644 (file)
@@ -451,27 +451,19 @@ redef class AWhileExpr
 end
 
 redef class AForExpr
-       redef meth after_typing(v)
-       do
-               # pop context created in AForVardeclExpr
-               var varctx = v.variable_ctx 
-               assert varctx isa SubVariableContext
-               v.variable_ctx = varctx.prev
-       end
-end
-
-redef class AForVardeclExpr
        readable attr _meth_iterator: MMMethod
        readable attr _meth_is_ok: MMMethod
        readable attr _meth_item: MMMethod
        readable attr _meth_next: MMMethod
-       redef meth after_typing(v)
+       redef meth accept_typing(v)
        do
                v.variable_ctx = v.variable_ctx.sub
                var va = new AutoVariable(n_id.to_symbol, self)
                variable = va
                v.variable_ctx.add(va)
 
+               v.visit(n_expr)
+
                var expr_type = n_expr.stype
                if not v.check_conform_expr(n_expr, v.type_collection) then
                        return
@@ -500,6 +492,13 @@ redef class AForVardeclExpr
                var t = _meth_item.signature_for(iter_type).return_type
                if not n_expr.is_self then t = t.not_for_self
                va.stype = t
+
+               if n_block != null then v.visit(n_block)
+
+               # pop context
+               var varctx = v.variable_ctx 
+               assert varctx isa SubVariableContext
+               v.variable_ctx = varctx.prev
        end
 end