Skip to content

Commit b7481f7

Browse files
committed
* externs parsing comments
* doc externs-map * add info helper, doc * update eval comments
1 parent e78c6cd commit b7481f7

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

src/main/clojure/cljs/externs.clj

+32-5
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,8 @@
124124
(when (> (.getChildCount node) 0)
125125
(parse-extern-node (.getFirstChild node))))
126126

127+
;; Handle:
128+
;; Math.hypot = function(...) {...};
127129
(defmethod parse-extern-node Token/ASSIGN [^Node node]
128130
(when (> (.getChildCount node) 0)
129131
(let [ty (get-var-info node)
@@ -253,7 +255,20 @@
253255
externs (index-externs (parse-externs externs-file))))
254256
defaults sources))))
255257

256-
(def externs-map (memoize externs-map*))
258+
(def ^{:doc "Returns a map of externs in the form:
259+
260+
{foo {bar {baz {}
261+
woz {...}}
262+
263+
JavaScript var information is not held in the map itself, but on the
264+
symbols in the map. See the helper `info` for grabbing the metadata.
265+
The metadata map matches the layout of var info of the ClojureScript
266+
analyzer: :file & :line, method info, :ret-tag, :tag, :doc, etc.
267+
are all available.
268+
269+
See also `parse-externs`."}
270+
externs-map
271+
(memoize externs-map*))
257272

258273
(defn ns-match? [ns-segs var-segs]
259274
(or
@@ -313,6 +328,16 @@
313328
(parse-externs (resource->source-file rsrc))
314329
(:module desc))}))))
315330

331+
(defn info
332+
"Helper for grabbing var info from an externs map.
333+
334+
See `externs-map`"
335+
[externs props]
336+
(-> externs
337+
(get-in (butlast props))
338+
(find (last props))
339+
first meta))
340+
316341
(comment
317342
(require '[clojure.java.io :as io]
318343
'[cljs.closure :as closure]
@@ -354,8 +379,7 @@
354379
[(closure/js-source-file "goog/date/date.js"
355380
(io/input-stream (io/resource "goog/date/date.js")))]
356381
{})
357-
(get-in '[goog date month])
358-
)
382+
(get-in '[goog date month]))
359383

360384
(pprint (analyze-goog-file "goog/date/date.js" 'goog.date.month))
361385

@@ -385,15 +409,15 @@
385409
(->
386410
(filter
387411
(fn [s]
388-
(= "externs.zip//webkit_dom.js" (.getName s)))
412+
(= "externs.zip//whatwg_console.js" (.getName s)))
389413
(default-externs))
390414
first parse-externs index-externs
391415
(find 'console) first meta)
392416

393417
(->
394418
(filter
395419
(fn [s]
396-
(= "externs.zip//webkit_dom.js" (.getName s)))
420+
(= "externs.zip//whatwg_console.js" (.getName s)))
397421
(default-externs))
398422
first parse-externs index-externs
399423
(get-in '[Console prototype])
@@ -402,8 +426,11 @@
402426
(require '[clojure.java.io :as io]
403427
'[cljs.closure :as cc])
404428

429+
;; react.ext.js needs to be available
405430
(-> (cc/js-source-file nil (io/file "react.ext.js"))
406431
parse-externs index-externs
407432
(get 'React)
408433
(find 'Component) first meta)
434+
435+
(-> (info (externs-map) '[Number isNaN]) :ret-tag) ;; => boolean
409436
)

0 commit comments

Comments
 (0)