Skip to content

Commit 9b54d4d

Browse files
committed
CLJS-1404: var resolution for @param and @return type
1 parent 3f3cb6d commit 9b54d4d

File tree

1 file changed

+53
-27
lines changed

1 file changed

+53
-27
lines changed

src/main/clojure/cljs/compiler.cljc

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -475,37 +475,63 @@
475475
(emits "(function(){throw " throw "})()")
476476
(emitln "throw " throw ";")))
477477

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) #" "))]
482496
(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))
486500
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))
488512

489513
(defn emit-comment
490514
"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 " */"))))))
509535

510536
(defn valid-define-value? [x]
511537
(or (string? x)
@@ -527,7 +553,7 @@
527553
(defmethod emit* :def
528554
[{:keys [name var init env doc jsdoc export test var-ast]}]
529555
(let [mname (munge name)]
530-
(emit-comment doc (concat jsdoc (:jsdoc init)))
556+
(emit-comment env doc (concat jsdoc (:jsdoc init)))
531557
(when (:def-emits-var env)
532558
(when (= :return (:context env))
533559
(emitln "return ("))

0 commit comments

Comments
 (0)