From df7ddcbc286a65ee2bc61e01150e0753a9a3db65 Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Wed, 15 Aug 2018 21:42:20 +0200 Subject: [PATCH 1/3] Trust cljs analyzer to read macros correctly Author: @martinklepsch Codox previously did two passes to also read macros for ClojureScript. This is actually no longer necessary with more recent versions of ClojureScript. https://github.com/cljdoc/codox/commit/3079986bd9500c62775f795ec92b30a7aeb742c9 --- codox/src/codox/main.clj | 23 ++--------------------- codox/src/codox/reader/clojurescript.clj | 19 ++++++++++--------- 2 files changed, 12 insertions(+), 30 deletions(-) diff --git a/codox/src/codox/main.clj b/codox/src/codox/main.clj index 1a11ab30..ed9ae6b0 100644 --- a/codox/src/codox/main.clj +++ b/codox/src/codox/main.clj @@ -4,6 +4,7 @@ (:require [clojure.string :as str] [clojure.java.shell :as shell] [codox.reader.clojure :as clj] + [codox.reader.clojurescript :as cljs] [codox.reader.plaintext :as text])) (defn- writer [{:keys [writer]}] @@ -19,29 +20,9 @@ (throw (Exception. (str "Could not resolve codox writer " writer-sym)))))) -(defn- macro? [var] - (= (:type var) :macro)) - -(defn- read-macro-namespaces [paths read-opts] - (->> (clj/read-namespaces paths read-opts) - (map (fn [ns] (update-in ns [:publics] #(filter macro? %)))) - (remove (comp empty? :publics)))) - -(defn- merge-namespaces [namespaces] - (for [[name namespaces] (group-by :name namespaces)] - (assoc (first namespaces) :publics (mapcat :publics namespaces)))) - -(defn- cljs-read-namespaces [paths read-opts] - ;; require is here to allow Clojure 1.3 and 1.4 when not using ClojureScript - (require 'codox.reader.clojurescript) - (let [reader (find-var 'codox.reader.clojurescript/read-namespaces)] - (merge-namespaces - (concat (reader paths read-opts) - (read-macro-namespaces paths read-opts))))) - (def ^:private namespace-readers {:clojure clj/read-namespaces - :clojurescript cljs-read-namespaces}) + :clojurescript cljs/read-namespaces}) (defn- var-symbol [namespace var] (symbol (name (:name namespace)) (name (:name var)))) diff --git a/codox/src/codox/reader/clojurescript.clj b/codox/src/codox/reader/clojurescript.clj index dee1892c..254d8e77 100644 --- a/codox/src/codox/reader/clojurescript.clj +++ b/codox/src/codox/reader/clojurescript.clj @@ -50,15 +50,16 @@ :else :var)) (defn- read-var [file vars var] - (-> var - (select-keys [:name :line :arglists :doc :dynamic :added :deprecated :doc/format]) - (update-some :name (comp symbol name)) - (update-some :arglists remove-quote) - (update-some :doc correct-indent) - (assoc-some :file (.getPath file) - :type (var-type var) - :members (map (partial read-var file vars) - (protocol-methods var vars))))) + (let [vt (var-type var)] + (-> var + (select-keys [:name :line :arglists :doc :dynamic :added :deprecated :doc/format]) + (update-some :name (comp symbol name)) + (update-some :arglists remove-quote) + (update-some :doc correct-indent) + (assoc-some :file (if (= vt :macro) (:file var) (.getPath file)) + :type vt + :members (map (partial read-var file vars) + (protocol-methods var vars)))))) (defn- read-publics [state namespace file] (let [vars (vals (ana/ns-publics state namespace))] From 370ef9ec9883ff64b14fd196b98d154e5403392b Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Tue, 28 Aug 2018 18:20:32 +0200 Subject: [PATCH 2/3] Check for `seq?` instead of `list?` when removing `'quote` from arglists Author: @martinklepsch For some reason the list? check wasn't enough to remove 'quote and I ended up with 'quote in arglists. seq? did the trick (and might be more appropriate anyways?). https://github.com/cljdoc/codox/commit/25b01ae5c471bd4d1ef4290d7724d6878157f31d --- codox/src/codox/reader/clojurescript.clj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/codox/src/codox/reader/clojurescript.clj b/codox/src/codox/reader/clojurescript.clj index 254d8e77..45990705 100644 --- a/codox/src/codox/reader/clojurescript.clj +++ b/codox/src/codox/reader/clojurescript.clj @@ -15,7 +15,7 @@ (-> file .getName cljs-filename?))) (defn- remove-quote [x] - (if (and (list? x) (= (first x) 'quote)) + (if (and (seq? x) (= (first x) 'quote)) (second x) x)) From ebfece3070287ebcb5ff0d7392dc964d7f92f4dd Mon Sep 17 00:00:00 2001 From: Martin Klepsch Date: Fri, 9 Nov 2018 19:01:42 +0100 Subject: [PATCH 3/3] Fix analysis issues with cljs 1.10.439 Author: @martinklepsch I noticed some issues (+ more details[2]) with the new CLJS version. Turns out setting *analyze-deps* to false was never really supported for macro-containing namespaces and we just got lucky[3]. Fixes [1] [1] https://github.com/cljdoc/cljdoc/issues/201 [2] https://gist.github.com/martinklepsch/9f885feb061ec3f03f365e22d0d9bf5b [3] https://clojurians-log.clojureverse.org/cljs-dev/2018-11-09/1541786231.245300 https://github.com/cljdoc/codox/commit/e0cd26910704c416611fc81f43f890a26861c221 --- codox/src/codox/reader/clojurescript.clj | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/codox/src/codox/reader/clojurescript.clj b/codox/src/codox/reader/clojurescript.clj index 45990705..1db1296f 100644 --- a/codox/src/codox/reader/clojurescript.clj +++ b/codox/src/codox/reader/clojurescript.clj @@ -4,6 +4,8 @@ (:require [clojure.java.io :as io] [cljs.analyzer :as an] [cljs.analyzer.api :as ana] + [cljs.closure] + [cljs.env] [clojure.string :as str])) (defn- cljs-filename? [filename] @@ -71,10 +73,11 @@ (sort-by (comp str/lower-case :name))))) (defn- analyze-file [file] - (let [state (ana/empty-state)] - (binding [an/*analyze-deps* false] - (ana/no-warn - (ana/analyze-file state file {}))) + (let [opts (cljs.closure/add-implicit-options {}) + state (cljs.env/default-compiler-env opts)] + (ana/no-warn + (cljs.closure/validate-opts opts) + (ana/analyze-file state file opts)) state)) (defn- read-file [path file exception-handler]