Skip to content

Commit 28b1a9e

Browse files
committed
return better error messages when module cannot be interpreted
1 parent 6ddb79c commit 28b1a9e

File tree

1 file changed

+50
-18
lines changed
  • apps/elixir_ls_debugger/lib/debugger

1 file changed

+50
-18
lines changed

apps/elixir_ls_debugger/lib/debugger/server.ex

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -641,8 +641,7 @@ defmodule ElixirLS.Debugger.Server do
641641
case current[{m, f, a}] do
642642
nil ->
643643
case interpret(m, false) do
644-
{:module, _} ->
645-
ModuleInfoCache.store(m)
644+
:ok ->
646645
breaks_before = :int.all_breaks(m)
647646

648647
Output.debugger_console(
@@ -663,8 +662,15 @@ defmodule ElixirLS.Debugger.Server do
663662
{:error, "Function #{inspect(m)}.#{f}/#{a} not found"}
664663
end
665664

666-
:error ->
665+
{:error, :cannot_interpret} ->
667666
{:error, "Cannot interpret module #{inspect(m)}"}
667+
668+
{:error, :cannot_load} ->
669+
{:error, "Module #{inspect(m)} cannot be loaded"}
670+
671+
{:error, :excluded} ->
672+
{:error,
673+
"Module #{inspect(m)} is used internally by the debugger and cannot be interpreted"}
668674
end
669675

670676
lines ->
@@ -1585,8 +1591,7 @@ defmodule ElixirLS.Debugger.Server do
15851591
defp save_and_reload(module, beam_bin) do
15861592
:ok = File.write(Path.join(@temp_beam_dir, to_string(module) <> ".beam"), beam_bin)
15871593
true = :code.delete(module)
1588-
{:module, _} = interpret(module)
1589-
ModuleInfoCache.store(module)
1594+
:ok = interpret(module)
15901595
end
15911596

15921597
defp set_breakpoints(path, lines) do
@@ -1637,18 +1642,28 @@ defmodule ElixirLS.Debugger.Server do
16371642
modules_with_breakpoints =
16381643
Enum.reduce(modules, [], fn module, added ->
16391644
case interpret(module, false) do
1640-
{:module, _} ->
1641-
ModuleInfoCache.store(module)
1645+
:ok ->
16421646
Output.debugger_console("Setting breakpoint in #{inspect(module)} #{path}:#{line}")
16431647
# no need to handle errors here, it can fail only with {:error, :break_exists}
16441648
:int.break(module, line)
16451649
update_break_condition(module, line, condition, log_message, hit_count)
16461650

16471651
[module | added]
16481652

1649-
:error ->
1653+
{:error, :cannot_interpret} ->
16501654
Output.debugger_console("Could not interpret module #{inspect(module)} in #{path}")
16511655
added
1656+
1657+
{:error, :cannot_load} ->
1658+
Output.debugger_console("Module #{inspect(module)} in #{path} cannot be loaded")
1659+
added
1660+
1661+
{:error, :excluded} ->
1662+
Output.debugger_console(
1663+
"Module #{inspect(module)} in #{path} is used internally by the debugger and cannot be interpreted"
1664+
)
1665+
1666+
added
16521667
end
16531668
end)
16541669

@@ -1671,18 +1686,26 @@ defmodule ElixirLS.Debugger.Server do
16711686
end
16721687

16731688
defp interpret_module(mod) do
1674-
try do
1675-
case interpret(mod) do
1676-
{:module, _} -> :ok
1677-
{:error, :excluded} -> :ok
1678-
end
1679-
catch
1680-
_kind, _error ->
1689+
case interpret(mod) do
1690+
:ok ->
1691+
:ok
1692+
1693+
{:error, :cannot_interpret} ->
16811694
Output.debugger_important(
16821695
"Module #{inspect(mod)} cannot be interpreted. Consider adding it to `excludeModules`."
16831696
)
1684-
after
1685-
ModuleInfoCache.store(mod)
1697+
1698+
:ok
1699+
1700+
{:error, :excluded} ->
1701+
:ok
1702+
1703+
{:error, :cannot_load} ->
1704+
Output.debugger_important(
1705+
"Module #{inspect(mod)} cannot be loaded. Consider adding it to `excludeModules`."
1706+
)
1707+
1708+
:ok
16861709
end
16871710
end
16881711

@@ -1878,7 +1901,16 @@ defmodule ElixirLS.Debugger.Server do
18781901
Output.debugger_console("Interpreting module #{inspect(module)}")
18791902
end
18801903

1881-
:int.ni(module)
1904+
case :int.ni(module) do
1905+
:error ->
1906+
{:error, :cannot_interpret}
1907+
1908+
{:module, _} ->
1909+
# calling module_info when paused on a breakpoint can deadlock the debugger
1910+
# cache it for each interpreted module
1911+
ModuleInfoCache.store(module)
1912+
:ok
1913+
end
18821914
end
18831915
else
18841916
{:error, :cannot_load}

0 commit comments

Comments
 (0)