@@ -268,9 +268,39 @@ defmodule Mix.Task.Compiler do
268268 end )
269269 end
270270
271- # Normalize the compiler result to a diagnostic tuple.
272- @ doc false
273- def normalize ( result , name ) do
271+ @ doc """
272+ Runs the given list of compilers with the given arguments.
273+
274+ It returns a `{status, diagnostics}` tuple. If a compiler
275+ errors, following compilers do not run.
276+ """
277+ @ doc since: "1.19.0"
278+ def run ( compilers , args ) do
279+ run ( compilers , args , :noop , [ ] )
280+ end
281+
282+ defp run ( [ ] , _ , status , diagnostics ) do
283+ { status , diagnostics }
284+ end
285+
286+ defp run ( [ compiler | rest ] , args , status , diagnostics ) do
287+ { new_status , new_diagnostics } = run_compiler ( compiler , args )
288+ diagnostics = diagnostics ++ new_diagnostics
289+
290+ case new_status do
291+ :error -> { :error , diagnostics }
292+ :ok -> run ( rest , args , :ok , diagnostics )
293+ :noop -> run ( rest , args , status , diagnostics )
294+ end
295+ end
296+
297+ defp run_compiler ( compiler , args ) do
298+ result = normalize ( Mix.Task . run ( "compile.#{ compiler } " , args ) , compiler )
299+ Enum . reduce ( Mix.ProjectStack . pop_after_compiler ( compiler ) , result , & & 1 . ( & 2 ) )
300+ end
301+
302+ # Normalize the compiler result to a diagnostic tuple
303+ defp normalize ( result , name ) do
274304 case result do
275305 { status , diagnostics } when status in [ :ok , :noop , :error ] and is_list ( diagnostics ) ->
276306 { status , diagnostics }
@@ -328,10 +358,10 @@ defmodule Mix.Task.Compiler do
328358 re-enables `"compile"` and `"compile.all"`.
329359 """
330360 @ doc since: "1.19.0"
331- @ spec reenable ( compilers: compilers ) :: :ok when compilers: :all | [ atom ( ) ]
332- def reenable ( opts \\ [ ] ) do
361+ @ spec reenable ( compilers ) :: :ok when compilers: :all | [ atom ( ) ]
362+ def reenable ( compilers \\ :all ) do
333363 compilers =
334- case Keyword . get ( opts , : compilers, :all ) do
364+ case compilers do
335365 :all -> Mix.Task.Compiler . compilers ( )
336366 list when is_list ( list ) -> list
337367 end
0 commit comments