From: Jean Privat Date: Mon, 6 Apr 2009 22:20:59 +0000 (-0400) Subject: ast: Merge classes AForExpr and AForVardeclExpr X-Git-Tag: v0.2.1~19 X-Git-Url: http://nitlanguage.org?hp=4dfdb8e7f1ae9757c1289363679672e12ab1f697 ast: Merge classes AForExpr and AForVardeclExpr Signed-off-by: Jean Privat --- diff --git a/src/compiling/compiling_methods.nit b/src/compiling/compiling_methods.nit index 2dfb4a4..60cc4b5 100644 --- a/src/compiling/compiling_methods.nit +++ b/src/compiling/compiling_methods.nit @@ -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 diff --git a/src/parser/nit.sablecc3xx b/src/parser/nit.sablecc3xx index 93be63a..4a5137e 100644 --- a/src/parser/nit.sablecc3xx +++ b/src/parser/nit.sablecc3xx @@ -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 diff --git a/src/parser/parser_abs.nit b/src/parser/parser_abs.nit index cbf5159..429c721 100644 --- a/src/parser/parser_abs.nit +++ b/src/parser/parser_abs.nit @@ -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 diff --git a/src/parser/parser_nodes.nit b/src/parser/parser_nodes.nit index ad2da68..b626615 100644 --- a/src/parser/parser_nodes.nit +++ b/src/parser/parser_nodes.nit @@ -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 diff --git a/src/parser/parser_prod.nit b/src/parser/parser_prod.nit index a33bd58..362dbf7 100644 --- a/src/parser/parser_prod.nit +++ b/src/parser/parser_prod.nit @@ -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 diff --git a/src/syntax/syntax_base.nit b/src/syntax/syntax_base.nit index 77177c3..977be5b 100644 --- a/src/syntax/syntax_base.nit +++ b/src/syntax/syntax_base.nit @@ -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 diff --git a/src/syntax/typing.nit b/src/syntax/typing.nit index f303d7e..6553885 100644 --- a/src/syntax/typing.nit +++ b/src/syntax/typing.nit @@ -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