Skip to content

Commit 13fde33

Browse files
committed
CLJS-3120: Add :sigs to protocol var for compatibility with Clojure
Renamed cljs.core/warn-and-update-protocol to something more sensible - update-protocol-var. Add :sigs to protocol var which matches Clojure data shape. Add test case to cljs.analyzer-tests. Add some helpers - cached core analysis, and analyze-forms helper to drop some boilerplate.
1 parent 8ce0d0d commit 13fde33

File tree

2 files changed

+47
-6
lines changed

2 files changed

+47
-6
lines changed

src/main/clojure/cljs/core.cljc

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,7 @@
14091409
(core/defn- to-property [sym]
14101410
(symbol (core/str "-" sym)))
14111411

1412-
(core/defn- warn-and-update-protocol [p type env]
1412+
(core/defn- update-protocol-var [p type env]
14131413
(core/when-not (= 'Object p)
14141414
(core/if-let [var (cljs.analyzer/resolve-existing-var (dissoc env :locals) p)]
14151415
(do
@@ -1440,7 +1440,7 @@
14401440
ret)))
14411441

14421442
(core/defn- base-assign-impls [env resolve tsym type [p sigs]]
1443-
(warn-and-update-protocol p tsym env)
1443+
(update-protocol-var p tsym env)
14441444
(core/let [psym (resolve p)
14451445
pfn-prefix (subs (core/str psym) 0
14461446
(clojure.core/inc (.indexOf (core/str psym) "/")))]
@@ -1526,7 +1526,7 @@
15261526
meths))))
15271527

15281528
(core/defn- proto-assign-impls [env resolve type-sym type [p sigs]]
1529-
(warn-and-update-protocol p type env)
1529+
(update-protocol-var p type env)
15301530
(core/let [psym (resolve p)
15311531
pprefix (protocol-prefix psym)
15321532
skip-flag (set (core/-> type-sym meta :skip-protocol-flag))]
@@ -2101,8 +2101,7 @@
21012101
~check)]
21022102
`(~sig ~check)))
21032103
psym (core/-> psym
2104-
(vary-meta update-in [:jsdoc] conj
2105-
"@interface")
2104+
(vary-meta update-in [:jsdoc] conj "@interface")
21062105
(vary-meta assoc-in [:protocol-info :methods]
21072106
(into {}
21082107
(map
@@ -2112,6 +2111,16 @@
21122111
sigs (take-while vector? sigs)]
21132112
[(vary-meta fname assoc :doc doc)
21142113
(vec sigs)]))
2114+
methods)))
2115+
;; for compatibility with Clojure
2116+
(vary-meta assoc-in [:sigs]
2117+
(into {}
2118+
(map
2119+
(core/fn [[fname & sigs]]
2120+
(core/let [doc (core/as-> (last sigs) doc
2121+
(core/when (core/string? doc) doc))
2122+
sigs (take-while vector? sigs)]
2123+
[(keyword fname) {:name fname :arglists (list* sigs) :doc doc}]))
21152124
methods))))
21162125
method (core/fn [[fname & sigs]]
21172126
(core/let [doc (core/as-> (last sigs) doc

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,22 @@
186186

187187
(def test-cenv (atom {}))
188188
(def test-env (assoc-in (ana/empty-env) [:ns :name] 'cljs.core))
189+
(def test-core-env (atom {}))
190+
191+
(binding [ana/*unchecked-if* false
192+
ana/*analyze-deps* false]
193+
(env/with-compiler-env test-core-env
194+
(comp/with-core-cljs nil
195+
(fn []))))
196+
197+
(defn core-env []
198+
(atom @test-core-env))
199+
200+
(defn analyze-forms [cenv xs]
201+
(binding [ana/*unchecked-if* false
202+
ana/*analyze-deps* false]
203+
(env/with-compiler-env cenv
204+
(ana/analyze-form-seq xs))))
189205

190206
(ana/no-warn
191207
(env/with-compiler-env test-cenv
@@ -2021,4 +2037,20 @@
20212037
(:tag (analyze test-env '(munge-str ""))))))
20222038
(is (= 'string
20232039
(env/with-compiler-env test-cenv
2024-
(:tag (analyze test-env '(demunge-str "")))))))
2040+
(:tag (analyze test-env '(demunge-str "")))))))
2041+
2042+
(deftest test-cljs-3120
2043+
(let [cenv (core-env)
2044+
_ (analyze-forms cenv
2045+
'[(ns goz.core)
2046+
(defprotocol IAlpha
2047+
(foo [this] "foo fn")
2048+
(bar [this x] "bar fn")
2049+
(woz [this x y] "baz fn"))])
2050+
sigs (get-in @cenv [::ana/namespaces 'goz.core :defs 'IAlpha :sigs])]
2051+
(is (= #{:foo :bar :woz} (set (keys sigs))))
2052+
(is (every? #(set/subset? #{:name :doc :arglists} (set (keys %))) (vals sigs)))
2053+
(is #(= '#{foo bar woz} (set (map :name (vals sigs)))))
2054+
(is #(= '#{([this] [this x] [this x y])} (set (map :arglists (vals sigs)))))
2055+
(is #(= '#{"foo fn" "bar fn" "baz fn"} (set (map :doc (vals sigs)))))))
2056+

0 commit comments

Comments
 (0)