Skip to content

Commit 1f7ddd7

Browse files
committed
Convert verification errors into diagnostics, closes #14768
1 parent 7477c93 commit 1f7ddd7

File tree

2 files changed

+36
-1
lines changed

2 files changed

+36
-1
lines changed

lib/elixir/lib/module/parallel_checker.ex

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,21 @@ defmodule Module.ParallelChecker do
283283
|> emit_warnings(file, log?)
284284

285285
Enum.each(after_verify, fn {verify_mod, verify_fun} ->
286-
apply(verify_mod, verify_fun, [module])
286+
try do
287+
apply(verify_mod, verify_fun, [module])
288+
catch
289+
# We need to catch exceptions because files have already been written to disk,
290+
# so we need to convert verification errors into diagnostics by using IO.warn.
291+
kind, reason ->
292+
IO.warn(
293+
"exception happened while verifying module #{inspect(module)}\n\n" <>
294+
Exception.format(kind, reason, __STACKTRACE__),
295+
file: file,
296+
line: line,
297+
module: verify_mod,
298+
function: {verify_fun, 1}
299+
)
300+
end
287301
end)
288302

289303
diagnostics

lib/elixir/test/elixir/module/types/integration_test.exs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1225,6 +1225,27 @@ defmodule Module.Types.IntegrationTest do
12251225

12261226
assert_warnings(files, warning)
12271227
end
1228+
1229+
test "converts errors into diagnostics" do
1230+
files = %{
1231+
"a.ex" => """
1232+
defmodule A do
1233+
@after_verify __MODULE__
1234+
1235+
def __after_verify__(__MODULE__) do
1236+
raise "oops"
1237+
end
1238+
end
1239+
"""
1240+
}
1241+
1242+
warning = [
1243+
"warning: exception happened while verifying module A",
1244+
"** (RuntimeError) oops"
1245+
]
1246+
1247+
assert_warnings(files, warning)
1248+
end
12281249
end
12291250

12301251
describe "deprecated" do

0 commit comments

Comments
 (0)