|
124 | 124 | (when (> (.getChildCount node) 0)
|
125 | 125 | (parse-extern-node (.getFirstChild node))))
|
126 | 126 |
|
| 127 | +;; Handle: |
| 128 | +;; Math.hypot = function(...) {...}; |
127 | 129 | (defmethod parse-extern-node Token/ASSIGN [^Node node]
|
128 | 130 | (when (> (.getChildCount node) 0)
|
129 | 131 | (let [ty (get-var-info node)
|
|
253 | 255 | externs (index-externs (parse-externs externs-file))))
|
254 | 256 | defaults sources))))
|
255 | 257 |
|
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*)) |
257 | 272 |
|
258 | 273 | (defn ns-match? [ns-segs var-segs]
|
259 | 274 | (or
|
|
313 | 328 | (parse-externs (resource->source-file rsrc))
|
314 | 329 | (:module desc))}))))
|
315 | 330 |
|
| 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 | + |
316 | 341 | (comment
|
317 | 342 | (require '[clojure.java.io :as io]
|
318 | 343 | '[cljs.closure :as closure]
|
|
354 | 379 | [(closure/js-source-file "goog/date/date.js"
|
355 | 380 | (io/input-stream (io/resource "goog/date/date.js")))]
|
356 | 381 | {})
|
357 |
| - (get-in '[goog date month]) |
358 |
| - ) |
| 382 | + (get-in '[goog date month])) |
359 | 383 |
|
360 | 384 | (pprint (analyze-goog-file "goog/date/date.js" 'goog.date.month))
|
361 | 385 |
|
|
385 | 409 | (->
|
386 | 410 | (filter
|
387 | 411 | (fn [s]
|
388 |
| - (= "externs.zip//webkit_dom.js" (.getName s))) |
| 412 | + (= "externs.zip//whatwg_console.js" (.getName s))) |
389 | 413 | (default-externs))
|
390 | 414 | first parse-externs index-externs
|
391 | 415 | (find 'console) first meta)
|
392 | 416 |
|
393 | 417 | (->
|
394 | 418 | (filter
|
395 | 419 | (fn [s]
|
396 |
| - (= "externs.zip//webkit_dom.js" (.getName s))) |
| 420 | + (= "externs.zip//whatwg_console.js" (.getName s))) |
397 | 421 | (default-externs))
|
398 | 422 | first parse-externs index-externs
|
399 | 423 | (get-in '[Console prototype])
|
|
402 | 426 | (require '[clojure.java.io :as io]
|
403 | 427 | '[cljs.closure :as cc])
|
404 | 428 |
|
| 429 | + ;; react.ext.js needs to be available |
405 | 430 | (-> (cc/js-source-file nil (io/file "react.ext.js"))
|
406 | 431 | parse-externs index-externs
|
407 | 432 | (get 'React)
|
408 | 433 | (find 'Component) first meta)
|
| 434 | + |
| 435 | + (-> (info (externs-map) '[Number isNaN]) :ret-tag) ;; => boolean |
409 | 436 | )
|
0 commit comments