Skip to content

Commit 0f54664

Browse files
committedMar 3, 2025
- add type simplifier
1 parent ef98670 commit 0f54664

File tree

1 file changed

+31
-17
lines changed

1 file changed

+31
-17
lines changed
 

‎src/main/clojure/cljs/externs.clj

+31-17
Original file line numberDiff line numberDiff line change
@@ -42,25 +42,39 @@
4242
{Token/BANG :bang
4343
Token/BLOCK :block
4444
Token/PIPE :pipe
45-
Token/STRINGLIT :string-lit})
45+
Token/STRINGLIT :string-lit
46+
Token/QMARK :qmark
47+
Token/STAR :star})
4648

4749
(defn parse-texpr [^Node root]
48-
(let [token (get token->kw (.getToken root))
49-
children (.children root)]
50-
(merge
51-
{:type token}
52-
(when-not (empty? children)
53-
{:children (vec (map parse-texpr (.children root)))})
54-
(when (= :string-lit token)
55-
{:value (.getString root)}))))
50+
(when-let [token (get token->kw (.getToken root))]
51+
(let [children (.children root)]
52+
(merge
53+
{:type token}
54+
(when-not (empty? children)
55+
{:children (vec (map parse-texpr (.children root)))})
56+
(when (= :string-lit token)
57+
{:value (.getString root)})))))
58+
59+
(defn undefined?
60+
[{:keys [type value] :as texpr}]
61+
(and (= type :string-lit)
62+
(= "undefined" value)))
63+
64+
(defn simplify-texpr
65+
[texpr]
66+
(case (:type texpr)
67+
:string-lit (some-> (:value texpr) symbol)
68+
(:star :qmark) 'any
69+
:bang (simplify-texpr (-> texpr :children first))
70+
:pipe (let [[x y] (:children texpr)]
71+
(if (undefined? y)
72+
(simplify-texpr x)
73+
'any))
74+
'any))
5675

5776
(defn get-tag [^JSTypeExpression texpr]
58-
(when-let [root (.getRoot texpr)]
59-
(if (.isString root)
60-
(symbol (.getString root))
61-
(if-let [child (.. root getFirstChild)]
62-
(if (.isString child)
63-
(symbol (.. child getString)))))))
77+
(some-> (.getRoot texpr) parse-texpr simplify-texpr))
6478

6579
(defn params->method-params [xs]
6680
(letfn [(not-opt? [x]
@@ -172,7 +186,7 @@
172186
[lhs])
173187
[]))))
174188

175-
(defmethod parse-extern-node Token/GETPROP [node]
189+
(defmethod parse-extern-node Token/GETPROP [^Node node]
176190
(when-not *ignore-var*
177191
(let [props (map symbol (string/split (.getQualifiedName node) #"\."))]
178192
[(if-let [ty (get-var-info node)]
@@ -181,7 +195,7 @@
181195

182196
;; JavaScript Object literal
183197
;; { ... }
184-
(defmethod parse-extern-node Token/OBJECTLIT [node]
198+
(defmethod parse-extern-node Token/OBJECTLIT [^Node node]
185199
(when (> (.getChildCount node) 0)
186200
(loop [nodes (.children node)
187201
externs []]

0 commit comments

Comments
 (0)
Failed to load comments.