@@ -35,7 +35,8 @@ defmodule Kernel.ParallelCompiler do
3535 dest: Path . t ( ) ,
3636 beam_timestamp: term ( ) ,
3737 return_diagnostics: boolean ( ) ,
38- max_concurrency: pos_integer ( )
38+ max_concurrency: pos_integer ( ) ,
39+ purge_compiler_modules: boolean ( )
3940 ]
4041
4142 @ typedoc """
@@ -200,6 +201,9 @@ defmodule Kernel.ParallelCompiler do
200201 * `:profile` - if set to `:time` measure the compilation time of each compilation cycle
201202 and group pass checker
202203
204+ * `:purge_compiler_modules` - if set to `true`, automatically purge compilation modules
205+ after compilation (see `Code.purge_compiler_modules/0`)
206+
203207 * `:dest` - the destination directory for the BEAM files. When using `compile/2`,
204208 this information is only used to properly annotate the BEAM files before
205209 they are loaded into memory. If you want a file to actually be written to
@@ -338,6 +342,13 @@ defmodule Kernel.ParallelCompiler do
338342 threshold = Keyword . get ( options , :long_compilation_threshold , 10 ) * 1000
339343 timer_ref = Process . send_after ( self ( ) , :threshold_check , threshold )
340344
345+ purge_compiler_modules =
346+ if Keyword . get ( options , :purge_compiler_modules , false ) do
347+ fn -> :elixir_code_server . cast ( :purge_compiler_modules ) end
348+ else
349+ fn -> :ok end
350+ end
351+
341352 { outcome , state } =
342353 spawn_workers ( files , % { } , % { } , [ ] , % { } , [ ] , [ ] , % {
343354 beam_timestamp: Keyword . get ( options , :beam_timestamp ) ,
@@ -353,7 +364,8 @@ defmodule Kernel.ParallelCompiler do
353364 long_compilation_threshold: threshold ,
354365 schedulers: schedulers ,
355366 checker: checker ,
356- verification?: Keyword . get ( options , :verification , true )
367+ verification?: Keyword . get ( options , :verification , true ) ,
368+ purge_compiler_modules: purge_compiler_modules
357369 } )
358370
359371 Process . cancel_timer ( state . timer_ref )
@@ -570,11 +582,11 @@ defmodule Kernel.ParallelCompiler do
570582
571583 case cycle_return do
572584 { :runtime , dependent_modules , extra_warnings } ->
573- :elixir_code_server . cast ( : purge_compiler_modules)
585+ state . purge_compiler_modules . ( )
574586 verify_modules ( result , extra_warnings ++ warnings , dependent_modules , state )
575587
576588 { :compile , [ ] , extra_warnings } ->
577- :elixir_code_server . cast ( : purge_compiler_modules)
589+ state . purge_compiler_modules . ( )
578590 verify_modules ( result , extra_warnings ++ warnings , [ ] , state )
579591
580592 { :compile , more , extra_warnings } ->
@@ -879,8 +891,7 @@ defmodule Kernel.ParallelCompiler do
879891 end
880892
881893 defp return_error ( warnings , errors , state , fun ) do
882- # Also prune compiler modules in case of errors
883- :elixir_code_server . cast ( :purge_compiler_modules )
894+ state . purge_compiler_modules . ( )
884895
885896 errors =
886897 Enum . map ( errors , fn { % { file: file } = diagnostic , read_snippet } ->
0 commit comments