File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 10561056 (and (empty? (next pre))
10571057 (not (contains? ret :info )))
10581058 (assoc :info info'))]
1059- (if (and (:ctor info') (= 'Function (:tag info')))
1059+ ; ; handle actual occurrences of types, i.e. `Console`
1060+ (if (and (or (:ctor info') (:iface info')) (= 'Function (:tag info')))
10601061 (or
10611062 ; ; then check for "static" property
10621063 (resolve-extern (next pre) externs' top
10721073 (assoc ret :resolved []))))
10731074
10741075 (or
1075- ; ; If the tag isn't Function or undefined,
1076- ; ; try to resolve it similar to the super case above
1076+ ; ; If the tag of the property isn't Function or undefined,
1077+ ; ; try to resolve it similar to the super case above,
1078+ ; ; this handles singleton cases like `console`
10771079 (let [tag (:tag info')]
10781080 (when (and tag (not (contains? '#{Function undefined} tag)))
1079- (resolve-extern (into [tag] (next pre)) externs top
1081+ ; ; check prefix first, during cljs.externs parsing we always generate prefixes
1082+ ; ; for tags because of types like webCrypto.Crypto
1083+ (resolve-extern (into (or (-> tag meta :prefix ) [tag]) (next pre)) externs top
10801084 (assoc ret :resolved []))))
10811085
10821086 ; ; assume static property
Original file line number Diff line number Diff line change 6161 (and (= type :string-lit )
6262 (= " undefined" value)))
6363
64+ (defn add-prefix
65+ " Externs inference uses :prefix meta to both resolve externs as well as generate
66+ missing externs information. Google Closure Compiler default externs includes
67+ nested types like webCrypto.Crypto. Add prefix information to the returned symbol to
68+ simplify resolution later."
69+ [type-str]
70+ (with-meta (symbol type-str)
71+ {:prefix (->> (string/split (name type-str) #"\. " )
72+ (map symbol) vec)}))
73+
6474(defn simplify-texpr
6575 [texpr]
6676 (case (:type texpr)
67- :string-lit (some-> (:value texpr) symbol)
68- (:star :qmark ) 'any
69- :bang (simplify-texpr (-> texpr :children first))
77+ :string-lit (some-> (:value texpr) add-prefix)
78+ :star 'any
79+ ; ; TODO: qmark should probably be #{nil T}
80+ (:qmark :bang ) (simplify-texpr (-> texpr :children first))
7081 :pipe (let [[x y] (:children texpr)]
7182 (if (undefined? y)
7283 (simplify-texpr x)
Original file line number Diff line number Diff line change 7575 (is (= '[Console prototype log]
7676 (-> (ana/resolve-extern '[console log] externs) :resolved )))
7777 (is (= '[undefined]
78- (-> (ana/resolve-extern '[undefined] externs) :resolved )))))
78+ (-> (ana/resolve-extern '[undefined] externs) :resolved )))
79+ (is (= '[webCrypto Crypto prototype subtle]
80+ (-> (ana/resolve-extern '[crypto subtle] externs) :resolved )))))
7981
8082(comment
8183 (clojure.test/test-vars [#'test-resolve-extern])
You can’t perform that action at this time.
0 commit comments