Summary
Eglot-jl was unable to index imported Julia packages because the language server was started in an isolated environment that did not have the packages pre‑loaded, leading to a world‑age mismatch (UndefVarError: Graphs not defined). The root cause is the way the LanguageServer’s LoadingBay resolves modules when the server’s project differs from the user’s active environment.
Root Cause
- The
eglot-jl-language-server-projectvariable pointed to~/.julia/environments/lsp-isolated, a clean environment containing onlyLanguageServer.jlandSymbolServer.jl. - Your source file’s
Project.tomldeclared a dependency onGraphs.jl, but that package was never loaded into the server’s environment. - Julia’s world age mechanism detected that
Graphswas defined in a newer world (44989) than the one the server was running in (39203), causing theUndefVarError. - The LanguageServer tried to import
GraphsinMain.SymbolServer.LoadingBaywithout success, aborting the indexing phase.
Why This Happens in Real Systems
- Isolated LSP environments are common for reproducibility, but they must mirror the project’s dependency graph.
- The world‑age guard protects against loading code compiled against a newer world, which is triggered when the server’s precompiled cache is out‑of‑sync with the active project.
- Eglot-jl does not automatically activate the project of the opened file; it uses the path set in
eglot-jl-language-server-projectunless overridden.
Real-World Impact
- Missing completions and hover information for any package not present in the isolated environment.
- False negatives in static analysis tools that rely on SymbolServer indexing.
- Developer frustration due to invisible errors that appear only in the LSP logs.
- Potential CI pipeline failures if the same isolated configuration is reused for automated checks.
Example or Code (if necessary and relevant)
using Pkg
Pkg.activate("~/myproject")
Pkg.instantiate()
How Senior Engineers Fix It
- Align the LSP project with the source project:
(setq eglot-jl-language-server-project (projectile-project-root)) - Pre‑load required packages in the isolated environment:
using Pkg Pkg.activate("~/.julia/environments/lsp-isolated") Pkg.add(["Graphs", "MetaGraphsNext"]) - Clear stale precompilation caches to avoid world‑age mismatches:
using Pkg Pkg.precompile() - Enable automatic project activation by adding to
init.el:(add-hook 'julia-mode-hook (lambda () (let ((proj (projectile-project-root))) (when proj (setq-local eglot-jl-language-server-project proj))))) - Upgrade SymbolServer/LanguageServer to the latest compatible versions, as newer releases improve handling of world‑age issues.
Why Juniors Miss It
- They often assume the LSP automatically picks up the current project, overlooking the explicit
eglot-jl-language-server-projectsetting. - Debugging world‑age errors requires familiarity with Julia’s compilation model, which is rarely covered in entry‑level tutorials.
- Junior developers may ignore LSP logs, focusing only on editor UI symptoms rather than the underlying server error messages.