diff --git a/project.clj b/project.clj index 25ecdff..19116a8 100644 --- a/project.clj +++ b/project.clj @@ -7,7 +7,8 @@ :test-paths ["test", "target/test-classes"] :jar-exclusions [#"\.cljx"] :auto-clean false - :dependencies [[org.clojure/tools.macro "0.1.2"]] + :dependencies [[org.clojure/tools.macro "0.1.2"] + [riddley "0.1.12"]] :profiles {:provided {:dependencies [[org.clojure/clojure "1.6.0"] [org.clojure/clojurescript "0.0-3211"]]} diff --git a/src/clj/com/rpl/specter/macros.clj b/src/clj/com/rpl/specter/macros.clj index 3c069ed..de94218 100644 --- a/src/clj/com/rpl/specter/macros.clj +++ b/src/clj/com/rpl/specter/macros.clj @@ -1,7 +1,7 @@ (ns com.rpl.specter.macros (:require [com.rpl.specter.impl :as i] - [clojure.walk :as walk] - [clojure.tools.macro :as m]) + [clojure.tools.macro :as m] + [riddley.walk :as walk]) ) (defn gensyms [amt] @@ -398,6 +398,10 @@ (-> &env keys set) ;clj ) used-locals (vec (i/walk-select local-syms vector path)) + + ;; note: very important to use riddley's macroexpand-all here, so that + ;; &env is preserved in any potential nested calls to select (like via + ;; a view function) expanded (walk/macroexpand-all (vec path)) prepared-path (ic-prepare-path local-syms expanded) possible-params (vec (ic-possible-params expanded)) diff --git a/test/com/rpl/specter/core_test.cljx b/test/com/rpl/specter/core_test.cljx index e207419..87f4f7f 100644 --- a/test/com/rpl/specter/core_test.cljx +++ b/test/com/rpl/specter/core_test.cljx @@ -957,3 +957,15 @@ ))) (s/must-cache-paths! false) ) + +(deftest nested-inline-caching-test + (is (= [[1]] + (let [a :b] + (select + (s/view + (fn [v] + (select [(s/keypath v) (s/keypath a)] + {:a {:b 1}}))) + :a + )))) + )