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..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] @@ -15,7 +17,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)) @@ -50,15 +52,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))] @@ -70,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]