From 79ce17106afe974ed66fca5f089b57be25cf562e Mon Sep 17 00:00:00 2001 From: Adam Jeniski Date: Tue, 3 Feb 2026 18:31:10 -0500 Subject: [PATCH] Fix go-to-definition for vars imported via :refer 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 --- src/scip_clojure/core.clj | 34 ++++++++++++++++++++++++++-------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/src/scip_clojure/core.clj b/src/scip_clojure/core.clj index 5a89644..476a837 100644 --- a/src/scip_clojure/core.clj +++ b/src/scip_clojure/core.clj @@ -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 []))