modelize_property: invalidate information to avoid causing cascaded errors
authorJean Privat <jean@pryen.org>
Fri, 3 Apr 2015 05:54:46 +0000 (12:54 +0700)
committerJean Privat <jean@pryen.org>
Fri, 3 Apr 2015 06:09:35 +0000 (13:09 +0700)
Signed-off-by: Jean Privat <jean@pryen.org>

src/modelize/modelize_property.nit

index d2625cd..76b2d1e 100644 (file)
@@ -297,6 +297,7 @@ redef class ModelBuilder
                                        for p in spd.initializers do
                                                if p != longest.initializers[i] then
                                                        self.error(nclassdef, "Error: conflict for inherited inits {spd}({spd.initializers.join(", ")}) and {longest}({longest.initializers.join(", ")})")
                                        for p in spd.initializers do
                                                if p != longest.initializers[i] then
                                                        self.error(nclassdef, "Error: conflict for inherited inits {spd}({spd.initializers.join(", ")}) and {longest}({longest.initializers.join(", ")})")
+                                                       # TODO: invalidate the initializer to avoid more errors
                                                        return
                                                end
                                                i += 1
                                                        return
                                                end
                                                i += 1
@@ -891,6 +892,7 @@ redef class AMethPropdef
                        var ret_type = mysignature.return_mtype
                        if ret_type != null and precursor_ret_type == null then
                                modelbuilder.error(nsig.n_type.as(not null), "Redef Error: {mpropdef.mproperty} is a procedure, not a function.")
                        var ret_type = mysignature.return_mtype
                        if ret_type != null and precursor_ret_type == null then
                                modelbuilder.error(nsig.n_type.as(not null), "Redef Error: {mpropdef.mproperty} is a procedure, not a function.")
+                               self.mpropdef.msignature = null
                                return
                        end
 
                                return
                        end
 
@@ -902,6 +904,7 @@ redef class AMethPropdef
                                        var node = nsig.n_params[i]
                                        if not modelbuilder.check_sametype(node, mmodule, mclassdef.bound_mtype, myt, prt) then
                                                modelbuilder.error(node, "Redef Error: Wrong type for parameter `{mysignature.mparameters[i].name}'. found {myt}, expected {prt} as in {mpropdef.mproperty.intro}.")
                                        var node = nsig.n_params[i]
                                        if not modelbuilder.check_sametype(node, mmodule, mclassdef.bound_mtype, myt, prt) then
                                                modelbuilder.error(node, "Redef Error: Wrong type for parameter `{mysignature.mparameters[i].name}'. found {myt}, expected {prt} as in {mpropdef.mproperty.intro}.")
+                                               self.mpropdef.msignature = null
                                        end
                                end
                        end
                                        end
                                end
                        end
@@ -914,6 +917,7 @@ redef class AMethPropdef
                                        ret_type = precursor_ret_type
                                else if not modelbuilder.check_subtype(node, mmodule, mclassdef.bound_mtype, ret_type, precursor_ret_type) then
                                        modelbuilder.error(node, "Redef Error: Wrong return type. found {ret_type}, expected {precursor_ret_type} as in {mpropdef.mproperty.intro}.")
                                        ret_type = precursor_ret_type
                                else if not modelbuilder.check_subtype(node, mmodule, mclassdef.bound_mtype, ret_type, precursor_ret_type) then
                                        modelbuilder.error(node, "Redef Error: Wrong return type. found {ret_type}, expected {precursor_ret_type} as in {mpropdef.mproperty.intro}.")
+                                       self.mpropdef.msignature = null
                                end
                        end
                end
                                end
                        end
                end
@@ -1029,6 +1033,7 @@ redef class AAttrPropdef
                                else if atautoinit != null then
                                        modelbuilder.error(atautoinit, "Error: a autoinit attribute needs a value")
                                end
                                else if atautoinit != null then
                                        modelbuilder.error(atautoinit, "Error: a autoinit attribute needs a value")
                                end
+                               has_value = true
                                return
                        end
                        is_lazy = true
                                return
                        end
                        is_lazy = true