From 754ae065cac18e97db80164a261e8e44f76792b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Fri, 1 Nov 2019 10:26:21 +0100 Subject: [PATCH 1/6] Add test exposing issue #75 --- .gitignore | 2 ++ test-resources/orchard/test_no_defs.cljc | 2 ++ test-resources/orchard/test_ns.cljc | 3 ++- test/orchard/info_test.clj | 12 ++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 test-resources/orchard/test_no_defs.cljc diff --git a/.gitignore b/.gitignore index 51ec7858..9273e040 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,5 @@ pom.xml pom.xml.asc *.jar *.class +.cljs_nashorn_repl/ +nashorn_code_cache/ diff --git a/test-resources/orchard/test_no_defs.cljc b/test-resources/orchard/test_no_defs.cljc new file mode 100644 index 00000000..fd1b38ce --- /dev/null +++ b/test-resources/orchard/test_no_defs.cljc @@ -0,0 +1,2 @@ +(ns ^{:doc "Namespace w/o any `def`s, issue #75"} + orchard.test-no-defs) diff --git a/test-resources/orchard/test_ns.cljc b/test-resources/orchard/test_ns.cljc index 2992d482..94ef85e0 100644 --- a/test-resources/orchard/test_ns.cljc +++ b/test-resources/orchard/test_ns.cljc @@ -1,7 +1,8 @@ (ns ^{:doc "A test namespace"} orchard.test-ns (:refer-clojure :exclude [unchecked-byte while]) (:require [clojure.string :refer [replace]] - [orchard.test-ns-dep :as test-dep :refer [foo-in-dep]]) + [orchard.test-ns-dep :as test-dep :refer [foo-in-dep]] + [orchard.test-no-defs :as no-defs]) #?(:cljs (:require-macros [orchard.test-macros :as test-macros :refer [my-add]]) :clj (:require [orchard.test-macros :as test-macros :refer [my-add]])) #?(:cljs (:import [goog.ui IdGenerator]))) diff --git a/test/orchard/info_test.clj b/test/orchard/info_test.clj index d7b59b40..e1784596 100644 --- a/test/orchard/info_test.clj +++ b/test/orchard/info_test.clj @@ -385,6 +385,18 @@ (is (= expected (select-keys i [:ns :name :doc :forms :special-form :url]))) (is (nil? (:file i)))))))) +(deftest file-resolution-no-defs-issue-75-test + (testing "File resolves, issue #75" + (let [params '{:ns orchard.test-ns + :sym orchard.test-no-defs} + f "orchard/test_no_defs.cljc"] + + (testing "- :cljs" + (is (= f (:file (info/info* (merge *cljs-params* params)))))) + + (testing "- :clj" + (is (= f (:file (info/info* params)))))))) + ;;;;;;;;;;;;;;;;;; ;; Clojure Only ;; ;;;;;;;;;;;;;;;;;; From 8eadc1a60857cc00b77ccdf5df534ffe83fac4f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Fri, 1 Nov 2019 11:59:59 +0100 Subject: [PATCH 2/6] Add basic ns-meta-test Exposes issue #75 --- test/orchard/meta_test.clj | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/test/orchard/meta_test.clj b/test/orchard/meta_test.clj index 7cec6bf2..11f746e9 100644 --- a/test/orchard/meta_test.clj +++ b/test/orchard/meta_test.clj @@ -110,3 +110,14 @@ (docs/clean-cache!) (testing "Including see-also is skipped" (is (not (contains? (m/var-meta (resolve 'clojure.set/union)) :see-also)))))) + +(deftest ns-meta-test + (testing "Includes a non-nil :file" + (is (some-> 'orchard.test-ns-dep + (find-ns) + (m/ns-meta) + :file)) + (is (some-> 'orchard.test-no-defs ;; issue #75 + (find-ns) + (m/ns-meta) + :file)))) \ No newline at end of file From 66b8f5ce14c75829956cd056ab1d88f142eeb01b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 2 Nov 2019 10:42:52 +0100 Subject: [PATCH 3/6] Use alt method for file paths when no ns-publics NB: Still get nil back when used with cljs-env, don't merge! --- src/orchard/meta.clj | 14 +++++++++----- test/orchard/cljs/env_test.cljc | 1 + test/orchard/info_test.clj | 7 ++++--- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/orchard/meta.clj b/src/orchard/meta.clj index d2b1c31e..a473c62f 100644 --- a/src/orchard/meta.clj +++ b/src/orchard/meta.clj @@ -268,11 +268,15 @@ (meta ns) {:ns (ns-name ns) :name (ns-name ns) - :file (-> (ns-publics ns) - first - second - var-meta - :file) + :file (or + (-> (ns-publics ns) + first + second + var-meta + :file) + (-> + (ns/canonical-source ns) + .getPath)) :line 1}))) ;;; ## Manipulation diff --git a/test/orchard/cljs/env_test.cljc b/test/orchard/cljs/env_test.cljc index e22da296..b85e4fba 100644 --- a/test/orchard/cljs/env_test.cljc +++ b/test/orchard/cljs/env_test.cljc @@ -10,6 +10,7 @@ (is (empty? (set/difference (set (keys (a/all-ns env))) '#{orchard.test-ns orchard.test-ns-dep + orchard.test-no-defs orchard.test-macros cljs.core cljs.user diff --git a/test/orchard/info_test.clj b/test/orchard/info_test.clj index e1784596..4433d82c 100644 --- a/test/orchard/info_test.clj +++ b/test/orchard/info_test.clj @@ -179,7 +179,7 @@ (testing "Resolution from current namespace - issue #28 from cljs-tooling" (let [i (info/info* (merge *cljs-params* '{:ns orchard.test-ns :sym issue-28}))] (is (= '{:arglists ([]) - :line 14 + :line 15 :column 1 :ns orchard.test-ns :name issue-28} @@ -389,13 +389,14 @@ (testing "File resolves, issue #75" (let [params '{:ns orchard.test-ns :sym orchard.test-no-defs} + cljs-merged-params (merge *cljs-params* params) f "orchard/test_no_defs.cljc"] (testing "- :cljs" - (is (= f (:file (info/info* (merge *cljs-params* params)))))) + (is (.endsWith (:file (info/info* cljs-merged-params)) f))) (testing "- :clj" - (is (= f (:file (info/info* params)))))))) + (is (.endsWith (:file (info/info* params)) f)))))) ;;;;;;;;;;;;;;;;;; ;; Clojure Only ;; From ff80f85fcdc65f874335e44f2b8bf04d26179e2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 2 Nov 2019 13:09:08 +0100 Subject: [PATCH 4/6] Refactor out `ns-file` Then also rewrite `ns-meta-test` to test the whole result. --- src/orchard/meta.clj | 21 ++++++++++++--------- test/orchard/info_test.clj | 1 - test/orchard/meta_test.clj | 27 ++++++++++++++++++--------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/src/orchard/meta.clj b/src/orchard/meta.clj index a473c62f..48b6af14 100644 --- a/src/orchard/meta.clj +++ b/src/orchard/meta.clj @@ -261,6 +261,17 @@ :form form :code code))))))) +(defn ns-file + "Finds the path to the file defining this `ns`" + [ns] + (or (some-> (ns-publics ns) + first + second + var-meta + :file) + (some-> (ns/canonical-source ns) + .getPath))) + (defn ns-meta [ns] (when ns @@ -268,15 +279,7 @@ (meta ns) {:ns (ns-name ns) :name (ns-name ns) - :file (or - (-> (ns-publics ns) - first - second - var-meta - :file) - (-> - (ns/canonical-source ns) - .getPath)) + :file (ns-file ns) :line 1}))) ;;; ## Manipulation diff --git a/test/orchard/info_test.clj b/test/orchard/info_test.clj index 4433d82c..61d3f615 100644 --- a/test/orchard/info_test.clj +++ b/test/orchard/info_test.clj @@ -391,7 +391,6 @@ :sym orchard.test-no-defs} cljs-merged-params (merge *cljs-params* params) f "orchard/test_no_defs.cljc"] - (testing "- :cljs" (is (.endsWith (:file (info/info* cljs-merged-params)) f))) diff --git a/test/orchard/meta_test.clj b/test/orchard/meta_test.clj index 11f746e9..b5e323fb 100644 --- a/test/orchard/meta_test.clj +++ b/test/orchard/meta_test.clj @@ -111,13 +111,22 @@ (testing "Including see-also is skipped" (is (not (contains? (m/var-meta (resolve 'clojure.set/union)) :see-also)))))) +(deftest ns-file-test + (testing "Resolves the file path" + (let [nss '[orchard.test-ns-dep orchard.test-no-defs] + endings ["test_ns_dep.cljc" "test_no_defs.cljc"]] + (is (every? true? (map #(.endsWith (m/ns-file %1) %2) nss endings)))))) + (deftest ns-meta-test - (testing "Includes a non-nil :file" - (is (some-> 'orchard.test-ns-dep - (find-ns) - (m/ns-meta) - :file)) - (is (some-> 'orchard.test-no-defs ;; issue #75 - (find-ns) - (m/ns-meta) - :file)))) \ No newline at end of file + (let [ns 'orchard.test-ns-dep + ns-meta (m/ns-meta ns)] + (testing "Includes correct `:ns`" + (is (= ns (:ns ns-meta)))) + (testing "Includes correct `:name`" + (is (= ns (:name ns-meta)))) + (testing "Includes correct `:file`" + (is (= (m/ns-file ns) (:file ns-meta)))) + (testing "Includes `:line 1`" + (is (= 1 (:line ns-meta)))) + (testing "Does not include anything else" + (is (= 4 (count (keys ns-meta))))))) \ No newline at end of file From fb60d19473bfe748410f9da48772cc6baa84e8f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 2 Nov 2019 13:33:50 +0100 Subject: [PATCH 5/6] Make `canonical-source` handle `.cljs` files --- src/orchard/namespace.clj | 3 ++- test-resources/orchard/cljs/test_canonical_source.cljs | 4 ++++ test/orchard/namespace_test.clj | 3 ++- 3 files changed, 8 insertions(+), 2 deletions(-) create mode 100644 test-resources/orchard/cljs/test_canonical_source.cljs diff --git a/src/orchard/namespace.clj b/src/orchard/namespace.clj index c139a75f..6ba64a98 100644 --- a/src/orchard/namespace.clj +++ b/src/orchard/namespace.clj @@ -31,7 +31,8 @@ (str/replace "-" "_") (str/replace "." "/"))] (or (io/resource (str path ".clj")) - (io/resource (str path ".cljc"))))) + (io/resource (str path ".cljc")) + (io/resource (str path ".cljs"))))) ;;; Namespace Loading diff --git a/test-resources/orchard/cljs/test_canonical_source.cljs b/test-resources/orchard/cljs/test_canonical_source.cljs new file mode 100644 index 00000000..2e46f5f2 --- /dev/null +++ b/test-resources/orchard/cljs/test_canonical_source.cljs @@ -0,0 +1,4 @@ +(ns orchard.cljs.test-canonical-source + "orchard.namespace/canocical-source should handle `.cljs` files") + +(def all-the-things 42) \ No newline at end of file diff --git a/test/orchard/namespace_test.clj b/test/orchard/namespace_test.clj index 5b9119c0..6effb35e 100644 --- a/test/orchard/namespace_test.clj +++ b/test/orchard/namespace_test.clj @@ -74,7 +74,8 @@ clojure.string clojure.test orchard.misc - orchard.namespace]] + orchard.namespace + orchard.cljs.test-canonical-source]] (testing "namespace symbols to source files" (is (every? identity (map n/canonical-source nses)))) (testing "source files to namespace symbols" From 1a65423ed26ab5f800ccdf1522bade511a4a6648 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peter=20Str=C3=B6mberg?= Date: Sat, 2 Nov 2019 17:48:21 +0100 Subject: [PATCH 6/6] Add canonical-source fallback for cljs dialect Move normalize-ns-meta to cljs-meta ns (and remove old unused version lurking in there) --- src/orchard/cljs/meta.cljc | 24 +++++++++++++++++++----- src/orchard/info.clj | 13 ++----------- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/orchard/cljs/meta.cljc b/src/orchard/cljs/meta.cljc index 8022191f..710e7d4d 100644 --- a/src/orchard/cljs/meta.cljc +++ b/src/orchard/cljs/meta.cljc @@ -4,16 +4,30 @@ :added "0.5.0"} (:require [orchard.cljs.analysis :as a #?@(:cljs [:include-macros true])] - [orchard.misc :as misc #?@(:cljs [:include-macros true])])) + [orchard.misc :as misc #?@(:cljs [:include-macros true])] + [orchard.namespace :as ns])) + +(defn normalize-ns-file + "Helps `normalize-ns-meta` to extract the file from the meta data" + [meta] + (or (some-> meta + :defs + first + second + :file) + (some-> meta + :name + ns/canonical-source + .getPath))) (defn normalize-ns-meta "Normalize cljs namespace metadata to look like a clj." [meta] (merge (select-keys meta [:doc :author]) - (when-let [n (:name meta)] - {:ns n}) - {:file (-> meta :defs first second :file) - :line 1})) + {:file (normalize-ns-file meta) + :line 1 + :name (:name meta) + :ns (:name meta)})) (defn normalize-macro-ns "Normalize cljs namespace macro metadata to look like clj." diff --git a/src/orchard/info.clj b/src/orchard/info.clj index 51792cb4..da6e2c65 100644 --- a/src/orchard/info.clj +++ b/src/orchard/info.clj @@ -12,15 +12,6 @@ [orchard.misc :as misc] [orchard.java.resource :as resource])) -(defn normalize-ns-meta - "Normalize cljs namespace metadata to look like a clj." - [meta] - (merge (select-keys meta [:doc :author]) - {:file (-> meta :defs first second :file) - :line 1 - :name (:name meta) - :ns (:name meta)})) - (defn qualify-sym "Qualify a symbol, if any in :sym, with :ns. @@ -107,11 +98,11 @@ (cljs-meta/normalize-var-meta)) ;; an NS (some->> (cljs-ana/find-ns env sym) - (normalize-ns-meta)) + (cljs-meta/normalize-ns-meta)) ;; ns alias (some->> (cljs-ana/ns-alias env sym context-ns) (cljs-ana/find-ns env) - (normalize-ns-meta)) + (cljs-meta/normalize-ns-meta)) ;; macro ns (some->> (find-ns unqualified-sym) (cljs-meta/normalize-macro-ns env))