X-Git-Url: http://nitlanguage.org diff --git a/src/transform.nit b/src/transform.nit index 07acefb..dac3c4f 100644 --- a/src/transform.nit +++ b/src/transform.nit @@ -41,7 +41,9 @@ private class TransformPhase do var val - var v = new TransformVisitor(self, npropdef.mpropdef.as(not null)) + var m = npropdef.mpropdef + if m == null then return + var v = new TransformVisitor(self, m) v.enter_visit(npropdef) val = new ASTValidationVisitor @@ -68,14 +70,7 @@ private class TransformVisitor redef fun visit(node) do if node isa AAnnotations then return - node.visit_all(self) - node.accept_transform_visitor(self) - end - - # Get a primitive class or display a fatal error on `location`. - fun get_class(location: AExpr, name: String): MClass - do - return mmodule.get_primitive_class(name) + node.full_transform_visitor(self) end # Get a primitive method or display a fatal error on `location`. @@ -86,11 +81,32 @@ private class TransformVisitor end redef class ANode + private fun full_transform_visitor(v: TransformVisitor) + do + visit_all(v) + accept_transform_visitor(v) + end private fun accept_transform_visitor(v: TransformVisitor) do end end +redef class AExpr + redef fun full_transform_visitor(v: TransformVisitor) + do + var na = comprehension + if na != null then + # We are building a comprehension array `array` + # Replace `self` with `array.push(self)` + var place = detach_with_placeholder + var recv = na.nnew.make_var_read + var nadd = v.builder.make_call(recv, na.push_callsite.as(not null), [self]) + place.replace_with(nadd) + end + super + end +end + redef class AVardeclExpr # `var x = y` is replaced with `x = y` # @@ -278,22 +294,27 @@ redef class AArrayExpr # t.add(y) # t # ~~~ - redef fun accept_transform_visitor(v) + redef fun full_transform_visitor(v) do var nblock = v.builder.make_block - var nnew = v.builder.make_new(with_capacity_callsite.as(not null), [v.builder.make_int(n_exprs.n_exprs.length)]) + var nnew = v.builder.make_new(with_capacity_callsite.as(not null), [v.builder.make_int(n_exprs.length)]) + self.nnew = nnew + nblock.add nnew - for nexpr in self.n_exprs.n_exprs do - var nadd = v.builder.make_call(nnew.make_var_read, push_callsite.as(not null), [nexpr]) - nblock.add nadd + super + + for nexpr in self.n_exprs do + nblock.add nexpr end var nres = nnew.make_var_read nblock.add nres replace_with(nblock) end + + private var nnew: ANewExpr is noinit end redef class ACrangeExpr