Can't go to definition of symbols in other modules
Closed this issue · 2 comments
Hi! I noticed that I couldn't go to the definition of other modules. Checking the log I found two interesting errors:
[Warning] error: module MacroA is not loaded and could not be found
└─ nofile: Bug (module)
and
Elixir sources not found (checking in /build/elixir/src/elixir-1.17.3). Code navigation to Elixir modules disabled.
Here's the full log:
Click to expand
[Info] Started ElixirLS v0.22.0
[Info] Running in /home/melker/code/elixir-ls-go-to-definition-bug
[Info] ElixirLS built with elixir "1.17.3" on OTP "27"
[Info] Running on elixir "1.17.3 (compiled with Erlang/OTP 27)" on OTP "27"
[Info] Protocols are not consolidated
[Info] Elixir sources not found (checking in /build/elixir/src/elixir-1.17.3). Code navigation to Elixir modules disabled.
[Info] Received client configuration via workspace/configuration
%{"dialyzerEnabled" => true, "enableTestLenses" => false, "fetchDeps" => false, "suggestSpecs" => false}
[Info] Client does not support workspace/didChangeConfiguration dynamic registration
[Info] Client does not support workspace/didChangeWatchedFiles dynamic registration
[Info] Received workspace/didChangeConfiguration
[Info] Received client configuration via workspace/didChangeConfiguration
%{"dialyzerEnabled" => true, "enableTestLenses" => false, "fetchDeps" => false, "suggestSpecs" => false}
[Info] Starting build with MIX_ENV: test MIX_TARGET: host
[Info] Loaded DETS databases in 23ms
[Warning] error: module MacroA is not loaded and could not be found
└─ nofile: Bug (module)
[Info] Loaded DETS databases in 1ms
[Warning] ** (ErlangError) Erlang error: "CompileError during metadata build pre:\nnofile: cannot compile file (errors have been logged)\nast node: {:use, [end_of_expression: [newlines: 2, line: 2, column: 13], line: 2, column: 3], [{:__aliases__, [last: [line: 2, column: 7], line: 2, column: 7], [:MacroA]}]}"
(elixir 1.17.3) src/elixir_expand.erl:102: :elixir_expand.expand/3
(elixir 1.17.3) src/elixir_expand.erl:579: :elixir_expand.expand_block/5
(elixir 1.17.3) src/elixir_expand.erl:46: :elixir_expand.expand/3
(elixir 1.17.3) src/elixir.erl:455: :elixir.quoted_to_erl/4
(elixir 1.17.3) src/elixir.erl:332: :elixir.eval_forms/4
(elixir 1.17.3) lib/module/parallel_checker.ex:112: Module.ParallelChecker.verify/1
(elixir 1.17.3) lib/code.ex:572: Code.validated_eval_string/3
(elixir_sense 2.0.0) lib/elixir_sense/core/macro_expander.ex:24: ElixirSense.Core.MacroExpander.require_and_expand/2
(elixir 1.17.3) lib/macro.ex:639: anonymous fn/4 in Macro.do_traverse_args/4
(stdlib 6.0.1) lists.erl:2343: :lists.mapfoldl_1/3
(elixir 1.17.3) lib/macro.ex:604: Macro.do_traverse/4
(stdlib 6.0.1) lists.erl:2343: :lists.mapfoldl_1/3
(elixir 1.17.3) lib/macro.ex:604: Macro.do_traverse/4
(elixir_sense 2.0.0) lib/elixir_sense/core/macro_expander.ex:18: ElixirSense.Core.MacroExpander.expand_use/4
(elixir_sense 2.0.0) lib/elixir_sense/core/state.ex:1690: ElixirSense.Core.State.expand/3
[Log] Compiling 3 files (.ex)
[Log] Generated bug app
[Info] Compile took 107 milliseconds
[Info] Starting build with MIX_ENV: test MIX_TARGET: host
[Info] [ElixirLS WorkspaceSymbols] Indexing...
[Info] [ElixirLS WorkspaceSymbols] Module discovery complete
[Info] [ElixirLS WorkspaceSymbols] 0 symbols added to index in 0ms
[Info] Compile took 58 milliseconds
[Info] Updating incremental PLT
[Info] Incremental PLT updated in 1273ms, changed 0 modules, analyzed 0, 0 warnings found
[Info] Loaded PLT info in 1377ms
[Info] Dialyzer analysis is up to date
I created an issue in the Neovim wrapper plugin that I'm using (elixir-tools/elixir-tools.nvim#225), but it seems to be an issue with elixirls.
To reproduce
To reproduce, here is the minimal Neovim configuration that I'm using:
Click to expand
local root = vim.fn.fnamemodify("./.repro", ":p")
for _, name in ipairs({ "config", "data", "state", "cache" }) do
vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({ "git", "clone", "--filter=blob:none", "https://github.com/folke/lazy.nvim.git", lazypath, })
end
vim.opt.runtimepath:prepend(lazypath)
local plugins = {
{
"elixir-tools/elixir-tools.nvim",
version = "*",
event = { "BufReadPre", "BufNewFile" },
config = function()
local elixir = require("elixir")
local elixirls = require("elixir.elixirls")
elixir.setup {
projectionist = {
enable = false
}
}
end,
dependencies = {
"nvim-lua/plenary.nvim",
},
}
}
require("lazy").setup(plugins, {
root = root .. "/plugins",
})
Steps to reproduce:
-
Clone https://github.com/robsonpeixoto/elixir-ls-go-to-definition-bug.
-
Open
lib/bug.ex
with the config above by doingnvim -u path/to/config/above elixir-ls-go-to-definition-bug/lib/bug.ex
-
Wait a couple of seconds for the elixirls to load and index the workspace
-
Move your scursor to
ModA.say_hi()
and type:=vim.lsp.buf.definition()
(or right-click onModA.say_hi()
and click "Go to definition" if you're a mouse-enjoyer). Here's what the file looks like:defmodule Bug do use MacroA def hello do ModA.say_hi() end end
-
Nothing happens
-
Elixir & Erlang versions (elixir --version):
Erlang/OTP 27 [erts-15.0.1] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] [jit:ns] Elixir 1.17.3 (compiled with Erlang/OTP 27)
Environment
- Elixir Language Server version: v0.23.0
- Operating system: EndeavourOS
- Editor or IDE name (e.g. Emacs/VSCode): Neovim
- Editor Plugin/LSP Client name and version:
elixir-tools.nvim, v0.16.0 (but I get the same behaviour if I just raw-dog nvim-lspconfig)
Current behavior
Go to definition doesn't work when trying to go to symbols in other modules
Expected behavior
Go to definition does work when trying to go to symbols in other modules
- The
ModA
alias is not working with the current inference engine. This PR replaces the engine and as you can see this case is going to be handled
- For go to stdlib to work you need to build elixir from sources. Otherwise the metadata points to paths from the build server like
/build/elixir/src/elixir-1.17.3
. I created #1119 for tracking
I see. Thank you for clarifying!