Skip to content

Commit 18fae8b

Browse files
committed
CLJS-1062: Incorrect deftype/defrecord definition leads to complex error messages
Modified version of Julian Eluard's patch which includes def case as well as the constructor name.
1 parent b9ad9c1 commit 18fae8b

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

src/clj/cljs/core.clj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -963,6 +963,11 @@
963963
[~@fields]
964964
(new ~rname ~@field-values))))
965965

966+
(defn- validate-fields
967+
[case name fields]
968+
(when-not (vector? fields)
969+
(throw (AssertionError. (core/str case " " name ", no fields vector given.")))))
970+
966971
(defmacro deftype
967972
"(deftype name [fields*] options* specs*)
968973
@@ -1013,6 +1018,7 @@
10131018
Given (deftype TypeName ...), a factory function called ->TypeName
10141019
will be defined, taking positional parameters for the fields"
10151020
[t fields & impls]
1021+
(validate-fields "deftype" t fields)
10161022
(let [env &env
10171023
r (:name (cljs.analyzer/resolve-var (dissoc env :locals) t))
10181024
[fpps pmasks] (prepare-protocol-masks env impls)
@@ -1172,6 +1178,7 @@
11721178
defined: ->TypeName, taking positional parameters for the fields,
11731179
and map->TypeName, taking a map of keywords to field values."
11741180
[rsym fields & impls]
1181+
(validate-fields "defrecord" rsym fields)
11751182
(let [rsym (vary-meta rsym assoc :internal-ctor true)
11761183
r (vary-meta
11771184
(:name (cljs.analyzer/resolve-var (dissoc &env :locals) rsym))

0 commit comments

Comments
 (0)