diff --git a/pom.xml b/pom.xml
index 80cc93a..6b265be 100644
--- a/pom.xml
+++ b/pom.xml
@@ -10,6 +10,20 @@
0.1.2
+
+
+ org.clojure
+ clojure
+ 1.7.0
+ provided
+
+
+ org.clojure
+ tools.reader
+ 0.10.0-alpha1
+
+
+
true
@@ -26,4 +40,5 @@
git@github.com:clojure/tools.namespace.git
HEAD
+
diff --git a/src/main/clojure/clojure/tools/namespace/dependency.clj b/src/main/clojure/clojure/tools/namespace/dependency.cljc
similarity index 97%
rename from src/main/clojure/clojure/tools/namespace/dependency.clj
rename to src/main/clojure/clojure/tools/namespace/dependency.cljc
index 96a5e9e..3c6b54a 100644
--- a/src/main/clojure/clojure/tools/namespace/dependency.clj
+++ b/src/main/clojure/clojure/tools/namespace/dependency.cljc
@@ -142,6 +142,10 @@
(remove-node g' node)
(clojure.set/union (set more) (set add)))))))
+(def ^:private max-number
+ #?(:clj Long/MAX_VALUE
+ :cljs js/Number.MAX_VALUE))
+
(defn topo-comparator
"Returns a comparator fn which produces a topological sort based on
the dependencies in graph. Nodes not present in the graph will sort
@@ -149,6 +153,5 @@
[graph]
(let [pos (zipmap (topo-sort graph) (range))]
(fn [a b]
- (compare (get pos a Long/MAX_VALUE)
- (get pos b Long/MAX_VALUE)))))
-
+ (compare (get pos a max-number)
+ (get pos b max-number)))))
diff --git a/src/main/clojure/clojure/tools/namespace/parse.clj b/src/main/clojure/clojure/tools/namespace/parse.cljc
similarity index 63%
rename from src/main/clojure/clojure/tools/namespace/parse.clj
rename to src/main/clojure/clojure/tools/namespace/parse.cljc
index 78a8fc0..846981b 100644
--- a/src/main/clojure/clojure/tools/namespace/parse.clj
+++ b/src/main/clojure/clojure/tools/namespace/parse.cljc
@@ -10,24 +10,9 @@
:doc "Parse Clojure namespace (ns) declarations and extract
dependencies."}
clojure.tools.namespace.parse
- (:require [clojure.set :as set]))
-
-(defn- read-clj
- "Calls clojure.core/read. If reader conditionals are
- supported (Clojure 1.7) then adds options {:read-cond :allow}."
- [rdr]
- (if (resolve 'clojure.core/reader-conditional?)
- (read {:read-cond :allow} rdr)
- (read rdr)))
-
-(defn- force-errors
- "Forces reader errors to be thrown immediately. Some versions of
- Clojure accept invalid forms in the reader and only throw an
- exception when they are printed.
- See http://dev.clojure.org/jira/browse/TNS-1"
- [form]
- (str form) ; str forces errors
- form)
+ (:require #?(:clj [clojure.tools.reader :as reader]
+ :cljs [cljs.tools.reader :as reader])
+ [clojure.set :as set]))
(defn comment?
"Returns true if form is a (comment ...)"
@@ -40,21 +25,23 @@
(and (list? form) (= 'ns (first form))))
(defn read-ns-decl
- "Attempts to read a (ns ...) declaration from a
- java.io.PushbackReader, and returns the unevaluated form. Returns
- the first top-level ns form found. Returns nil if read fails or if a
- ns declaration cannot be found. Note that read can execute code
- (controlled by *read-eval*), and as such should be used only with
- trusted sources."
- [rdr]
- {:pre [(instance? java.io.PushbackReader rdr)]}
- (try
+ "Attempts to read a (ns ...) declaration from a reader, and returns
+ the unevaluated form. Returns the first top-level ns form found.
+ Returns nil if a ns declaration cannot be found. Note that read can
+ execute code (controlled by tools.reader/*read-eval*), and as such
+ should be used only with trusted sources. read-opts is passed
+ through to tools.reader/read, defaults to allow conditional reader
+ expressions with :clj"
+ ([rdr]
+ (read-ns-decl rdr {:read-cond :allow
+ :features #{:clj}}))
+ ([rdr read-opts]
(loop []
- (let [form (force-errors (read-clj rdr))]
- (if (ns-decl? form)
- form
- (recur))))
- (catch Exception e nil)))
+ (let [form (reader/read (assoc read-opts :eof ::eof) rdr)]
+ (cond
+ (ns-decl? form) form
+ (= ::eof form) nil
+ :else (recur))))))
;;; Parsing dependencies
@@ -91,12 +78,25 @@
(keyword? form) ; Some people write (:require ... :reload-all)
nil
:else
- (throw (IllegalArgumentException.
- (pr-str "Unparsable namespace form:" form)))))
+ (throw (ex-info "Unparsable namespace form"
+ {:reason ::unparsable-ns-form
+ :form form}))))
+
+(def ^:private ns-clause-head-names
+ "Set of symbol/keyword names which can appear as the head of a
+ clause in the ns form."
+ #{"use" "require" "use-macros" "require-macros"})
+
+(def ^:private ns-clause-heads
+ "Set of all symbols and keywords which can appear at the head of a
+ dependency clause in the ns form."
+ (set (mapcat (fn [name] (list (keyword name)
+ (symbol name)))
+ ns-clause-head-names)))
(defn- deps-from-ns-form [form]
(when (and (sequential? form) ; should be list but sometimes is not
- (contains? #{:use :require 'use 'require} (first form)))
+ (contains? ns-clause-heads (first form)))
(mapcat #(deps-from-libspec nil %) (rest form))))
(defn deps-from-ns-decl
diff --git a/src/main/clojure/clojure/tools/namespace/track.clj b/src/main/clojure/clojure/tools/namespace/track.cljc
similarity index 100%
rename from src/main/clojure/clojure/tools/namespace/track.clj
rename to src/main/clojure/clojure/tools/namespace/track.cljc
pFad - Phonifier reborn
Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies:
Alternative Proxy
pFad Proxy
pFad v3 Proxy
pFad v4 Proxy