X-Git-Url: http://nitlanguage.org diff --git a/src/modelize/modelize_property.nit b/src/modelize/modelize_property.nit index 4db4790..c8a7f3b 100644 --- a/src/modelize/modelize_property.nit +++ b/src/modelize/modelize_property.nit @@ -1463,9 +1463,7 @@ redef class AAttrPropdef if cla != null then mtype = cla.mclass_type else if nexpr isa ACharExpr then var cla: nullable MClass - if nexpr.is_ascii then - cla = modelbuilder.try_get_mclass_by_name(nexpr, mmodule, "Byte") - else if nexpr.is_code_point then + if nexpr.is_code_point then cla = modelbuilder.try_get_mclass_by_name(nexpr, mmodule, "Int") else cla = modelbuilder.try_get_mclass_by_name(nexpr, mmodule, "Char") @@ -1510,6 +1508,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