|
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