On vscode, I’ve noticed that ElixirLS navigation and hover only work when I call modules directly, but break as soon as I switch to a dynamic lookup via Application.get_env/3.
Direct calls (works)
defmodule TaskProcessor.Events do
alias TaskProcessor.Segments
alias TaskProcessor.Events.Queue.Oban, as: EventsQueue
alias TaskProcessor.Events.Persistance.Ecto, as: Repo
def enqueue_create_event(event_id) when is_integer(event_id) and event_id > 0 do
EventsQueue.enqueue_create_event(event_id)
end
def enqueue_create_event(bad_event_id), do: {:error, {:invalid_event_id, bad_event_id}}
def process_event(%{event_id: id, isCreated: true}) do
case Repo.fetch_with_segments(id) do
:not_found -> {:error, :not_found}
{:ok, %{date: date, segments: segs}} ->
Segments.schedule_segments(segs, id, date)
end
end
end
- Cmd+Click on EventsQueue.enqueue_create_event/1 or Repo.fetch_with_segments/1 jumps to the implementation.
- Hover shows the function signature.
Dynamic calls (Not working, or am i not doing right ?)
defmodule TaskProcessor.Events.Impl do
@behaviour TaskProcessor.Events.Behavior
alias TaskProcessor.Segments
@impl true
@spec enqueue_create_event(any()) :: {:ok, Oban.Job.t()} | {:error, any()}
def enqueue_create_event(event_id) when is_integer(event_id) and event_id > 0 do
queue_impl().enqueue_create_event(event_id)
end
def enqueue_create_event(bad_event_id), do: {:error, {:invalid_event_id, bad_event_id}}
@impl true
def process_event(%{event_id: id, isCreated: true}) do
case repo_impl().fetch_with_segments(id) do
:not_found -> {:error, :not_found}
{:ok, %{date: date, segments: segs}} ->
Segments.schedule_segments(segs, id, date)
end
end
defp queue_impl do
Application.get_env(:task_processor, :events_queue, TaskProcessor.Events.Queue.Oban)
end
defp repo_impl do
Application.get_env(:task_processor, :events_repo, TaskProcessor.Events.Persistance.Ecto)
end
end
- Cmd+Click on queue_impl().enqueue_create_event/1 or repo_impl().fetch_with_segments/1 does nothing.
- Hovering shows nothing.
Environment
- ElixirLS version: 0.28.0
- Elixir version: 1.18.4
- Erlang/OTP version: 28
- Macbook M1
Is there any way to configure ElixirLS (or leverage Dialyzer/Elixir compiler hints) so that go-to-definition and hover info work for modules resolved at runtime via Application.get_env/3? I need this functionality so that I can dynamically inject mocks during tests using the Mox library.
Thank you!