Skip to content

Commit

Permalink
Fix wrong definition when both clojure.core and cljs.core are on clas…
Browse files Browse the repository at this point in the history
…spath
  • Loading branch information
ericdallo committed Apr 2, 2021
1 parent 5b359bb commit 076ee80
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 9 deletions.
11 changes: 7 additions & 4 deletions src/clojure_lsp/feature/completion.clj
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,8 @@
(filter (comp matches-fn str))
(map (fn [sym] {:label (str sym)
:kind :variable
:data (walk/stringify-keys {:name (str sym)
:data (walk/stringify-keys {:filename "/clojure.core.clj"
:name (str sym)
:ns "clojure.core"})
:detail (str "clojure.core/" sym)}))))

Expand All @@ -224,7 +225,8 @@
(filter (comp matches-fn str))
(map (fn [sym] {:label (str sym)
:kind :variable
:data (walk/stringify-keys {:name (str sym)
:data (walk/stringify-keys {:filename "/cljs.core.cljs"
:name (str sym)
:ns "cljs.core"})
:detail (str "cljs.core/" sym)}))))

Expand Down Expand Up @@ -315,9 +317,10 @@
not-empty)))))

(defn ^:private resolve-item-by-ns
[{{:keys [name ns]} :data :as item}]
[{{:keys [name ns filename]} :data :as item}]
(let [analysis (:analysis @db/db)
definition (q/find-definition analysis {:name (symbol name)
definition (q/find-definition analysis {:filename filename
:name (symbol name)
:to (symbol ns)
:bucket :var-usages})]
(if definition
Expand Down
19 changes: 14 additions & 5 deletions src/clojure_lsp/queries.clj
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
(ns clojure-lsp.queries
(:require
[taoensso.timbre :as log]
[medley.core :as medley]
[clojure-lsp.shared :as shared]
[clojure.set :as set]
[clojure.string :as string]
[clojure-lsp.shared :as shared]))
[medley.core :as medley]
[taoensso.timbre :as log]))

(defn inside?
[start-l start-c
Expand Down Expand Up @@ -39,6 +40,12 @@
(or (find-first pred? (mapcat val (filter-project-analysis analysis)))
(find-first pred? (mapcat val (filter-external-analysis analysis)))))

(defn ^:private match-file-lang
[check-element match-element]
(let [match-file-lang (shared/uri->available-langs (:filename match-element))
check-file-lang (shared/uri->available-langs (:filename check-element))]
(seq (set/intersection match-file-lang check-file-lang))))

(defn find-local-usages-under-form
[analysis filename line column end-line end-column]
(let [local-analysis (get analysis filename)]
Expand Down Expand Up @@ -79,15 +86,17 @@
[analysis element]
(find-first-order-by-project-analysis
#(and (= (:bucket %) :namespace-definitions)
(= (:name %) (:name element)))
(= (:name %) (:name element))
(match-file-lang % element))
analysis))

(defmethod find-definition :var-usages
[analysis element]
(find-first-order-by-project-analysis
#(and (= (:bucket %) :var-definitions)
(= (:name %) (:name element))
(= (:ns %) (:to element)))
(= (:ns %) (:to element))
(match-file-lang % element))
analysis))

(defmethod find-definition :local-usages
Expand Down
3 changes: 3 additions & 0 deletions test/clojure_lsp/features/completion_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,9 @@
(f.completion/resolve-item {:label "foo"
:kind :function
:data {:name "foo"
:filename "/a.clj"
:name-row 1
:name-col 13
:ns "a"}})))))

(deftest completing-refers
Expand Down
29 changes: 29 additions & 0 deletions test/clojure_lsp/queries_test.clj
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,35 @@
{:name 'bar :filename "/a.clj"}
(q/find-definition-from-cursor ana "/b.clj" bar-r bar-c))))

(deftest find-definition-from-cursor-when-it-has-same-namespace-from-clj-and-cljs
(testing "when on a clj file"
(let [_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:some-jar.clj")
_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:other-jar.cljs")
[[bar-r bar-c]] (h/load-code-and-locs (h/code "(ns baz (:require [foo :as f]))"
"|f/bar") "file:///b.clj")
ana (:analysis @db/db)]
(h/assert-submap
{:name 'bar :filename "/some.jar:some-jar.clj"}
(q/find-definition-from-cursor ana "/b.clj" bar-r bar-c))))
(testing "when on a cljs file"
(let [_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:some-jar.clj")
_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:other-jar.cljs")
[[bar-r bar-c]] (h/load-code-and-locs (h/code "(ns baz (:require [foo :as f]))"
"|f/bar") "file:///b.cljs")
ana (:analysis @db/db)]
(h/assert-submap
{:name 'bar :filename "/some.jar:other-jar.cljs"}
(q/find-definition-from-cursor ana "/b.cljs" bar-r bar-c))))
(testing "when on a cljc file"
(let [_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:some-jar.clj")
_ (h/load-code-and-locs (h/code "(ns foo) (def bar)") "file:///some.jar:other-jar.cljs")
[[bar-r bar-c]] (h/load-code-and-locs (h/code "(ns baz (:require [foo :as f]))"
"|f/bar") "file:///b.cljc")
ana (:analysis @db/db)]
(h/assert-submap
{:name 'bar :filename "/some.jar:some-jar.clj"}
(q/find-definition-from-cursor ana "/b.cljc" bar-r bar-c)))))

(deftest find-unused-aliases
(testing "used require via alias"
(h/load-code-and-locs "(ns a (:require [x :as f])) f/foo")
Expand Down

0 comments on commit 076ee80

Please sign in to comment.