Skip to content

Commit 3b69a2c

Browse files
committed
info: don't use a fallback for ns-qualified symbols
Fixes #133
1 parent f2ef9c7 commit 3b69a2c

File tree

3 files changed

+72
-48
lines changed

3 files changed

+72
-48
lines changed

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@
22

33
## master (unreleased)
44

5+
### Changes
6+
7+
* [#133](https://github.com/clojure-emacs/orchard/issues/133): `info:` don't fall back to `clojure.core` for fully-qualified symbols.
8+
59
## 0.7.2 (2021-09-30)
610

711
### Changes

src/orchard/info.clj

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
[orchard.cljs.meta :as cljs-meta]
88
[orchard.java :as java]
99
[orchard.java.classpath :as cp]
10+
[orchard.java.resource :as resource]
1011
[orchard.meta :as m]
11-
[orchard.misc :as misc]
12-
[orchard.java.resource :as resource]))
12+
[orchard.misc :as misc]))
1313

1414
(defn qualify-sym
1515
"Qualify a symbol, if any in `sym`, with `ns`.
@@ -65,32 +65,29 @@
6565
{:added "0.5"}
6666
[{:keys [dialect ns sym computed-ns unqualified-sym] :as opts}]
6767
{:pre [(= dialect :clj)]}
68-
(let [ns (or ns computed-ns)]
69-
(if-not (and ns (find-ns ns))
70-
;; Lookups in files whose namespaces don't exist yet should still be able
71-
;; to resolve built-ins and fully-qualified syms
72-
(recur (assoc opts :ns 'clojure.core))
73-
(or
74-
;; it's a special (special-symbol?)
75-
(m/special-sym-meta sym)
76-
;; it's a var
77-
(some-> ns (m/resolve-var sym) (m/var-meta))
78-
;; it's a Java constructor/static member symbol
79-
(some-> ns (java/resolve-symbol sym))
80-
;; it's an unqualified sym maybe referred
81-
(some-> ns (m/resolve-var unqualified-sym) (m/var-meta))
82-
;; it's a Java class/record type symbol
83-
(some-> ns (java/resolve-type unqualified-sym))
84-
;; it's an alias for another ns
85-
(some-> ns (m/resolve-aliases) (get sym) (m/ns-meta))
86-
;; We use :unqualified-sym *exclusively* here because because our :ns is
87-
;; too ambiguous.
88-
;;
89-
;; Observe the incorrect behavior (should return nil, there is a test):
90-
;;
91-
;; (info '{:ns clojure.core :sym non-existing}) ;;=> {:author "Rich Hickey" :ns clojure.core ...}
92-
;;
93-
(some-> (find-ns unqualified-sym) (m/ns-meta))))))
68+
(let [ns (or ns computed-ns)
69+
ns (or (when (some-> ns find-ns)
70+
ns)
71+
'clojure.core)]
72+
(or
73+
;; it's a special (special-symbol?)
74+
(m/special-sym-meta sym)
75+
;; it's a var
76+
(some-> ns (m/resolve-var sym) (m/var-meta))
77+
;; it's a Java constructor/static member symbol
78+
(some-> ns (java/resolve-symbol sym))
79+
;; it's a Java class/record type symbol
80+
(some-> ns (java/resolve-type unqualified-sym))
81+
;; it's an alias for another ns
82+
(some-> ns (m/resolve-aliases) (get sym) (m/ns-meta))
83+
;; We use :unqualified-sym *exclusively* here because because our :ns is
84+
;; too ambiguous.
85+
;;
86+
;; Observe the incorrect behavior (should return nil, there is a test):
87+
;;
88+
;; (info '{:ns clojure.core :sym non-existing}) ;;=> {:author "Rich Hickey" :ns clojure.core ...}
89+
;;
90+
(some-> (find-ns unqualified-sym) (m/ns-meta)))))
9491

9592
(defn cljs-meta
9693
{:added "0.5"}

test/orchard/info_test.clj

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
(ns orchard.info-test
22
(:require
3-
[clojure.test :as test :refer [deftest is testing use-fixtures]]
4-
[clojure.string :as str]
3+
[clojure.java.io :refer [resource]]
4+
[clojure.string :as str :refer [replace-first]]
5+
[clojure.test :refer [are deftest is testing use-fixtures]]
6+
[orchard.cljs.test-env :as test-env]
57
[orchard.info :as info]
68
[orchard.java :as java]
79
[orchard.misc :as misc]
8-
[clojure.java.io :refer [resource]]
9-
[orchard.cljs.test-env :as test-env]
1010
[orchard.test-ns]))
1111

1212
@java/cache-initializer ;; make tests more deterministic
@@ -352,7 +352,8 @@
352352

353353
(deftest info-macros-referred-var-test
354354
(testing "Macro - referred"
355-
(let [params '[{:sym orchard.test-ns/my-add}
355+
(let [params '[{:sym orchard.test-ns/my-add},
356+
356357
{:ns orchard.test-ns
357358
:sym my-add}]
358359
expected '{:name my-add
@@ -368,7 +369,7 @@
368369
(map #(select-keys % [:ns :name :arglists :macro :file]))))))
369370

370371
(testing "- :clj"
371-
(is (= (take 2 (repeat expected))
372+
(is (= [{}, expected]
372373
(->> params
373374
(map #(info/info* %))
374375
(map #(select-keys % [:ns :name :arglists :macro :file])))))))))
@@ -467,21 +468,43 @@
467468
:returns int}))
468469
(is (re-find #"Returns the greater of two" (:doc i))))))
469470

471+
(def some-var nil)
472+
470473
(deftest info-undefined-namespace-test
471-
(testing "Fully qualified sym can still be resolved"
472-
(is (= '{:added "1.2"
473-
:ns clojure.string
474-
:name upper-case
475-
:file "clojure/string.clj"}
476-
(select-keys (info/info* {:ns 'gibberish :sym 'clojure.string/upper-case})
477-
[:added :ns :name :file]))))
478-
(testing "clojure.core syms can still be resolved"
479-
(is (= '{:added "1.0"
480-
:ns clojure.core
481-
:name merge
482-
:file "clojure/core.clj"}
483-
(select-keys (info/info* {:ns 'gibberish :sym 'merge})
484-
[:added :ns :name :file])))))
474+
(let [current-ns (-> ::_ namespace symbol)]
475+
(are [input expected] (= expected
476+
(select-keys (info/info* input)
477+
[:added :ns :name :file]))
478+
{:ns current-ns :sym 'some-var} '{:ns orchard.info-test,
479+
:name some-var,
480+
:file "orchard/info_test.clj"}
481+
{:ns current-ns :sym 'replace-first} '{:added "1.2",
482+
:ns clojure.string,
483+
:name replace-first,
484+
:file "clojure/string.clj"}
485+
{:ns current-ns :sym 'merge} '{:added "1.0"
486+
:ns clojure.core
487+
:name merge
488+
:file "clojure/core.clj"}
489+
{:ns current-ns :sym 'non.existing.ns/merge} {}
490+
{:ns current-ns :sym 'clojure.string/upper-case} '{:added "1.2"
491+
:ns clojure.string
492+
:name upper-case
493+
:file "clojure/string.clj"}
494+
{:ns current-ns :sym 'non.existing.ns/upper-case} {}
495+
496+
{:ns 'gibberish :sym 'some-var} {}
497+
{:ns 'gibberish :sym 'replace-first} {}
498+
{:ns 'gibberish :sym 'merge} '{:added "1.0"
499+
:ns clojure.core
500+
:name merge
501+
:file "clojure/core.clj"}
502+
{:ns 'gibberish :sym 'non.existing.ns/merge} {}
503+
{:ns 'gibberish :sym 'clojure.string/upper-case} '{:added "1.2"
504+
:ns clojure.string
505+
:name upper-case
506+
:file "clojure/string.clj"}
507+
{:ns 'gibberish :sym 'non.existing.ns/upper-case} {})))
485508

486509
(deftest javadoc-info-unit-test
487510
(testing "Get an HTTP URL for a Sun/Oracle Javadoc"

0 commit comments

Comments
 (0)