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)
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
= 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)};
| {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
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
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
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
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
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)
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)
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)
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
readable writable attr _variable: VarVariable
end
-redef class AForVardeclExpr
+redef class AForExpr
# Associated automatic local variable
readable writable attr _variable: AutoVariable
end
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
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