From 9a07ad48ab59db02d1fca17619f3b51902d149ff Mon Sep 17 00:00:00 2001 From: Stuart Sierra Date: Fri, 17 Jul 2015 16:26:46 -0400 Subject: [PATCH] Port dependency, parse, and track to .cljc Affects these namespaces: - clojure.tools.namespace.dependency - clojure.tools.namespace.parse - clojure.tools.namespace.track With minor changes, these files are platform-neutral. c.t.n.dependency is a general-purpose library which has many applications outside of tools.namespace. The uses for c.t.n.parse and c.t.n.track in ClojureScript are less apparent, but they are easy to port. Perhaps by porting other namespaces it will be possible in the future to have a version of c.t.n.repl that works on non-JVM platforms. --- pom.xml | 15 ++++ .../{dependency.clj => dependency.cljc} | 9 ++- .../tools/namespace/{parse.clj => parse.cljc} | 70 +++++++++---------- .../tools/namespace/{track.clj => track.cljc} | 0 4 files changed, 56 insertions(+), 38 deletions(-) rename src/main/clojure/clojure/tools/namespace/{dependency.clj => dependency.cljc} (97%) rename src/main/clojure/clojure/tools/namespace/{parse.clj => parse.cljc} (63%) rename src/main/clojure/clojure/tools/namespace/{track.clj => track.cljc} (100%) 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