nitc: handle the new `implies` operator
[nit.git] / src / syntax / icode_generation.nit
index 90f3171..6993719 100644 (file)
@@ -417,9 +417,7 @@ redef class AExternInitPropdef
                var sig = method.signature
                assert params.length == sig.arity + 1
                var rtype = sig.recv # sig.return_type
-               if rtype != null then
-                       v.add_assignment(new IRegister(rtype), v.expr(new INative(method, params), rtype))
-               end
+               v.add_assignment(new IRegister(rtype), v.expr(new INative(method, params), rtype))
 
                super
        end
@@ -693,7 +691,7 @@ redef class AAssertExpr
                if id == null then
                        v.add_abort("Assert failed")
                else
-                       v.add_abort("Assert %s  failed", id.to_s)
+                       v.add_abort("Assert '%s' failed", id.text.to_s)
                end
                v.seq = seq_old
                return null
@@ -789,6 +787,28 @@ redef class AOrExpr
        end
 end
 
+redef class AImpliesExpr
+       redef fun generate_icode(v)
+       do
+               # Prepare result
+               var reg = v.new_register(stype)
+
+               # Process left operand (in a if/then)
+               var iif = new IIf(v.generate_expr(n_expr))
+               v.stmt(iif)
+               var seq_old = v.seq
+               v.seq = iif.else_seq
+               v.add_assignment(reg, v.lit_true_reg)
+
+               # Process right operand (in the else)
+               v.seq = iif.then_seq
+               v.add_assignment(reg, v.generate_expr(n_expr2))
+
+               v.seq = seq_old
+               return reg
+       end
+end
+
 redef class AAndExpr
        redef fun generate_icode(v)
        do
@@ -939,9 +959,14 @@ redef class AStringFormExpr
        # Compute _cstring and _cstring_length using string_text
        protected fun compute_string_infos
        do
-               var len = 0
-               var str = string_text
+               var str = n_string.text
+               if str.length >= 6 and str[0] == str[1] then
+                       str = str.substring(3, str.length - 6)
+               else
+                       str = str.substring(1, str.length - 2)
+               end
                var res = new Buffer
+               var len = 0
                var i = 0
                while i < str.length do
                        var c = str[i]
@@ -952,6 +977,11 @@ redef class AStringFormExpr
                                        res.add(c)
                                end
                                c = c2
+                       else if c == '"' then
+                               res.add('\\')
+                       else if c == '\n' then
+                               res.add('\\')
+                               c = 'n'
                        end
                        len = len + 1
                        res.add(c)
@@ -1001,8 +1031,9 @@ end
 redef class AArrayExpr
        redef fun generate_icode(v)
        do
-               var recv = v.add_new_array(stype, n_exprs.length)
-               for ne in n_exprs do
+               var nes = n_exprs.n_exprs
+               var recv = v.add_new_array(stype, nes.length)
+               for ne in nes do
                        var e = v.generate_expr(ne)
                        v.add_call_array_add(recv, e)
                end
@@ -1039,12 +1070,13 @@ redef class ASuperExpr
                end
                var args = new Array[IRegister].with_capacity(arity + 1)
                args.add(v.iroutine.params[0])
-               if n_args.length != arity then
+               var nas = n_args.n_exprs
+               if nas.length != arity then
                        for i in [0..arity[ do
                                args.add(v.iroutine.params[i + 1])
                        end
                else
-                       for na in n_args do
+                       for na in nas do
                                args.add(v.generate_expr(na))
                        end
                end
@@ -1361,3 +1393,11 @@ redef class AClosureCallExpr
                return r
        end
 end
+
+redef class ADebugTypeExpr
+       redef fun generate_icode(v)
+       do
+               # Do nothing.
+               return null
+       end
+end