toolcontext: call only `errors_info` once at the end
[nit.git] / src / toolcontext.nit
index a5b7ceb..92a4824 100644 (file)
@@ -102,6 +102,9 @@ class ToolContext
        # Directory where to generate log files
        var log_directory: String = "logs"
 
+       # Stream in `log_directory` where all info messages are written
+       var log_info: nullable Writer = null
+
        # Messages
        private var messages = new Array[Message]
        private var message_sorter: Comparator = default_comparator
@@ -131,13 +134,13 @@ class ToolContext
                return tags.has("all") or tags.has(tag)
        end
 
-       # Output all current stacked messages and display total error informations
+       # Output all current stacked messages
        #
        # Return true if no errors occurred.
        #
        # If some errors occurred, the behavior depends on the value of `keep_going`.
-       # If `keep_going` is false, then the program exits.
-       # Else, the error count and the warning count are reset and false is returned.
+       # If `keep_going` is false, then the total error informations is displayed and the program exits.
+       # Else, false is returned.
        fun check_errors: Bool
        do
                if messages.length > 0 then
@@ -155,21 +158,21 @@ class ToolContext
                end
 
                if error_count > 0 then
-                       errors_info
-                       if not keep_going then exit(1)
+                       if not keep_going then
+                               errors_info
+                               exit(1)
+                       end
                        return false
                end
                return true
        end
 
-       # Display (and reset) total error informations
+       # Display total error informations
        fun errors_info
        do
                if error_count == 0 and warning_count == 0 then return
                if opt_no_color.value then return
                sys.stderr.write "Errors: {error_count}. Warnings: {warning_count}.\n"
-               error_count = 0
-               warning_count = 0
        end
 
        # Display an error
@@ -236,6 +239,10 @@ class ToolContext
                if level <= verbose_level then
                        print "{s}"
                end
+               if log_info != null then
+                       log_info.write s
+                       log_info.write "\n"
+               end
        end
 
        # Executes a program while checking if it's available and if the execution ended correctly
@@ -429,8 +436,10 @@ The Nit language documentation and the source code of its tools and libraries ma
                if opt_log.value then
                        # Make sure the output directory exists
                        log_directory.mkdir
-               end
 
+                       # Redirect the verbose messages
+                       log_info = (log_directory/"info.txt").to_path.open_wo
+               end
        end
 
        # Get the current `nit_version` or "DUMMY_VERSION" if `--set-dummy-tool` is set.