Skip to content

Commit 2ff3b08

Browse files
committed
(wip)
* bump glib * :require module loader instead of :import - not a legacy namespace anymore * add goog.module handling case to analyzer * add goog.module handling case to compiler * add tests
1 parent 71c6f47 commit 2ff3b08

File tree

9 files changed

+99
-7
lines changed

9 files changed

+99
-7
lines changed

deps.edn

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
org.clojure/clojure {:mvn/version "1.10.0"}
66
org.clojure/core.specs.alpha {:mvn/version "0.1.24"}
77
org.clojure/data.json {:mvn/version "0.2.6"}
8-
org.clojure/google-closure-library {:mvn/version "0.0-20201211-3e6c510d"}
8+
org.clojure/google-closure-library {:mvn/version "0.0-20210811-6da97fe1"}
99
org.clojure/spec.alpha {:mvn/version "0.1.143"}
1010
org.clojure/tools.reader {:mvn/version "1.3.3"}
1111
org.clojure/test.check {:mvn/version "0.10.0-alpha3"}}

pom.template.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
<dependency>
3636
<groupId>org.clojure</groupId>
3737
<artifactId>google-closure-library</artifactId>
38-
<version>0.0-20201211-3e6c510d</version>
38+
<version>0.0-20210811-6da97fe1</version>
3939
</dependency>
4040
<dependency>
4141
<groupId>org.clojure</groupId>

project.clj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
[org.clojure/tools.reader "1.3.3"]
1616
[org.clojure/test.check "0.10.0-alpha3" :scope "test"]
1717
[com.cognitect/transit-clj "0.8.309"]
18-
[org.clojure/google-closure-library "0.0-20201211-3e6c510d"]
18+
[org.clojure/google-closure-library "0.0-20210811-6da97fe1"]
1919
[com.google.javascript/closure-compiler-unshaded "v20210808"]]
2020
:profiles {:1.6 {:dependencies [[org.clojure/clojure "1.6.0"]]}
2121
:uberjar {:aot :all :main cljs.main}

script/bootstrap

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ CORE_SPECS_ALPHA_RELEASE="0.1.24"
88
CLOSURE_RELEASE="20210808"
99
DJSON_RELEASE="0.2.6"
1010
TRANSIT_RELEASE="0.8.309"
11-
GCLOSURE_LIB_RELEASE="0.0-20201211-3e6c510d"
11+
GCLOSURE_LIB_RELEASE="0.0-20210811-6da97fe1"
1212
TREADER_RELEASE="1.3.3"
1313
TEST_CHECK_RELEASE="0.10.0-alpha3"
1414

src/main/cljs/cljs/loader.cljs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88

99
(ns cljs.loader
1010
(:require [goog.object :as gobj]
11-
[goog.html.legacyconversions :as legacy])
12-
(:import [goog.module ModuleLoader]
13-
[goog.module ModuleManager]))
11+
[goog.html.legacyconversions :as legacy]
12+
[goog.module.ModuleLoader :as ModuleLoader])
13+
(:import [goog.module ModuleManager]))
1414

1515
(def module-infos MODULE_INFOS) ;; set by compiler
1616
(def module-uris

src/main/clojure/cljs/analyzer.cljc

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,12 @@
812812
(or (contains? global-exports (symbol module))
813813
(contains? global-exports (name module)))))
814814

815+
(defn goog-module-dep?
816+
[module]
817+
(let [[module _] (lib&sublib module)
818+
module-type (get-in @env/*compiler* [:js-dependency-index (str module) :module])]
819+
(= :goog module-type)))
820+
815821
(defn confirm-var-exists
816822
([env prefix suffix]
817823
(let [warn (confirm-var-exist-warning env prefix suffix)]
@@ -1010,6 +1016,9 @@
10101016
(str "node$module$" (munge (string/replace (str name) #"[.\/]" #?(:clj "\\$"
10111017
:cljs "$$")))))
10121018

1019+
(defn munge-goog-module-lib [name]
1020+
(str "goog$module$" (munge (string/replace (str name) #"[.\/]" #?(:clj "\\$" :cljs "$$")))))
1021+
10131022
(defn munge-global-export [name]
10141023
(str "global$module$" (munge (string/replace (str name) #"[.\/]" #?(:clj "\\$"
10151024
:cljs "$$")))))
@@ -1031,6 +1040,7 @@
10311040

10321041
(defn ns->module-type [ns]
10331042
(cond
1043+
(goog-module-dep? ns) :goog-module
10341044
(js-module-exists? ns) :js
10351045
(node-module-dep? ns) :node
10361046
(dep-has-global-exports? ns) :global))
@@ -1072,6 +1082,12 @@
10721082
:op :js-var
10731083
:foreign true}))
10741084

1085+
(defmethod resolve* :goog-module
1086+
[env sym full-ns current-ns]
1087+
{:name (symbol (str current-ns) (str (munge-goog-module-lib full-ns) "." (name sym)))
1088+
:ns current-ns
1089+
:op :var})
1090+
10751091
(defmethod resolve* :global
10761092
[env sym full-ns current-ns]
10771093
(let [pre (extern-pre sym current-ns)]

src/main/clojure/cljs/compiler.cljc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1294,6 +1294,9 @@
12941294
(let [{node-libs true libs-to-load false} (group-by ana/node-module-dep? libs)]
12951295
[node-libs libs-to-load])
12961296
[nil libs]))
1297+
[goog-modules libs-to-load] (let [{goog-modules true libs-to-load false}
1298+
(group-by ana/goog-module-dep? libs-to-load)]
1299+
[goog-modules libs-to-load])
12971300
global-exports-libs (filter ana/dep-has-global-exports? libs-to-load)]
12981301
(when (-> libs meta :reload-all)
12991302
(emitln "if(!COMPILED) " loaded-libs-temp " = " loaded-libs " || cljs.core.set([\"cljs.core\"]);")
@@ -1336,11 +1339,21 @@
13361339
:else
13371340
(when-not (= lib 'goog)
13381341
(emitln "goog.require('" (munge lib) "');"))))
1342+
;; Node Libraries
13391343
(doseq [lib node-libs]
13401344
(let [[lib' sublib] (ana/lib&sublib lib)]
13411345
(emitln (munge ns-name) "."
13421346
(ana/munge-node-lib lib)
13431347
" = require('" lib' "')" (sublib-select sublib) ";")))
1348+
;; Google Closure Library Modules (i.e. goog.module(...))
1349+
;; these must be assigned to vars
1350+
(doseq [lib goog-modules]
1351+
(let [[lib' sublib] (ana/lib&sublib lib)]
1352+
(emitln "goog.require('" lib' "');")
1353+
(emitln (munge ns-name) "."
1354+
(ana/munge-goog-module-lib lib)
1355+
" = goog.module.get('" lib' "')" (sublib-select sublib) ";")))
1356+
;; Global Exports
13441357
(doseq [lib global-exports-libs]
13451358
(let [{:keys [global-exports]} (get js-dependency-index (name (-> lib ana/lib&sublib first)))]
13461359
(emit-global-export ns-name global-exports lib)))
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
(ns cljs.analyzer.glib-module-test
2+
(:require [cljs.analyzer :as ana]
3+
[cljs.analyzer-tests :as ana-tests]
4+
[clojure.test :as test :refer [deftest is testing]]
5+
[cljs.env :as env]))
6+
7+
(deftest glib-module-detect-test
8+
(testing "Basic glib module detection"
9+
(is (= :goog (get-in @ana-tests/test-cenv [:js-dependency-index (munge "goog.module.ModuleLoader") :module])))))
10+
11+
(deftest glib-module-predicate-test
12+
(testing "glib module detection predicate"
13+
(env/with-compiler-env ana-tests/test-cenv
14+
(is (ana/goog-module-dep? 'goog.module.ModuleLoader)))))
15+
16+
(deftest glib-module-classification-test
17+
(testing "glib module classification"
18+
(env/with-compiler-env ana-tests/test-cenv
19+
(is (= :goog-module (ana/ns->module-type 'goog.module.ModuleLoader))))))
20+
21+
(deftest glib-module-resolve-var-test
22+
(testing "glib module var resolution"
23+
(let [cenv (env/default-compiler-env)
24+
ns-ast (ana-tests/analyze-forms cenv
25+
'[(ns foo.core
26+
(:require [goog.module.ModuleLoader :as module-loader]))])
27+
aenv (assoc (ana/empty-env) :ns (ana/get-namespace cenv 'foo.core))]
28+
(is (= '{:name foo.core/goog$module$goog$module$ModuleLoader.EventType
29+
:ns foo.core
30+
:op :var}
31+
(env/with-compiler-env cenv
32+
(ana/resolve-var aenv 'module-loader/EventType)))))))
33+
34+
(comment
35+
36+
(test/test-vars [#'glib-module-resolve-var-test])
37+
(test/run-tests)
38+
39+
)
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
(ns cljs.compiler.glib-module-test
2+
(:require [cljs.compiler :as comp]
3+
[cljs.compiler-tests :as comp-tests]
4+
[cljs.env :as env]
5+
[clojure.test :as test :refer [deftest is testing]]))
6+
7+
(deftest test-glib-module-compile
8+
(testing "glib modules compiled to Closure Compile expectations"
9+
(env/with-compiler-env (env/default-compiler-env)
10+
(comp-tests/compile-form-seq
11+
'[(ns test.foo
12+
(:require [goog.module.ModuleLoader :as module-loader]))
13+
(def EVENTS module-loader/EVENTS)]))))
14+
15+
(comment
16+
17+
(println
18+
(env/with-compiler-env (env/default-compiler-env)
19+
(comp-tests/compile-form-seq
20+
'[(ns test.foo
21+
(:require [goog.module.ModuleLoader :as module-loader]))
22+
(def EVENTS module-loader/EVENTS)])))
23+
24+
)

0 commit comments

Comments
 (0)