modelize_property: use resolve_mtype_unchecked during build_signature
[nit.git] / src / transform.nit
index 07acefb..dac3c4f 100644 (file)
@@ -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