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)))
|
(.build builder)))
|
||||||
|
|
||||||
(defn var-usage->occurrence
|
(defn var-usage->occurrence
|
||||||
"Convert a clojure-lsp var-usage to SCIP Occurrence (reference)."
|
"Convert a clojure-lsp var-usage to SCIP Occurrence (reference).
|
||||||
[{:keys [to name] :as var-usage}]
|
|
||||||
(let [builder (Scip$Occurrence/newBuilder)]
|
For vars imported via :refer, the :to field may be nil in usage entries.
|
||||||
(.addAllRange builder (position->range var-usage))
|
The refer-map provides a lookup from var name to target namespace for these cases.
|
||||||
(.setSymbol builder (make-symbol to name))
|
|
||||||
;; No role bits = reference
|
Entries with :refer true have :to populated and represent the import declaration.
|
||||||
(.build builder)))
|
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
|
(defn ns-definition->occurrence
|
||||||
"Convert a namespace definition to SCIP Occurrence."
|
"Convert a namespace definition to SCIP Occurrence."
|
||||||
@@ -269,6 +279,13 @@
|
|||||||
relative-path (uri->relative-path uri project-root)
|
relative-path (uri->relative-path uri project-root)
|
||||||
{:keys [var-definitions var-usages namespace-definitions namespace-usages namespace-alias]} file-analysis
|
{: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
|
;; Create occurrences for definitions
|
||||||
def-occurrences (map var-definition->occurrence (or var-definitions []))
|
def-occurrences (map var-definition->occurrence (or var-definitions []))
|
||||||
|
|
||||||
@@ -276,7 +293,8 @@
|
|||||||
def-symbols (map var-definition->symbol-info (or var-definitions []))
|
def-symbols (map var-definition->symbol-info (or var-definitions []))
|
||||||
|
|
||||||
;; Create occurrences for usages (references)
|
;; 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
|
;; Namespace definitions
|
||||||
ns-def-occurrences (map ns-definition->occurrence (or namespace-definitions []))
|
ns-def-occurrences (map ns-definition->occurrence (or namespace-definitions []))
|
||||||
|
|||||||
Reference in New Issue
Block a user