elixir-lsp / elixir-lsp/vscode-elixir-ls

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

Open
#489 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
599
Forks
108
PR merge metrics
No merged PRs in 30d

Description

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!

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.