diff --git a/.gitignore b/.gitignore index 4e51644..1f2afee 100644 --- a/.gitignore +++ b/.gitignore @@ -8,7 +8,7 @@ pom.xml.asc *.swp /.lein-* /.nrepl-port -doc/index.html +doc/ \#*\# *~ .\#* diff --git a/README.adoc b/README.adoc index 6786e80..74eb027 100644 --- a/README.adoc +++ b/README.adoc @@ -19,7 +19,8 @@ of your sources and the language: [source,clojure] ---- -:codeina {:sources ["src"]} +:codeina {:sources ["src"] + :reader :clojurescript} ---- And run the `doc` lein subcommand: diff --git a/src/codeina/core.clj b/src/codeina/core.clj index bd44755..eeac144 100644 --- a/src/codeina/core.clj +++ b/src/codeina/core.clj @@ -26,13 +26,12 @@ (remove (comp empty? :publics))))) (defn- merge-namespaces [namespaces] - (for [[name namespaces] (group-by :name namespaces)] - (assoc (first namespaces) :publics (mapcat :publics namespaces)))) + (for [[name nss] (group-by :name namespaces)] + (assoc (first nss) :publics (mapcat :publics nss)))) (defn- cljs-read-namespaces [& paths] (let [reader (resolve-sym 'codeina.reader.clojurescript/read-namespaces)] - (println 2222 (apply reader paths)) (merge-namespaces (concat (apply reader paths) (apply read-macro-namespaces paths))))) @@ -76,7 +75,7 @@ writer-fn (get-writer options) reader-fn (get-reader options) root (:root options) - sources (:sources options) + sources (seq (set (:sources options))) ;; Avoid reading twice include (:include options) exclude (:exclude options) namespaces (->> (apply reader-fn sources) diff --git a/src/codeina/reader/clojurescript.clj b/src/codeina/reader/clojurescript.clj index 539fdff..1fda3d6 100644 --- a/src/codeina/reader/clojurescript.clj +++ b/src/codeina/reader/clojurescript.clj @@ -2,7 +2,8 @@ "Read raw documentation information from ClojureScript source directory." (:use [codeina.utils :only [assoc-some update-some correct-indent]]) (:require [clojure.java.io :as io] - [cljs.analyzer :as an] + [cljs.analyzer.api :as an] + [cljs.env :as env] [clojure.string :as str])) (defn- cljs-file? [file] @@ -41,14 +42,16 @@ (-> var (select-keys [:name :line :arglists :doc :dynamic :added :deprecated :doc/format]) (update-some :doc correct-indent) - (update-some :arglists second) - (assoc-some :file (.getPath file) + (update-some :arglists #(if (= 'quote (first %)) (second %) %)) + (assoc-some :file (cond + (instance? java.io.File file) (.getPath file) + (string? file) file) :type (var-type var) :members (map (partial read-var file vars) (protocol-methods var vars))))) (defn- namespace-vars [analysis namespace] - (->> (get-in analysis [::an/namespaces namespace :defs]) + (->> (:defs analysis) (map (fn [[name opts]] (assoc opts :name name))))) (defn- read-publics [analysis namespace file] @@ -60,26 +63,31 @@ (map (partial read-var file vars)) (sort-by (comp str/lower-case :name))))) -(defn- analyze-file [file] +(defn- analyze-file + "Takes a file and returns then analysis map corresponding to its namespace" + [file] (binding [an/*analyze-deps* false] - (an/analyze-file file))) + (env/with-compiler-env (an/empty-env) + (an/no-warn + (an/analyze-file file) ;; side-effects + (an/find-ns (:ns (an/parse-ns file))))))) (defn- read-file [path file] (try - (let [analysis (analyze-file (io/file path file))] - (apply merge - (for [namespace (keys (::an/namespaces analysis))] - {namespace - (-> (get-in analysis [::an/namespaces namespace]) - (assoc :name namespace) - (assoc :publics (read-publics analysis namespace file)) - (update-some :doc correct-indent))}))) + (let [ns-analysis (analyze-file (io/file path file)) + ns-name (:name ns-analysis)] + {ns-name (-> ns-analysis + (assoc :name ns-name) + (assoc :publics (read-publics ns-analysis ns-analysis file)) + (update-some :doc correct-indent) + (dissoc :use-macros :excludes :requires :imports :uses :defs + :require-macros ::an/constants))}) (catch Exception e (println - (format "Could not generate clojurescript documentation for %s - root cause: %s %s" - file - (.getName (class e)) - (.getMessage e)))))) + (format "Could not generate clojurescript documentation for %s - root cause: %s %s" + file + (.getName (class e)) + (.getMessage e)))))) (defn read-namespaces "Read ClojureScript namespaces from a source directory (defaults to @@ -90,7 +98,7 @@ :name - the name of the namespace :doc - the doc-string on the namespace :author - the author of the namespace - :publics + :publics - a collection of vars, each containing: :name - the name of a public function, macro, or value :file - the file the var was declared in :line - the line at which the var was declared