Skip to content

Commit c247649

Browse files
committed
CLJS-3121: Bad externs parsing for aliased Fns
Add dynamic var *ignore-var*. Skip parsing GETPROP case if *ignore-var* true. Add simple test
1 parent 6057da8 commit c247649

File tree

2 files changed

+22
-6
lines changed

2 files changed

+22
-6
lines changed

src/main/clojure/cljs/externs.clj

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
[com.google.javascript.rhino
1919
Node Token JSTypeExpression]))
2020

21+
(def ^:dynamic *ignore-var* false)
2122
(def ^:dynamic *source-file* nil)
2223

2324
;; ------------------------------------------------------------------------------
@@ -78,7 +79,9 @@
7879
lhs (cond-> (first (parse-extern-node (.getFirstChild node)))
7980
ty (annotate ty))]
8081
(if (> (.getChildCount node) 1)
81-
(let [externs (parse-extern-node (.getChildAtIndex node 1))]
82+
(let [externs
83+
(binding [*ignore-var* true]
84+
(parse-extern-node (.getChildAtIndex node 1)))]
8285
(conj (map (fn [ext] (concat lhs ext)) externs)
8386
lhs))
8487
[lhs]))))
@@ -92,10 +95,11 @@
9295
[lhs])))
9396

9497
(defmethod parse-extern-node Token/GETPROP [node]
95-
(let [props (map symbol (string/split (.getQualifiedName node) #"\."))]
96-
[(if-let [ty (get-type node)]
97-
(annotate props ty)
98-
props)]))
98+
(when-not *ignore-var*
99+
(let [props (map symbol (string/split (.getQualifiedName node) #"\."))]
100+
[(if-let [ty (get-type node)]
101+
(annotate props ty)
102+
props)])))
99103

100104
(defmethod parse-extern-node Token/OBJECTLIT [node]
101105
(when (> (.getChildCount node) 0)
Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,15 @@
11
(ns cljs.externs-parsing-test
2-
(:require [cljs.externs :as externs]
2+
(:require [cljs.closure :as closure]
3+
[cljs.externs :as externs]
4+
[clojure.java.io :as io]
35
[clojure.test :as test :refer [deftest is]]))
6+
7+
(deftest cljs-3121
8+
(let [externs (externs/parse-externs
9+
(closure/js-source-file "goog/string/string.js"
10+
(io/input-stream (io/resource "goog/string/string.js"))))]
11+
(is (every?
12+
(fn [xs]
13+
(= (count (distinct xs))
14+
(count xs)))
15+
externs))))

0 commit comments

Comments
 (0)