Skip to content

Commit 0ae4bfb

Browse files
committed
Preserve diagnostics based on source field, closes #13142
1 parent 7db4413 commit 0ae4bfb

File tree

1 file changed

+13
-28
lines changed

1 file changed

+13
-28
lines changed

lib/mix/lib/mix/compilers/elixir.ex

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
defmodule Mix.Compilers.Elixir do
22
@moduledoc false
33

4-
@manifest_vsn 22
4+
@manifest_vsn 23
55
@checkpoint_vsn 2
66

77
import Record
@@ -171,15 +171,17 @@ defmodule Mix.Compilers.Elixir do
171171
state = {%{}, exports, sources, [], modules, removed_modules}
172172
compiler_loop(stale, stale_modules, dest, timestamp, opts, state)
173173
else
174-
{:ok, info, state} ->
174+
{:ok, %{runtime_warnings: runtime_warnings, compile_warnings: compile_warnings}, state} ->
175175
{modules, _exports, sources, _changed, pending_modules, _stale_exports} = state
176176

177177
previous_warnings =
178178
if Keyword.get(opts, :all_warnings, true),
179179
do: previous_warnings(sources, true),
180180
else: []
181181

182-
sources = apply_warnings(sources, info)
182+
runtime_warnings = Enum.map(runtime_warnings, &diagnostic/1)
183+
compile_warnings = Enum.map(compile_warnings, &diagnostic/1)
184+
sources = apply_warnings(sources, runtime_warnings, compile_warnings)
183185

184186
write_manifest(
185187
manifest,
@@ -193,8 +195,7 @@ defmodule Mix.Compilers.Elixir do
193195
)
194196

195197
put_compile_env(sources)
196-
info_warnings = info.runtime_warnings ++ info.compile_warnings
197-
all_warnings = previous_warnings ++ Enum.map(info_warnings, &diagnostic/1)
198+
all_warnings = previous_warnings ++ runtime_warnings ++ compile_warnings
198199
unless_previous_warnings_as_errors(previous_warnings, opts, {:ok, all_warnings})
199200

200201
{:error, errors, %{runtime_warnings: r_warnings, compile_warnings: c_warnings}, state} ->
@@ -717,25 +718,9 @@ defmodule Mix.Compilers.Elixir do
717718
end
718719

719720
defp previous_warnings(sources, print?) do
720-
for {source,
721-
source(
722-
compile_warnings: compile_warnings,
723-
runtime_warnings: runtime_warnings
724-
)} <- sources,
725-
file = Path.absname(source),
726-
{position, message, span} <- compile_warnings ++ runtime_warnings do
727-
# TODO: Store the whole diagnostic
728-
diagnostic = %Mix.Task.Compiler.Diagnostic{
729-
severity: :warning,
730-
file: file,
731-
source: file,
732-
position: position,
733-
message: message,
734-
compiler_name: "Elixir",
735-
stacktrace: [],
736-
span: span
737-
}
738-
721+
for {_, source(compile_warnings: compile_warnings, runtime_warnings: runtime_warnings)} <-
722+
sources,
723+
diagnostic <- compile_warnings ++ runtime_warnings do
739724
if print? do
740725
Mix.shell().print_app()
741726
Code.print_diagnostic(diagnostic)
@@ -745,13 +730,13 @@ defmodule Mix.Compilers.Elixir do
745730
end
746731
end
747732

748-
defp apply_warnings(sources, %{runtime_warnings: [], compile_warnings: []}) do
733+
defp apply_warnings(sources, [], []) do
749734
sources
750735
end
751736

752-
defp apply_warnings(sources, %{runtime_warnings: r_warnings, compile_warnings: c_warnings}) do
753-
runtime_group = Enum.group_by(r_warnings, & &1.file, &{&1.position, &1.message, &1.span})
754-
compile_group = Enum.group_by(c_warnings, & &1.file, &{&1.position, &1.message, &1.span})
737+
defp apply_warnings(sources, runtime_warnings, compile_warnings) do
738+
runtime_group = Enum.group_by(runtime_warnings, & &1.source)
739+
compile_group = Enum.group_by(compile_warnings, & &1.source)
755740

756741
for {source_path, source_entry} <- sources, into: %{} do
757742
key = Path.absname(source_path)

0 commit comments

Comments
 (0)