Skip to content

Go-to-definition & hover lost when using dynamic module calls via Application.get_env/3 #489

@Ruhshan

Description

@Ruhshan

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.
  • Hover 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!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions