@@ -120,14 +120,14 @@ defmodule Module.ParallelChecker do
120120 # Set the compiler info so we can collect warnings
121121 :erlang . put ( :elixir_compiler_info , { pid , self ( ) } )
122122
123- warnings =
123+ { warnings , errors } =
124124 if module_tuple do
125125 check_module ( module_tuple , { checker , table } , log? )
126126 else
127- [ ]
127+ { [ ] , [ ] }
128128 end
129129
130- send ( pid , { __MODULE__ , module , warnings } )
130+ send ( pid , { __MODULE__ , module , warnings , errors } )
131131 send ( checker , { __MODULE__ , :done , module } )
132132 end
133133
@@ -194,29 +194,34 @@ defmodule Module.ParallelChecker do
194194 end
195195
196196 count = :gen_server . call ( checker , :start , :infinity )
197- diagnostics = collect_results ( count , [ ] )
197+ { warnings , errors } = collect_results ( count , [ ] , [ ] )
198198
199199 case :erlang . get ( :elixir_code_diagnostics ) do
200200 :undefined -> :ok
201- { tail , log? } -> :erlang . put ( :elixir_code_diagnostics , { diagnostics ++ tail , log? } )
201+ { tail , log? } -> :erlang . put ( :elixir_code_diagnostics , { errors ++ warnings ++ tail , log? } )
202202 end
203203
204- diagnostics
204+ { warnings , errors }
205205 end
206206
207- defp collect_results ( 0 , diagnostics ) do
208- diagnostics
207+ defp collect_results ( 0 , warnings , errors ) do
208+ { warnings , errors }
209209 end
210210
211- defp collect_results ( count , diagnostics ) do
211+ defp collect_results ( count , warnings , errors ) do
212212 receive do
213213 { :diagnostic , % { file: file } = diagnostic , read_snippet } ->
214214 :elixir_errors . print_diagnostic ( diagnostic , read_snippet )
215215 diagnostic = % { diagnostic | file: file && Path . absname ( file ) }
216- collect_results ( count , [ diagnostic | diagnostics ] )
217216
218- { __MODULE__ , _module , new_diagnostics } ->
219- collect_results ( count - 1 , new_diagnostics ++ diagnostics )
217+ if Map . get ( diagnostic , :severity , :warning ) == :error do
218+ collect_results ( count , warnings , [ diagnostic | errors ] )
219+ else
220+ collect_results ( count , [ diagnostic | warnings ] , errors )
221+ end
222+
223+ { __MODULE__ , _module , new_warnings , new_errors } ->
224+ collect_results ( count - 1 , new_warnings ++ warnings , new_errors ++ errors )
220225 end
221226 end
222227
@@ -270,18 +275,19 @@ defmodule Module.ParallelChecker do
270275 definitions
271276 )
272277
273- diagnostics =
278+ { warnings , errors } =
274279 module
275280 |> Module.Types . warnings ( file , attrs , definitions , no_warn_undefined , cache )
276281 |> Kernel . ++ ( behaviour_warnings )
277- |> group_warnings ( )
278- |> emit_warnings ( file , log? )
282+ |> group_diagnostics ( )
283+ |> emit_diagnostics ( file , log? )
284+ |> Enum . split_with ( & ( & 1 . severity == :warning ) )
279285
280286 Enum . each ( after_verify , fn { verify_mod , verify_fun } ->
281287 apply ( verify_mod , verify_fun , [ module ] )
282288 end )
283289
284- diagnostics
290+ { warnings , errors }
285291 end
286292
287293 defp module_map_to_module_tuple ( module_map ) do
@@ -332,16 +338,16 @@ defmodule Module.ParallelChecker do
332338
333339 ## Warning helpers
334340
335- defp group_warnings ( warnings ) do
341+ defp group_diagnostics ( triplets ) do
336342 { ungrouped , grouped } =
337- Enum . reduce ( warnings , { [ ] , % { } } , fn { module , warning , location } , { ungrouped , grouped } ->
338- % { message: _ } = diagnostic = module . format_diagnostic ( warning )
343+ Enum . reduce ( triplets , { [ ] , % { } } , fn { module , term , location } , { ungrouped , grouped } ->
344+ % { message: _ } = diagnostic = module . format_diagnostic ( term )
339345
340346 if Map . get ( diagnostic , :group , false ) do
341347 locations = MapSet . new ( [ location ] )
342348
343349 grouped =
344- Map . update ( grouped , warning , { locations , diagnostic } , fn
350+ Map . update ( grouped , term , { locations , diagnostic } , fn
345351 { locations , diagnostic } -> { MapSet . put ( locations , location ) , diagnostic }
346352 end )
347353
@@ -359,7 +365,7 @@ defmodule Module.ParallelChecker do
359365 Enum . sort ( ungrouped ++ grouped )
360366 end
361367
362- defp emit_warnings ( warnings , file , log? ) do
368+ defp emit_diagnostics ( warnings , file , log? ) do
363369 Enum . flat_map ( warnings , fn { locations , diagnostic } ->
364370 diagnostics = Enum . map ( locations , & to_diagnostic ( diagnostic , file , & 1 ) )
365371 log? and print_diagnostics ( diagnostics )
0 commit comments