Skip to content

Commit 960bb9b

Browse files
author
dnolen
committed
CLJS-1897: Too many externs generated
1 parent 19cc394 commit 960bb9b

2 files changed

Lines changed: 59 additions & 55 deletions

File tree

src/main/clojure/cljs/compiler.cljc

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1516,21 +1516,25 @@
15161516

15171517
(defn emit-externs
15181518
([externs]
1519-
(emit-externs [] externs (atom #{})))
1520-
([prefix externs top-level]
1519+
(emit-externs [] externs (atom #{})
1520+
(when env/*compiler*
1521+
(::ana/externs @env/*compiler*))))
1522+
([prefix externs top-level known-externs]
15211523
(loop [ks (seq (keys externs))]
15221524
(when ks
15231525
(let [k (first ks)
15241526
[top :as prefix'] (conj prefix k)]
1525-
(when-not (= 'prototype k)
1526-
(if-not (contains? @top-level top)
1527+
(when (and (not= 'prototype k)
1528+
(nil? (get-in known-externs prefix')))
1529+
(if-not (or (contains? @top-level top)
1530+
(contains? known-externs top))
15271531
(do
15281532
(emitln "var " (string/join "." (map munge prefix')) ";")
15291533
(swap! top-level conj top))
15301534
(emitln (string/join "." (map munge prefix')) ";")))
15311535
(let [m (get externs k)]
15321536
(when-not (empty? m)
1533-
(emit-externs prefix' m top-level))))
1537+
(emit-externs prefix' m top-level known-externs))))
15341538
(recur (next ks))))))
15351539

15361540
#?(:clj

src/test/clojure/cljs/analyzer_tests.clj

Lines changed: 50 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -725,23 +725,23 @@
725725
(fn [& args]
726726
(.apply (.-log js/console) js/console (into-array args)))
727727
(js/console.log js/Number.MAX_VALUE)
728-
(js/console.log js/Symbol.iterator)]))
729-
(cc/emit-externs
730-
(reduce util/map-merge {}
731-
(map (comp :externs second)
732-
(get @test-cenv ::a/namespaces))))))
728+
(js/console.log js/Symbol.iterator)])
729+
(cc/emit-externs
730+
(reduce util/map-merge {}
731+
(map (comp :externs second)
732+
(get @test-cenv ::a/namespaces)))))))
733733

734734
(let [test-cenv (atom {::a/externs (externs/externs-map)})]
735735
(binding [a/*cljs-ns* a/*cljs-ns*
736736
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
737737
(e/with-compiler-env test-cenv
738738
(a/analyze-form-seq
739739
'[(defn foo [^js/React.Component c]
740-
(.render c))]))
741-
(cc/emit-externs
742-
(reduce util/map-merge {}
743-
(map (comp :externs second)
744-
(get @test-cenv ::a/namespaces))))))
740+
(.render c))])
741+
(cc/emit-externs
742+
(reduce util/map-merge {}
743+
(map (comp :externs second)
744+
(get @test-cenv ::a/namespaces)))))))
745745

746746
;; works, does not generate extern
747747
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -751,11 +751,11 @@
751751
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
752752
(e/with-compiler-env test-cenv
753753
(a/analyze-form-seq
754-
'[(js/console.log (.wozMethod (js/baz)))]))
755-
(cc/emit-externs
756-
(reduce util/map-merge {}
757-
(map (comp :externs second)
758-
(get @test-cenv ::a/namespaces))))))
754+
'[(js/console.log (.wozMethod (js/baz)))])
755+
(cc/emit-externs
756+
(reduce util/map-merge {}
757+
(map (comp :externs second)
758+
(get @test-cenv ::a/namespaces)))))))
759759

760760
;; works, does not generate extern
761761
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -766,11 +766,11 @@
766766
(e/with-compiler-env test-cenv
767767
(a/analyze-form-seq
768768
'[(defn afun [^js/Foo x]
769-
(.wozMethod x))]))
770-
(cc/emit-externs
771-
(reduce util/map-merge {}
772-
(map (comp :externs second)
773-
(get @test-cenv ::a/namespaces))))))
769+
(.wozMethod x))])
770+
(cc/emit-externs
771+
(reduce util/map-merge {}
772+
(map (comp :externs second)
773+
(get @test-cenv ::a/namespaces)))))))
774774

775775
;; FIXME: generates externs we know about including the one we don't
776776
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -782,11 +782,11 @@
782782
(a/analyze-form-seq
783783
'[(defn afun [^js/Foo.Bar x]
784784
(let [z (.baz x)]
785-
(.wozz z)))]))
786-
(cc/emit-externs
787-
(reduce util/map-merge {}
788-
(map (comp :externs second)
789-
(get @test-cenv ::a/namespaces))))))
785+
(.wozz z)))])
786+
(cc/emit-externs
787+
(reduce util/map-merge {}
788+
(map (comp :externs second)
789+
(get @test-cenv ::a/namespaces)))))))
790790

791791
;; works, generates extern
792792
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -797,11 +797,11 @@
797797
(e/with-compiler-env test-cenv
798798
(a/analyze-form-seq
799799
'[(defn baz [^js/Foo a]
800-
(.gozMethod a))]))
801-
(cc/emit-externs
802-
(reduce util/map-merge {}
803-
(map (comp :externs second)
804-
(get @test-cenv ::a/namespaces))))))
800+
(.gozMethod a))])
801+
(cc/emit-externs
802+
(reduce util/map-merge {}
803+
(map (comp :externs second)
804+
(get @test-cenv ::a/namespaces)))))))
805805

806806
;; works, generates extern
807807
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -811,11 +811,11 @@
811811
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
812812
(e/with-compiler-env test-cenv
813813
(a/analyze-form-seq
814-
'[(.gozMethod (js/baz))]))
815-
(cc/emit-externs
816-
(reduce util/map-merge {}
817-
(map (comp :externs second)
818-
(get @test-cenv ::a/namespaces))))))
814+
'[(.gozMethod (js/baz))])
815+
(cc/emit-externs
816+
(reduce util/map-merge {}
817+
(map (comp :externs second)
818+
(get @test-cenv ::a/namespaces)))))))
819819

820820
;; known extern
821821
(let [test-cenv (atom {::a/externs (externs/externs-map
@@ -825,11 +825,11 @@
825825
a/*cljs-warnings* (assoc a/*cljs-warnings* :infer-warning true)]
826826
(e/with-compiler-env test-cenv
827827
(a/analyze-form-seq
828-
'[(.gozMethod (js/baz))]))
829-
(cc/emit-externs
830-
(reduce util/map-merge {}
831-
(map (comp :externs second)
832-
(get @test-cenv ::a/namespaces))))))
828+
'[(.gozMethod (js/baz))])
829+
(cc/emit-externs
830+
(reduce util/map-merge {}
831+
(map (comp :externs second)
832+
(get @test-cenv ::a/namespaces)))))))
833833

834834
(let [test-cenv (atom {::a/externs (externs/externs-map
835835
(closure/load-externs
@@ -840,11 +840,11 @@
840840
(a/analyze-form-seq
841841
'[(fn [^js/Foo.Bar x]
842842
(let [z (.baz x)]
843-
(.-wozz z)))]))
844-
(cc/emit-externs
845-
(reduce util/map-merge {}
846-
(map (comp :externs second)
847-
(get @test-cenv ::a/namespaces))))))
843+
(.-wozz z)))])
844+
(cc/emit-externs
845+
(reduce util/map-merge {}
846+
(map (comp :externs second)
847+
(get @test-cenv ::a/namespaces)))))))
848848

849849
(let [test-cenv (atom {::a/externs (externs/externs-map
850850
(closure/load-externs
@@ -855,10 +855,10 @@
855855
(a/analyze-form-seq
856856
'[(ns foo.core)
857857
(def React (js/require "react"))
858-
(.log js/console (.-Component React))]))
859-
(cc/emit-externs
860-
(reduce util/map-merge {}
861-
(map (comp :externs second)
862-
(get @test-cenv ::a/namespaces))))))
858+
(.log js/console (.-Component React))])
859+
(cc/emit-externs
860+
(reduce util/map-merge {}
861+
(map (comp :externs second)
862+
(get @test-cenv ::a/namespaces)))))))
863863

864864
)

0 commit comments

Comments
 (0)