allow non-dynamic vars to be treated as constants and add test for constant detection
This commit is contained in:
parent
1b5b19c7c8
commit
21f117503e
2 changed files with 25 additions and 6 deletions
|
|
@ -709,7 +709,9 @@
|
|||
([v] (set-cell! MUST-CACHE-PATHS v)))
|
||||
|
||||
(defn constant-node? [node]
|
||||
(cond (record? node) false
|
||||
(cond (and (instance? VarUse node)
|
||||
(-> node :var meta :dynamic not)) true
|
||||
(record? node) false
|
||||
(number? node) true
|
||||
(keyword? node) true
|
||||
(string? node) true
|
||||
|
|
@ -719,6 +721,16 @@
|
|||
(every? constant-node? (keys node)))
|
||||
:else false))
|
||||
|
||||
(defn extract-constant [node]
|
||||
(cond (some #(% node) [number? keyword? string?]) node
|
||||
(instance? VarUse node) (:val node)
|
||||
(vector? node) (vec (map extract-constant node))
|
||||
(set? node) (set (map extract-constant node))
|
||||
(map? node) (->> node
|
||||
(map (fn [[k v]] [(extract-constant k) (extract-constant v)]))
|
||||
(into {}))
|
||||
:else (throw-illegal "Unknown node " node)))
|
||||
|
||||
|
||||
(defn- extract-original-code [p]
|
||||
(cond
|
||||
|
|
@ -925,7 +937,7 @@
|
|||
(cond
|
||||
(or (root-params-nav? vv) (instance? ParamsNeededPath vv))
|
||||
(if (every? constant-node? ps)
|
||||
(apply vv ps)
|
||||
(apply vv (map extract-constant ps))
|
||||
(do
|
||||
(swap! params-atom #(vec (concat % ps)))
|
||||
(coerce-path vv)))
|
||||
|
|
@ -969,7 +981,7 @@
|
|||
|
||||
(and (fn? vv) (-> vv meta :layerednav))
|
||||
(if (every? constant-node? ps)
|
||||
(apply vv ps)
|
||||
(apply vv (map extract-constant ps))
|
||||
(do
|
||||
(swap! params-atom conj (:code p))
|
||||
(if (= (-> vv meta :layerednav) :lean)
|
||||
|
|
@ -992,7 +1004,7 @@
|
|||
:else
|
||||
(cond (set? p)
|
||||
(if (constant-node? p)
|
||||
p
|
||||
(extract-constant p)
|
||||
(do (swap! params-atom conj p)
|
||||
pred*))
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@
|
|||
nav declarepath providepath select select-one select-one!
|
||||
select-first transform setval replace-in defnavconstructor
|
||||
select-any selected-any? collected? traverse
|
||||
multi-transform]]))
|
||||
multi-transform path]]))
|
||||
(:use
|
||||
#?(:clj [clojure.test :only [deftest is]])
|
||||
#?(:clj [clojure.test.check.clojure-test :only [defspec]])
|
||||
|
|
@ -19,7 +19,7 @@
|
|||
nav declarepath providepath select select-one select-one!
|
||||
select-first transform setval replace-in defnavconstructor
|
||||
select-any selected-any? collected? traverse
|
||||
multi-transform]]))
|
||||
multi-transform path]]))
|
||||
|
||||
|
||||
|
||||
|
|
@ -1341,3 +1341,10 @@
|
|||
|
||||
|
||||
1))))
|
||||
|
||||
(deftest inline-lean-path
|
||||
;; use executors from ALL because it's a lean navigator
|
||||
(let [e (.-executors s/ALL)]
|
||||
(is (identical? e (.-executors (path :a (s/view inc)))))
|
||||
(is (identical? e (.-executors (path (s/keypath :a) (s/srange 2 7)))))
|
||||
(is (identical? e (.-executors (path :a (s/selected? (s/view inc) (s/selected? (s/srange 2 7)))))))))
|
||||
|
|
|
|||
Loading…
Reference in a new issue