diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 3e789b6dc..e7ab46329 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -3393,7 +3393,7 @@ reduces them without incurring seq initialization" nsc))) :default (garray/defaultCompare (.-name a) (.-name b)))) -(deftype Keyword [ns name fqn ^:mutable _hash] +(deftype Keyword [ns name ^string fqn ^:mutable _hash] Object (toString [_] (str ":" fqn)) (equiv [this other] diff --git a/src/main/clojure/cljs/core.cljc b/src/main/clojure/cljs/core.cljc index 8418c5eca..6a4a2126b 100644 --- a/src/main/clojure/cljs/core.cljc +++ b/src/main/clojure/cljs/core.cljc @@ -936,6 +936,18 @@ (core/list 'js* "debugger") nil)) +(core/defmacro js-doc + [comment] + (core/let [[x & ys] (string/split comment #"\n")] + (core/list 'js* + (core/str + "/**\n" + (core/str " * " x "\n") + (core/->> ys + (map #(core/str " * " (string/replace % #"^ " "") "\n")) + (reduce core/str "")) + " */")))) + (core/defmacro js-comment "Emit a top-level JavaScript multi-line comment. New lines will create a new comment line. Comment block will be preceded and followed by a newline" @@ -1485,12 +1497,16 @@ ~@body)))) (core/defn- add-obj-methods [type type-sym sigs] - (map (core/fn [[f & meths :as form]] - (core/let [[f meths] (if (vector? (first meths)) - [f [(rest form)]] - [f meths])] - `(set! ~(extend-prefix type-sym f) - ~(with-meta `(fn ~@(map #(adapt-obj-params type %) meths)) (meta form))))) + (mapcat + (core/fn [[f & meths :as form]] + (core/let [[f meths] (if (vector? (first meths)) + [f [(rest form)]] + [f meths]) + exp [`(set! ~(extend-prefix type-sym f) + ~(with-meta `(fn ~@(map #(adapt-obj-params type %) meths)) (meta form)))]] + (if (= f 'toString) + (into [`(js-doc "@return {string}\n@override")] exp) + exp))) sigs)) (core/defn- ifn-invoke-methods [type type-sym [f & meths :as form]]