diff --git a/CHANGES.md b/CHANGES.md index e0beedc..b9d9053 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,6 +1,7 @@ ## 1.1.2-SNAPSHOT * Eliminate reflection warning +* Bug fix: Fix inline compiler symbol handling so class references can be used as constants within paths ## 1.1.1 - 2018-04-23 diff --git a/src/clj/com/rpl/specter.cljc b/src/clj/com/rpl/specter.cljc index 4401da1..8738cfd 100644 --- a/src/clj/com/rpl/specter.cljc +++ b/src/clj/com/rpl/specter.cljc @@ -166,7 +166,10 @@ embed (i/maybe-direct-nav path (-> s meta :direct-nav))] `(com.rpl.specter.impl/->LocalSym ~path (quote ~embed))) ;; var-get doesn't work in cljs, so capture the val in the macro instead - `(com.rpl.specter.impl/->VarUse ~path (var ~path) (quote ~path))) + `(com.rpl.specter.impl/->VarUse + ~path + ~(if-not (instance? Class (resolve path)) `(var ~path)) + (quote ~path))) (i/fn-invocation? path) diff --git a/src/clj/com/rpl/specter/impl.cljc b/src/clj/com/rpl/specter/impl.cljc index 6b34a1e..fd4f602 100644 --- a/src/clj/com/rpl/specter/impl.cljc +++ b/src/clj/com/rpl/specter/impl.cljc @@ -702,16 +702,18 @@ (preserve-map magic-precompilation* o) (instance? VarUse o) - (if (dynamic-var? (:avar o)) - (->DynamicVal (maybe-direct-nav - (:sym o) - (or (-> o :avar direct-nav?) - (-> o :sym direct-nav?)))) - (maybe-direct-nav - (:val o) - (or (-> o :avar direct-nav?) - (-> o :sym direct-nav?) - (-> o :val direct-nav?)))) + (let [v (:avar o)] + ;; v can be nil if the symbol referred to an imported class + (if (and v (dynamic-var? v)) + (->DynamicVal (maybe-direct-nav + (:sym o) + (or (direct-nav? v) + (-> o :sym direct-nav?)))) + (maybe-direct-nav + (:val o) + (or (and v (direct-nav? v)) + (-> o :sym direct-nav?) + (-> o :val direct-nav?))))) (instance? LocalSym o) (->DynamicVal (:sym o)) diff --git a/test/com/rpl/specter/core_test.cljc b/test/com/rpl/specter/core_test.cljc index 17b49d2..759ab22 100644 --- a/test/com/rpl/specter/core_test.cljc +++ b/test/com/rpl/specter/core_test.cljc @@ -1679,6 +1679,12 @@ {:a [{:b 2 :c 1}]}]))) ) +#?(:clj + (deftest class-constant-test + (let [f (fn [p] (fn [v] (str p (inc v))))] + (is (= (str String 2) (multi-transform (s/terminal (f String)) 1))) + ))) + #?(:clj (do (defprotocolpath FooPP)