|
192 | 192 | externs (index-externs (parse-externs externs-file))))
|
193 | 193 | defaults sources))))
|
194 | 194 |
|
195 |
| -(defn parsed->defs [externs] |
196 |
| - (reduce |
197 |
| - (fn [m xs] |
198 |
| - (let [sym (last xs)] |
199 |
| - (cond-> m |
200 |
| - (seq xs) (assoc sym (merge (meta sym) {:ns *goog-ns* :name sym}))))) |
201 |
| - {} externs)) |
| 195 | +(defn ns-match? [ns-segs var-segs] |
| 196 | + (and |
| 197 | + (= (inc (count ns-segs)) (count var-segs)) |
| 198 | + (= ns-segs (take (count ns-segs) var-segs)))) |
202 | 199 |
|
203 |
| -(defn analyze-goog-file [f] |
204 |
| - (let [rsrc (io/resource f) |
205 |
| - desc (js-deps/parse-js-ns (line-seq (io/reader rsrc))) |
206 |
| - ns (-> (:provides desc) first symbol)] |
207 |
| - ;; TODO: figure out what to do about other provides |
208 |
| - (binding [*goog-ns* ns] |
209 |
| - {:name ns |
210 |
| - :defs (parsed->defs |
211 |
| - (parse-externs |
212 |
| - (SourceFile/fromInputStream f (io/input-stream rsrc))))}))) |
| 200 | +(defn parsed->defs [externs] |
| 201 | + (let [ns-segs (into [] (map symbol (string/split (str *goog-ns*) #"\.")))] |
| 202 | + (reduce |
| 203 | + (fn [m xs] |
| 204 | + ;; ignore definitions from other provided namespaces not under consideration |
| 205 | + (if (ns-match? ns-segs xs) |
| 206 | + (let [sym (last xs)] |
| 207 | + (cond-> m |
| 208 | + (seq xs) (assoc sym (merge (meta sym) {:ns *goog-ns* :name sym})))) |
| 209 | + m)) |
| 210 | + {} externs))) |
| 211 | + |
| 212 | +(defn analyze-goog-file |
| 213 | + ([f] |
| 214 | + (analyze-goog-file f nil)) |
| 215 | + ([f ns] |
| 216 | + (let [rsrc (io/resource f) |
| 217 | + desc (js-deps/parse-js-ns (line-seq (io/reader rsrc))) |
| 218 | + ns (or ns (-> (:provides desc) first symbol))] |
| 219 | + (binding [*goog-ns* ns] |
| 220 | + {:name ns |
| 221 | + :defs (parsed->defs |
| 222 | + (parse-externs |
| 223 | + (SourceFile/fromInputStream f (io/input-stream rsrc))))})))) |
213 | 224 |
|
214 | 225 | (comment
|
215 | 226 | (require '[clojure.java.io :as io]
|
|
246 | 257 | (find 'numberAwareCompare_)
|
247 | 258 | first meta)
|
248 | 259 |
|
| 260 | + (-> (externs-map |
| 261 | + [(closure/js-source-file "goog/date/date.js" |
| 262 | + (io/input-stream (io/resource "goog/date/date.js")))] |
| 263 | + {}) |
| 264 | + (get-in '[goog date month]) |
| 265 | + ) |
| 266 | + |
| 267 | + (pprint (analyze-goog-file "goog/date/date.js" 'goog.date.month)) |
| 268 | + |
249 | 269 | (externs-map)
|
250 | 270 |
|
251 | 271 | (-> (externs-map)
|
|
0 commit comments