|
475 | 475 | (emits "(function(){throw " throw "})()")
|
476 | 476 | (emitln "throw " throw ";")))
|
477 | 477 |
|
478 |
| -(defn munge-param [line] |
479 |
| - (if (re-find #"@param" line) |
480 |
| - (let [[p t n & xs] (map string/trim |
481 |
| - (string/split (string/trim line) #" "))] |
| 478 | +(defn resolve-type [env t] |
| 479 | + (str (:name (ana/resolve-var env (symbol t))))) |
| 480 | + |
| 481 | +(defn resolve-types [env ts] |
| 482 | + (let [ts (-> ts string/trim (subs 1 (dec (count ts)))) |
| 483 | + xs (string/split ts #"\|")] |
| 484 | + (str |
| 485 | + "{" |
| 486 | + (->> (map #(resolve-type env %) xs) |
| 487 | + (map munge) |
| 488 | + (string/join "|")) |
| 489 | + "}"))) |
| 490 | + |
| 491 | +(defn munge-param-return [env line] |
| 492 | + (cond |
| 493 | + (re-find #"@param" line) |
| 494 | + (let [[p ts n & xs] (map string/trim |
| 495 | + (string/split (string/trim line) #" "))] |
482 | 496 | (if (and (= "@param" p)
|
483 |
| - t #?(:clj (.startsWith ^String t "{") |
484 |
| - :cljs (gstring/startsWith t "{"))) |
485 |
| - (string/join " " (concat [p t (munge n)] xs)) |
| 497 | + ts #?(:clj (.startsWith ^String ts "{") |
| 498 | + :cljs (gstring/startsWith ts "{"))) |
| 499 | + (string/join " " (concat [p (resolve-types env ts) (munge n)] xs)) |
486 | 500 | line))
|
487 |
| - line)) |
| 501 | + |
| 502 | + (re-find #"@return" line) |
| 503 | + (let [[p ts & xs] (map string/trim |
| 504 | + (string/split (string/trim line) #" "))] |
| 505 | + (if (and (= "@return" p) |
| 506 | + ts #?(:clj (.startsWith ^String ts "{") |
| 507 | + :cljs (gstring/startsWith ts "{"))) |
| 508 | + (string/join " " (concat [p (resolve-types env ts)] xs)) |
| 509 | + line)) |
| 510 | + |
| 511 | + :else line)) |
488 | 512 |
|
489 | 513 | (defn emit-comment
|
490 | 514 | "Emit a nicely formatted comment string."
|
491 |
| - [doc jsdoc] |
492 |
| - (let [docs (when doc [doc]) |
493 |
| - docs (if jsdoc (concat docs jsdoc) docs) |
494 |
| - docs (remove nil? docs)] |
495 |
| - (letfn [(print-comment-lines [e] |
496 |
| - (let [[x & ys] (map munge-param (string/split-lines e))] |
497 |
| - (emitln " * " (string/replace x "*/" "* /")) |
498 |
| - (doseq [next-line ys] |
499 |
| - (emitln " * " |
500 |
| - (-> next-line |
501 |
| - (string/replace #"^ " "") |
502 |
| - (string/replace "*/" "* /"))))))] |
503 |
| - (when (seq docs) |
504 |
| - (emitln "/**") |
505 |
| - (doseq [e docs] |
506 |
| - (when e |
507 |
| - (print-comment-lines e))) |
508 |
| - (emitln " */"))))) |
| 515 | + ([doc jsdoc] |
| 516 | + (emit-comment nil doc jsdoc)) |
| 517 | + ([env doc jsdoc] |
| 518 | + (let [docs (when doc [doc]) |
| 519 | + docs (if jsdoc (concat docs jsdoc) docs) |
| 520 | + docs (remove nil? docs)] |
| 521 | + (letfn [(print-comment-lines [e] |
| 522 | + (let [[x & ys] (map #(munge-param-return env %) (string/split-lines e))] |
| 523 | + (emitln " * " (string/replace x "*/" "* /")) |
| 524 | + (doseq [next-line ys] |
| 525 | + (emitln " * " |
| 526 | + (-> next-line |
| 527 | + (string/replace #"^ " "") |
| 528 | + (string/replace "*/" "* /"))))))] |
| 529 | + (when (seq docs) |
| 530 | + (emitln "/**") |
| 531 | + (doseq [e docs] |
| 532 | + (when e |
| 533 | + (print-comment-lines e))) |
| 534 | + (emitln " */")))))) |
509 | 535 |
|
510 | 536 | (defn valid-define-value? [x]
|
511 | 537 | (or (string? x)
|
|
527 | 553 | (defmethod emit* :def
|
528 | 554 | [{:keys [name var init env doc jsdoc export test var-ast]}]
|
529 | 555 | (let [mname (munge name)]
|
530 |
| - (emit-comment doc (concat jsdoc (:jsdoc init))) |
| 556 | + (emit-comment env doc (concat jsdoc (:jsdoc init))) |
531 | 557 | (when (:def-emits-var env)
|
532 | 558 | (when (= :return (:context env))
|
533 | 559 | (emitln "return ("))
|
|
0 commit comments