Failed to jump to definition of some Elixir built in modules by elixir-ls

Hi, I’m a new programmer of Elixir. I got a problem when using coc-elixir and elixir-ls.

While I can go to definition of all libs installed by mix, I can’t do that for modules implemented by Elixir. For example, I can go to modules of Ecto, Finch, Redix, but I can’t go to GenServer, Supervisor, Application, Keyword, Enum and Map.

Here is :gen_server.module_info. It’s strange that the source is ‘/buildroot/otp/lib/stdlib/src/gen_server.erl’, which I never have this path on my own computer.

I tried installing Elixir by homebrew or asdf. I also compiled an Elixir from the source code. The source has not changed.

iex(1)> :gen_server.module_info
[
  module: :gen_server,
  exports: [
    start: 3,
    start: 4,
    start_monitor: 3,
    start_monitor: 4,
    stop: 1,
    stop: 3,
    call: 2,
    send_request: 2,
    wait_response: 2,
    receive_response: 2,
    check_response: 2,
    abcast: 2,
    abcast: 3,
    multi_call: 2,
    multi_call: 3,
    multi_call: 4,
    enter_loop: 3,
    enter_loop: 4,
    enter_loop: 5,
    init_it: 6,
    wake_hib: 6,
    system_continue: 3,
    system_terminate: 4,
    system_code_change: 4,
    system_get_state: 1,
    system_replace_state: 2,
    format_status: 2,
    behaviour_info: 1,
    module_info: 0,
    module_info: 1,
    reply: 2,
    cast: 2,
    start_link: 4,
    start_link: 3,
    call: 3,
    format_log: 2,
    format_log: 1
  ],
  attributes: [vsn: [235044865929631859612519860561431147861]],
  compile: [
    version: '8.0.2',
    options: [
      :debug_info,
      {:d, :USE_ESOCK, true},
      {:i, '/buildroot/otp/lib/stdlib/src/../include'},
      {:i, '/buildroot/otp/lib/stdlib/src/../../kernel/include'}
    ],
    source: '/buildroot/otp/lib/stdlib/src/gen_server.erl'
  ],
  md5: <<176, 211, 254, 155, 70, 221, 37, 113, 151, 64, 207, 131, 77, 198, 181,
    85>>
]

I believe this only works if you have compiled elixir yourself. Or else, there is literally no source code for it to jump to.

2 Likes

I tried using a self-compiled Elixir. The go to definition functionality worked!

Although the compile.source of :gen_server.module_info does not change, I must misunderstand how elixir-ls find a definition.

For some beginners who might run into the same problem as me. Don’t forget to run mix clean and rerun mix compile after you installed a new self-compiled Elixir.

1 Like