Fix go-to-definition for vars imported via :refer
SCIP Index / index (push) Successful in 1m32s

When a namespace uses :refer to import specific vars (e.g.,
[tui.events :refer [key=]]), clojure-lsp only populates the :to
field on the :refer declaration entry, not on subsequent usages.

This fix:
- Builds a refer-map from entries with :refer true
- Looks up the target namespace for usages missing :to
- Properly links usages like (key= event \q) to their definition

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-02-03 18:31:10 -05:00
parent ed6039ce80
commit 79ce17106a
+26 -8
View File
@@ -118,13 +118,23 @@
(.build builder)))
(defn var-usage->occurrence
"Convert a clojure-lsp var-usage to SCIP Occurrence (reference)."
[{:keys [to name] :as var-usage}]
(let [builder (Scip$Occurrence/newBuilder)]
(.addAllRange builder (position->range var-usage))
(.setSymbol builder (make-symbol to name))
;; No role bits = reference
(.build builder)))
"Convert a clojure-lsp var-usage to SCIP Occurrence (reference).
For vars imported via :refer, the :to field may be nil in usage entries.
The refer-map provides a lookup from var name to target namespace for these cases.
Entries with :refer true have :to populated and represent the import declaration.
Entries without :refer are actual usages and may need refer-map lookup."
([var-usage]
(var-usage->occurrence var-usage {}))
([{:keys [to name] :as var-usage} refer-map]
(let [target-ns (or to (get refer-map name))
builder (Scip$Occurrence/newBuilder)]
(when target-ns ;; Only create occurrence if we can resolve the target
(.addAllRange builder (position->range var-usage))
(.setSymbol builder (make-symbol target-ns name))
;; No role bits = reference
(.build builder)))))
(defn ns-definition->occurrence
"Convert a namespace definition to SCIP Occurrence."
@@ -269,6 +279,13 @@
relative-path (uri->relative-path uri project-root)
{:keys [var-definitions var-usages namespace-definitions namespace-usages namespace-alias]} file-analysis
;; Build refer-map: for vars imported via :refer, map var-name -> target-namespace
;; These entries have :refer true and :to populated
refer-map (->> (or var-usages [])
(filter :refer)
(map (fn [{:keys [name to]}] [name to]))
(into {}))
;; Create occurrences for definitions
def-occurrences (map var-definition->occurrence (or var-definitions []))
@@ -276,7 +293,8 @@
def-symbols (map var-definition->symbol-info (or var-definitions []))
;; Create occurrences for usages (references)
usage-occurrences (map var-usage->occurrence (or var-usages []))
;; Pass refer-map to resolve referred vars that don't have :to
usage-occurrences (keep #(var-usage->occurrence % refer-map) (or var-usages []))
;; Namespace definitions
ns-def-occurrences (map ns-definition->occurrence (or namespace-definitions []))