model: infer the types of attributes with unary - and once
authorAlexis Laferrière <alexis.laf@xymus.net>
Thu, 15 Feb 2018 16:18:45 +0000 (11:18 -0500)
committerAlexis Laferrière <alexis.laf@xymus.net>
Thu, 15 Feb 2018 18:28:09 +0000 (13:28 -0500)
Signed-off-by: Alexis Laferrière <alexis.laf@xymus.net>

src/modelize/modelize_property.nit

index 4db4790..2ae2b59 100644 (file)
@@ -1510,6 +1510,14 @@ redef class AAttrPropdef
                        end
 
                        mtype = mmodule.array_type(item_mtypes.first)
+               else if nexpr isa AUminusExpr and (nexpr.n_expr isa AIntegerExpr or nexpr.n_expr isa AFloatExpr) then
+                       # The Int and Float unary - is defined in `kernel`, so this may
+                       # result in an invalid behavior when using a custom kernel.
+                       # A workaround is to declare the attribute static type.
+                       # This is still very useful, especially to novice programmers.
+                       mtype = infer_static_type(modelbuilder, nexpr.n_expr, mclassdef, mmodule, mreadpropdef)
+               else if nexpr isa AOnceExpr then
+                       mtype = infer_static_type(modelbuilder, nexpr.n_expr, mclassdef, mmodule, mreadpropdef)
                else
                        modelbuilder.error(self, "Error: untyped attribute `{mreadpropdef}`. Implicit typing allowed only for literals and new.")
                end