Skip to content

Commit de6ec36

Browse files
committed
CLJS-3176: Unexpected number of args warning for some closure functions
need to pass the ns being loaded to analyze-goog-file ignore definitions from other provided namespaces add tests
1 parent 850ce95 commit de6ec36

File tree

3 files changed

+53
-18
lines changed

3 files changed

+53
-18
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2591,7 +2591,7 @@
25912591
(let [dep-name (name dep)]
25922592
(when (string/starts-with? dep-name "goog.")
25932593
#?(:clj (let [js-lib (get-in compiler [:js-dependency-index dep-name])
2594-
ns (externs/analyze-goog-file (:file js-lib))]
2594+
ns (externs/analyze-goog-file (:file js-lib) (symbol dep-name))]
25952595
(swap! env/*compiler* update-in [::namespaces dep] merge ns)))))
25962596
#?(:clj (if-some [src (locate-src dep)]
25972597
(analyze-file src opts)

src/main/clojure/cljs/externs.clj

Lines changed: 37 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -192,24 +192,35 @@
192192
externs (index-externs (parse-externs externs-file))))
193193
defaults sources))))
194194

195-
(defn parsed->defs [externs]
196-
(reduce
197-
(fn [m xs]
198-
(let [sym (last xs)]
199-
(cond-> m
200-
(seq xs) (assoc sym (merge (meta sym) {:ns *goog-ns* :name sym})))))
201-
{} externs))
195+
(defn ns-match? [ns-segs var-segs]
196+
(and
197+
(= (inc (count ns-segs)) (count var-segs))
198+
(= ns-segs (take (count ns-segs) var-segs))))
202199

203-
(defn analyze-goog-file [f]
204-
(let [rsrc (io/resource f)
205-
desc (js-deps/parse-js-ns (line-seq (io/reader rsrc)))
206-
ns (-> (:provides desc) first symbol)]
207-
;; TODO: figure out what to do about other provides
208-
(binding [*goog-ns* ns]
209-
{:name ns
210-
:defs (parsed->defs
211-
(parse-externs
212-
(SourceFile/fromInputStream f (io/input-stream rsrc))))})))
200+
(defn parsed->defs [externs]
201+
(let [ns-segs (into [] (map symbol (string/split (str *goog-ns*) #"\.")))]
202+
(reduce
203+
(fn [m xs]
204+
;; ignore definitions from other provided namespaces not under consideration
205+
(if (ns-match? ns-segs xs)
206+
(let [sym (last xs)]
207+
(cond-> m
208+
(seq xs) (assoc sym (merge (meta sym) {:ns *goog-ns* :name sym}))))
209+
m))
210+
{} externs)))
211+
212+
(defn analyze-goog-file
213+
([f]
214+
(analyze-goog-file f nil))
215+
([f ns]
216+
(let [rsrc (io/resource f)
217+
desc (js-deps/parse-js-ns (line-seq (io/reader rsrc)))
218+
ns (or ns (-> (:provides desc) first symbol))]
219+
(binding [*goog-ns* ns]
220+
{:name ns
221+
:defs (parsed->defs
222+
(parse-externs
223+
(SourceFile/fromInputStream f (io/input-stream rsrc))))}))))
213224

214225
(comment
215226
(require '[clojure.java.io :as io]
@@ -246,6 +257,15 @@
246257
(find 'numberAwareCompare_)
247258
first meta)
248259

260+
(-> (externs-map
261+
[(closure/js-source-file "goog/date/date.js"
262+
(io/input-stream (io/resource "goog/date/date.js")))]
263+
{})
264+
(get-in '[goog date month])
265+
)
266+
267+
(pprint (analyze-goog-file "goog/date/date.js" 'goog.date.month))
268+
249269
(externs-map)
250270

251271
(-> (externs-map)

src/test/clojure/cljs/externs_parsing_test.clj

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,18 @@
2121
(= (count (distinct xs))
2222
(count xs)))
2323
externs))))
24+
25+
(deftest cljs-3176
26+
(let [ns (externs/analyze-goog-file "goog/date/date.js")
27+
v (get-in ns [:defs 'getWeekNumber])]
28+
(is (= 3 (-> v :method-params first count))))
29+
(let [ns (externs/analyze-goog-file "goog/date/date.js" 'goog.date.month)]
30+
(is (= 12 (-> ns :defs count)))))
31+
32+
(comment
33+
34+
(test/run-tests)
35+
36+
(externs/analyze-goog-file "goog/date/date.js" 'goog.date.month)
37+
38+
)

0 commit comments

Comments
 (0)