fix + test for when dynamic navs ignore dynamic params

This commit is contained in:
Nathan Marz 2016-09-02 08:41:02 -04:00
parent f925e1814c
commit 0c50e1859d
3 changed files with 34 additions and 19 deletions

View file

@ -766,18 +766,32 @@
:else :else
(coerce-nav o))) (coerce-nav o)))
(defn used-locals [locals-set form]
(let [used-locals-cell (mutable-cell [])]
(walk/postwalk
(fn [e]
(if (contains? locals-set e)
(update-cell! used-locals-cell #(conj % e))
e))
form)
(get-cell used-locals-cell)))
(defn magic-precompilation [path ns-str used-locals] (defn magic-precompilation [path ns-str used-locals-list]
; (println "before magic-precompilation*:" path) ; (println "before magic-precompilation*:" path)
(let [path (magic-precompilation* path) (let [used-locals-set (set used-locals-list)
path (magic-precompilation* path)
; _ (println "magic-precompilation*" path) ; _ (println "magic-precompilation*" path)
ns (find-ns (symbol ns-str)) ns (find-ns (symbol ns-str))
final-code (resolve-magic-code (->DynamicPath path))
;; this handles the case where a dynamicnav ignores a dynamic arg and produces
;; something static instead
static? (empty? (used-locals used-locals-set final-code))
maker (binding [*ns* ns] maker (binding [*ns* ns]
(eval+ (eval+
; (spy ; (spy
`(fn [~@used-locals] `(fn [~@(if static? [] used-locals-list)]
~(resolve-magic-code (->DynamicPath path)))))] ~final-code)))]
(if (static-path? path) (if static?
(->CachedPathInfo false (maker)) (->CachedPathInfo false (maker))
(->CachedPathInfo true maker)))) (->CachedPathInfo true maker))))

View file

@ -137,16 +137,6 @@
`(def ~name (dynamicnav ~@args)))) `(def ~name (dynamicnav ~@args))))
(defn- used-locals [locals-set form]
(let [used-locals-cell (i/mutable-cell [])]
(cljwalk/postwalk
(fn [e]
(if (locals-set e)
(i/update-cell! used-locals-cell #(conj % e))
e))
form)
(i/get-cell used-locals-cell)))
(defn ^:no-doc ic-prepare-path [locals-set path] (defn ^:no-doc ic-prepare-path [locals-set path]
(cond (cond
(vector? path) (vector? path)
@ -174,7 +164,7 @@
:else :else
(if (empty? (used-locals locals-set path)) (if (empty? (i/used-locals locals-set path))
path path
`(com.rpl.specter.impl/->DynamicVal (quote ~path))))) `(com.rpl.specter.impl/->DynamicVal (quote ~path)))))
@ -230,7 +220,7 @@
(-> &env :locals keys set) ;cljs (-> &env :locals keys set) ;cljs
(-> &env keys set)) ;clj (-> &env keys set)) ;clj
used-locals (used-locals local-syms path) used-locals (i/used-locals local-syms path)
;; note: very important to use riddley's macroexpand-all here, so that ;; note: very important to use riddley's macroexpand-all here, so that
;; &env is preserved in any potential nested calls to select (like via ;; &env is preserved in any potential nested calls to select (like via

View file

@ -9,7 +9,8 @@
nav declarepath providepath select select-one select-one! nav declarepath providepath select select-one select-one!
select-first transform setval replace-in select-first transform setval replace-in
select-any selected-any? collected? traverse select-any selected-any? collected? traverse
multi-transform path dynamicnav recursive-path]])) multi-transform path dynamicnav recursive-path
defdynamicnav]]))
(:use (:use
#?(:clj [clojure.test :only [deftest is]]) #?(:clj [clojure.test :only [deftest is]])
#?(:clj [clojure.test.check.clojure-test :only [defspec]]) #?(:clj [clojure.test.check.clojure-test :only [defspec]])
@ -19,7 +20,8 @@
nav declarepath providepath select select-one select-one! nav declarepath providepath select select-one select-one!
select-first transform setval replace-in select-first transform setval replace-in
select-any selected-any? collected? traverse select-any selected-any? collected? traverse
multi-transform path dynamicnav recursive-path]])) multi-transform path dynamicnav recursive-path
defdynamicnav]]))
@ -1273,3 +1275,12 @@
[#(= 100 %) (s/terminal inc)] [#(= 100 %) (s/terminal inc)]
[#(= 101 %) (s/terminal inc)]) [#(= 101 %) (s/terminal inc)])
1)))) 1))))
(defdynamicnav ignorer [a]
s/STAY)
(deftest dynamic-nav-ignores-dynamic-arg
(let [a 1]
(is (= 1 (select-any (ignorer a) 1)))
(is (= 1 (select-any (ignorer :a) 1)))))