astbuilder: `make_new` and `make_call` require a CallSite
authorJean Privat <jean@pryen.org>
Thu, 15 May 2014 14:36:12 +0000 (10:36 -0400)
committerJean Privat <jean@pryen.org>
Thu, 15 May 2014 14:50:52 +0000 (10:50 -0400)
a callsite has a lot more information that was previously lost.

Signed-off-by: Jean Privat <jean@pryen.org>

src/astbuilder.nit
src/transform.nit

index afcffdf..3b5aceb 100644 (file)
@@ -36,17 +36,15 @@ class ASTBuilder
        end
 
        # Make a new instatiation
-       fun make_new(mtype: MClassType, constructor: MMethod, args: nullable Array[AExpr]): ANewExpr
+       fun make_new(callsite: CallSite, args: nullable Array[AExpr]): ANewExpr
        do
-               return new ANewExpr.make(mtype, constructor, args)
+               return new ANewExpr.make(callsite, args)
        end
 
        # Make a new message send
-       fun make_call(recv: AExpr, mmethod: MMethod, args: nullable Array[AExpr]): ACallExpr
+       fun make_call(recv: AExpr, callsite: CallSite, args: nullable Array[AExpr]): ACallExpr
        do
-               var mtype = mmethod.intro.msignature.return_mtype
-               if mtype != null then mtype = mtype.resolve_for(recv.mtype.as(not null), anchor, mmodule, true)
-               return new ACallExpr.make(recv, mmethod, args, mtype)
+               return new ACallExpr.make(recv, callsite, args)
        end
 
        # Make a new, empty, sequence of statements
@@ -230,7 +228,7 @@ redef class ADecIntExpr
 end
 
 redef class ANewExpr
-       private init make(mtype: MClassType, mmethod: MMethod, args: nullable Array[AExpr])
+       private init make(callsite: CallSite, args: nullable Array[AExpr])
        do
                _n_kwnew = new TKwnew
                _n_type = new AType.make
@@ -238,24 +236,24 @@ redef class ANewExpr
                if args != null then
                        n_args.n_exprs.add_all(args)
                end
-               callsite = new CallSite(self, mtype, mmethod.intro.mclassdef.mmodule, mtype, true, mmethod, mmethod.intro, mmethod.intro.msignature.as(not null), false)
-               self.mtype = mtype
+               self.callsite = callsite
+               self.mtype = callsite.recv
+               self.is_typed = true
        end
 end
 
 redef class ACallExpr
-       private init make(recv: AExpr, mmethod: MMethod, args: nullable Array[AExpr], t: nullable MType)
+       private init make(recv: AExpr, callsite: CallSite, args: nullable Array[AExpr])
        do
                self._n_expr = recv
-               recv.parent = self
                _n_args = new AListExprs
                _n_id = new TId
                if args != null then
                        self.n_args.n_exprs.add_all(args)
                end
                var mtype = recv.mtype.as(not null)
-               callsite = new CallSite(self, mtype, mmethod.intro.mclassdef.mmodule, mmethod.intro.mclassdef.bound_mtype, true, mmethod, mmethod.intro, mmethod.intro.msignature.as(not null), false)
-               self.mtype = t
+               self.callsite = callsite
+               self.mtype = callsite.msignature.return_mtype
                self.is_typed = true
        end
 end
index b2db18e..6bd37b0 100644 (file)
@@ -171,16 +171,13 @@ redef class AArrayExpr
        #     t
        redef fun accept_transform_visitor(v)
        do
-               var mtype = self.mtype.as(MClassType)
                var nblock = v.builder.make_block
 
-               var meth = v.get_method(self, "with_capacity", mtype.mclass)
-               var nnew = v.builder.make_new(mtype, meth, [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.n_exprs.length)])
                nblock.add nnew
 
-               var madd = v.get_method(self, "push", mtype.mclass)
                for nexpr in self.n_exprs.n_exprs do
-                       var nadd = v.builder.make_call(nnew.make_var_read, madd, [nexpr])
+                       var nadd = v.builder.make_call(nnew.make_var_read, push_callsite.as(not null), [nexpr])
                        nblock.add nadd
                end
                var nres = nnew.make_var_read
@@ -194,8 +191,7 @@ redef class ACrangeExpr
        # `[x..y]` is replaced with `new Range[X](x,y)`
        redef fun accept_transform_visitor(v)
        do
-               var mtype = self.mtype.as(MClassType)
-               replace_with(v.builder.make_new(mtype, init_callsite.mproperty, [n_expr, n_expr2]))
+               replace_with(v.builder.make_new(init_callsite.as(not null), [n_expr, n_expr2]))
        end
 end
 
@@ -203,8 +199,7 @@ redef class AOrangeExpr
        # `[x..y[` is replaced with `new Range[X].without_last(x,y)`
        redef fun accept_transform_visitor(v)
        do
-               var mtype = self.mtype.as(MClassType)
-               replace_with(v.builder.make_new(mtype, init_callsite.mproperty, [n_expr, n_expr2]))
+               replace_with(v.builder.make_new(init_callsite.as(not null), [n_expr, n_expr2]))
        end
 end
 
@@ -237,12 +232,12 @@ redef class ASendReassignFormExpr
                        write_args.add(a.make_var_read)
                end
 
-               var nread = v.builder.make_call(n_expr.make_var_read, callsite.mproperty, read_args)
+               var nread = v.builder.make_call(n_expr.make_var_read, callsite.as(not null), read_args)
 
-               var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value])
+               var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value])
 
                write_args.add(nnewvalue)
-               var nwrite = v.builder.make_call(n_expr.make_var_read, write_callsite.mproperty, write_args)
+               var nwrite = v.builder.make_call(n_expr.make_var_read, write_callsite.as(not null), write_args)
                nblock.add(nwrite)
 
                replace_with(nblock)
@@ -257,7 +252,7 @@ redef class AVarReassignExpr
 
                var nread = v.builder.make_var_read(variable, read_type.as(not null))
 
-               var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value])
+               var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value])
                var nwrite = v.builder.make_var_assign(variable, nnewvalue)
 
                replace_with(nwrite)
@@ -273,7 +268,7 @@ redef class AAttrReassignExpr
                var attribute = self.mproperty.as(not null)
 
                var nread = v.builder.make_attr_read(n_expr.make_var_read, attribute)
-               var nnewvalue = v.builder.make_call(nread, reassign_callsite.mproperty, [n_value])
+               var nnewvalue = v.builder.make_call(nread, reassign_callsite.as(not null), [n_value])
                var nwrite = v.builder.make_attr_assign(n_expr.make_var_read, attribute, nnewvalue)
                nblock.add(nwrite)