Very nice article. I'll be interested to hear where you end up, with eglot or lsp-mode.
A quibble (based on my knowledge of Common Lisp, I'm not sure if it applies exactly the same way to Clojure):
"Language server has to do all of that statically, using their own parsers, tracking of variables, modules, and so on."
There's no reason an LSP server can't be run inside the Lisp image and integrate with its internal xref data. In fact, to do it any other way has serious problems due to Lisp's procedural macros making static analysis impossible.
Taking a quick look around, I see this is how the alive-lsp server works. You load it into your image and run (alive/server::start :port 8006)
It seems like this would address some of your complaints about the lack of fallback when looking for xrefs, because fallback wouldn't be necessary.
A quibble (based on my knowledge of Common Lisp, I'm not sure if it applies exactly the same way to Clojure):
"Language server has to do all of that statically, using their own parsers, tracking of variables, modules, and so on."
There's no reason an LSP server can't be run inside the Lisp image and integrate with its internal xref data. In fact, to do it any other way has serious problems due to Lisp's procedural macros making static analysis impossible.
Taking a quick look around, I see this is how the alive-lsp server works. You load it into your image and run (alive/server::start :port 8006)
It seems like this would address some of your complaints about the lack of fallback when looking for xrefs, because fallback wouldn't be necessary.