src: implement unary plus
authorJean Privat <jean@pryen.org>
Wed, 15 Apr 2015 05:00:13 +0000 (12:00 +0700)
committerJean Privat <jean@pryen.org>
Wed, 15 Apr 2015 05:43:58 +0000 (12:43 +0700)
Signed-off-by: Jean Privat <jean@pryen.org>

src/compiler/abstract_compiler.nit
src/interpreter/naive_interpreter.nit
src/modelize/modelize_property.nit
src/nitni/nitni_base.nit
src/semantize/typing.nit

index 90cb6a7..2359c7d 100644 (file)
@@ -2053,6 +2053,9 @@ redef class AMethPropdef
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
                                return true
+                       else if pname == "unary +" then
+                               v.ret(arguments[0])
+                               return true
                        else if pname == "*" then
                                v.ret(v.new_expr("{arguments[0]} * {arguments[1]}", ret.as(not null)))
                                return true
@@ -2164,6 +2167,9 @@ redef class AMethPropdef
                        else if pname == "unary -" then
                                v.ret(v.new_expr("-{arguments[0]}", ret.as(not null)))
                                return true
+                       else if pname == "unary +" then
+                               v.ret(arguments[0])
+                               return true
                        else if pname == "succ" then
                                v.ret(v.new_expr("{arguments[0]}+1", ret.as(not null)))
                                return true
index 3168c76..7d7cab9 100644 (file)
@@ -833,6 +833,8 @@ redef class AMethPropdef
                        var recvval = args[0].to_i
                        if pname == "unary -" then
                                return v.int_instance(-args[0].to_i)
+                       else if pname == "unary +" then
+                               return args[0]
                        else if pname == "+" then
                                return v.int_instance(args[0].to_i + args[1].to_i)
                        else if pname == "-" then
@@ -907,6 +909,8 @@ redef class AMethPropdef
                        var recv = args[0].to_f
                        if pname == "unary -" then
                                return v.float_instance(-recv)
+                       else if pname == "unary +" then
+                               return args[0]
                        else if pname == "+" then
                                return v.float_instance(recv + args[1].to_f)
                        else if pname == "-" then
index 26b2f05..9cc9580 100644 (file)
@@ -790,6 +790,9 @@ redef class AMethPropdef
                        name = amethodid.collect_text
                        name_node = amethodid
 
+                       if name == "+" and self.n_signature.n_params.length == 0 then
+                               name = "unary +"
+                       end
                        if name == "-" and self.n_signature.n_params.length == 0 then
                                name = "unary -"
                        end
index 6685029..5e3b7a6 100644 (file)
@@ -31,6 +31,7 @@ redef class MMethod
                if nit_name == "+" then return "_plus"
                if nit_name == "-" then return "_minus"
                if nit_name == "unary -" then return "_unary_minus"
+               if nit_name == "unary +" then return "_unary_plus"
                if nit_name == "*" then return "_star"
                if nit_name == "/" then return "_slash"
                if nit_name == "%" then return "_percent"
index e7a5a09..b940c28 100644 (file)
@@ -1638,6 +1638,11 @@ redef class APercentExpr
        redef fun property_name do return "%"
 end
 
+redef class AUplusExpr
+       redef fun property_name do return "unary +"
+       redef fun compute_raw_arguments do return new Array[AExpr]
+end
+
 redef class AUminusExpr
        redef fun property_name do return "unary -"
        redef fun compute_raw_arguments do return new Array[AExpr]