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:
@@ -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 []))
|
||||
|
||||
Reference in New Issue
Block a user