Merge: Fix type adaptation when there is loops
[nit.git] / src / toolcontext.nit
index 5a6072c..19a78c0 100644 (file)
@@ -54,6 +54,11 @@ class Message
                return location.as(not null) < other.location.as(not null)
        end
 
+       redef fun ==(other): Bool do
+               if not other isa Message then return false
+               return location == other.location and tag == other.tag and text == other.text
+       end
+
        redef fun to_s: String
        do
                var l = location
@@ -194,16 +199,22 @@ class ToolContext
        end
 
        # Display an error
-       fun error(l: nullable Location, s: String)
+       #
+       # Return the message (to add information)
+       fun error(l: nullable Location, s: String): Message
        do
                var m = new Message(l,null,s)
+               if messages.has(m) then return m
                if l != null then l.add_message m
                messages.add m
                error_count = error_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Add an error, show errors and quit
+       #
+       # Because the program will quit, nothing is returned.
        fun fatal_error(l: nullable Location, s: String)
        do
                error(l,s)
@@ -220,16 +231,20 @@ class ToolContext
        # * They always are real issues (no false positive)
        #
        # First-level warnings are displayed by default (except if option `-q` is given).
-       fun warning(l: nullable Location, tag: String, text: String)
+       #
+       # Return the message (to add information) or null if the warning is disabled
+       fun warning(l: nullable Location, tag: String, text: String): nullable Message
        do
-               if opt_warning.value.has("no-{tag}") then return
-               if not opt_warning.value.has(tag) and opt_warn.value == 0 then return
-               if is_warning_blacklisted(l, tag) then return
+               if opt_warning.value.has("no-{tag}") then return null
+               if not opt_warning.value.has(tag) and opt_warn.value == 0 then return null
+               if is_warning_blacklisted(l, tag) then return null
                var m = new Message(l, tag, text)
+               if messages.has(m) then return null
                if l != null then l.add_message m
                messages.add m
                warning_count = warning_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Display a second-level warning.
@@ -245,16 +260,20 @@ class ToolContext
        #
        # In order to prevent warning inflation à la Java, second-level warnings are not displayed by
        # default and require an additional option `-W`.
-       fun advice(l: nullable Location, tag: String, text: String)
+       #
+       # Return the message (to add information) or null if the warning is disabled
+       fun advice(l: nullable Location, tag: String, text: String): nullable Message
        do
-               if opt_warning.value.has("no-{tag}") then return
-               if not opt_warning.value.has(tag) and opt_warn.value <= 1 then return
-               if is_warning_blacklisted(l, tag) then return
+               if opt_warning.value.has("no-{tag}") then return null
+               if not opt_warning.value.has(tag) and opt_warn.value <= 1 then return null
+               if is_warning_blacklisted(l, tag) then return null
                var m = new Message(l, tag, text)
+               if messages.has(m) then return null
                if l != null then l.add_message m
                messages.add m
                warning_count = warning_count + 1
                if opt_stop_on_first_error.value then check_errors
+               return m
        end
 
        # Display an info