lib: Split collections into readable and writable
[nit.git] / src / compiling / compiling_methods.nit
index b744d07..1253a51 100644 (file)
@@ -73,12 +73,12 @@ redef class CompilerVisitor
        # Generate an fprintf to display an error location
        meth printf_locate_error(node: PNode): String
        do
-               var s = "fprintf(stderr, \""
+               var s = new Buffer.from("fprintf(stderr, \"")
                if nmc != null then s.append(" in %s")
                s.append(" (%s:%d)\\n\", ")
                if nmc != null then s.append("LOCATE_{nmc.method.cname}, ")
                s.append("LOCATE_{module.name}, {node.line_number});")
-               return s
+               return s.to_s
        end
 
        redef init(module: MMSrcModule)
@@ -302,7 +302,7 @@ redef class MMMethod
                        cargs.add("init_table /*YYY*/")
                end
 
-               var m = "(({cname}_t)CALL({cargs[0]},{global.color_id}))"
+               var m = "{global.meth_call}({cargs[0]})"
                var vcall = "{m}({cargs.join(", ")}) /*{local_class}::{name}*/"
                if name == ee then
                        vcall = "UNTAG_Bool({vcall})"
@@ -331,7 +331,7 @@ redef class MMMethod
        # Compile a call as call-next-method on self with given args
        meth compile_super_call(v: CompilerVisitor, cargs: Array[String]): String
        do
-               var m = "(({cname}_t)CALL({cargs[0]},{color_id_for_super}))"
+               var m = "{super_meth_call}({cargs[0]})"
                var vcall = "{m}({cargs.join(", ")}) /*super {local_class}::{name}*/"
                return vcall
        end
@@ -1002,37 +1002,17 @@ redef class AForVardeclExpr
        redef meth compile_stmt(v)
        do
                var e = v.compile_expr(n_expr)
-               var prop = n_expr.stype.local_class.select_method(once "iterator".to_symbol)
-               if prop == null then
-                       printl("No iterator")
-                       return
-               end
-               var ittype = prop.signature.return_type
+               var ittype = meth_iterator.signature.return_type
                v.cfc.free_var(e)
                var iter = v.cfc.get_var
-               v.add_assignment(iter, prop.compile_call(v, [e]))
-               var prop2 = ittype.local_class.select_method(once "is_ok".to_symbol)
-               if prop2 == null then
-                       printl("No is_ok")
-                       return
-               end
-               var prop3 = ittype.local_class.select_method(once "item".to_symbol)
-               if prop3 == null then
-                       printl("No item")
-                       return
-               end
-               var prop4 = ittype.local_class.select_method(once "next".to_symbol)
-               if prop4 == null then
-                       printl("No next")
-                       return
-               end
+               v.add_assignment(iter, meth_iterator.compile_call(v, [e]))
                v.add_instr("while (true) \{ /*for*/")
                v.indent
                var ok = v.cfc.get_var
-               v.add_assignment(ok, prop2.compile_call(v, [iter]))
+               v.add_assignment(ok, meth_is_ok.compile_call(v, [iter]))
                v.add_instr("if (!UNTAG_Bool({ok})) break; /*for*/")
                v.cfc.free_var(ok)
-               var e = prop3.compile_call(v, [iter])
+               var e = meth_item.compile_call(v, [iter])
                e = v.ensure_var(e)
                var cname = v.cfc.register_variable(variable)
                v.add_assignment(cname, e)
@@ -1043,7 +1023,7 @@ redef class AForVardeclExpr
                        v.compile_stmt(n_block)
                end
                v.add_instr("{v.nmc.continue_label}: while(0);")
-               e = prop4.compile_call(v, [iter])
+               e = meth_next.compile_call(v, [iter])
                assert e == null
                v.unindent
                v.add_instr("}")
@@ -1196,9 +1176,8 @@ end
 redef class AStringFormExpr
        redef meth compile_expr(v)
        do
-               var prop = stype.local_class.select_method(once "with_native".to_symbol)
                compute_string_info
-               return prop.compile_constructor_call(v, stype , ["BOX_NativeString(\"{_cstring}\")", "TAG_Int({_cstring_length})"])
+               return meth_with_native.compile_constructor_call(v, stype , ["BOX_NativeString(\"{_cstring}\")", "TAG_Int({_cstring_length})"])
        end
 
        # The raw string value
@@ -1215,7 +1194,7 @@ redef class AStringFormExpr
        do
                var len = 0
                var str = string_text
-               var res = new String
+               var res = new Buffer
                var i = 0
                while i < str.length do
                        var c = str[i]
@@ -1231,7 +1210,7 @@ redef class AStringFormExpr
                        res.add(c)
                        i = i + 1
                end
-               _cstring = res
+               _cstring = res.to_s
                _cstring_length = len
        end
 end
@@ -1252,21 +1231,17 @@ end
 redef class ASuperstringExpr
        redef meth compile_expr(v)
        do
-               var prop = stype.local_class.select_method(once "init".to_symbol)
-               var recv = prop.compile_constructor_call(v, stype, new Array[String]) 
-
-               var prop2 = stype.local_class.select_method(once "append".to_symbol)
+               var array = meth_with_capacity.compile_constructor_call(v, atype, ["TAG_Int({n_exprs.length})"])
 
-               var prop3 = stype.local_class.select_method(once "to_s".to_symbol)
                for ne in n_exprs do
                        var e = v.ensure_var(v.compile_expr(ne))
                        if ne.stype != stype then
-                               v.add_assignment(e, prop3.compile_call(v, [e]))
+                               v.add_assignment(e, meth_to_s.compile_call(v, [e]))
                        end
-                       prop2.compile_call(v, [recv, e])
+                       meth_add.compile_call(v, [array, e])
                end
 
-               return recv
+               return meth_to_s.compile_call(v, [array])
        end
 end
 
@@ -1280,13 +1255,11 @@ end
 redef class AArrayExpr
        redef meth compile_expr(v)
        do
-               var prop = stype.local_class.select_method(once "with_capacity".to_symbol)
-               var recv = prop.compile_constructor_call(v, stype, ["TAG_Int({n_exprs.length})"])
+               var recv = meth_with_capacity.compile_constructor_call(v, stype, ["TAG_Int({n_exprs.length})"])
 
-               var prop2 = stype.local_class.select_method(once "add".to_symbol)
                for ne in n_exprs do
                        var e = v.compile_expr(ne)
-                       prop2.compile_call(v, [recv, e])
+                       meth_add.compile_call(v, [recv, e])
                end
                return recv
        end
@@ -1295,20 +1268,10 @@ end
 redef class ARangeExpr
        redef meth compile_expr(v)
        do
-               var prop = stype.local_class.select_method(propname)
                var e = v.compile_expr(n_expr)
                var e2 = v.compile_expr(n_expr2)
-               return prop.compile_constructor_call(v, stype, [e, e2])
+               return meth_init.compile_constructor_call(v, stype, [e, e2])
        end
-       # The constructor that must be used for the range
-       protected meth propname: Symbol is abstract
-end
-
-redef class ACrangeExpr
-       redef meth propname do return once "init".to_symbol
-end
-redef class AOrangeExpr
-       redef meth propname do return once "without_last".to_symbol
 end
 
 redef class ASuperExpr