Skip to content

Commit 0078d04

Browse files
committed
add :qualified-method :ast, String/.toUpperCase and String/new etc. work
1 parent 7c718ad commit 0078d04

File tree

2 files changed

+36
-13
lines changed

2 files changed

+36
-13
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 28 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4120,6 +4120,7 @@
41204120
(select-keys lb [:name :local :arg-id :variadic? :init])))
41214121
(let [sym-meta (meta sym)
41224122
sym-ns (namespace sym)
4123+
sym-name (name sym)
41234124
cur-ns (str (-> env :ns :name))
41244125
;; when compiling a macros namespace that requires itself, we need
41254126
;; to resolve calls to `my-ns.core/foo` to `my-ns.core$macros/foo`
@@ -4130,21 +4131,35 @@
41304131
(not (gstring/endsWith sym-ns "$macros"))
41314132
(= sym-ns (subs cur-ns 0 (- (count cur-ns) 7))))
41324133
(symbol (str sym-ns "$macros") (name sym))
4133-
sym)])
4134-
info (if-not (contains? sym-meta ::analyzed)
4134+
sym)])]
4135+
(if (and sym-ns
4136+
(nil? (resolve-ns-alias env sym-ns nil))
4137+
(or (= "new" sym-name)
4138+
(string/starts-with? sym-name ".")))
4139+
(merge
4140+
{:op :qualified-method
4141+
:env env
4142+
:form sym
4143+
:class (symbol sym-ns)}
4144+
(if (= "new" sym-name)
4145+
{:kind :new
4146+
:name (symbol sym-name)}
4147+
{:kind :method
4148+
:name (symbol (subs sym-name 1))}))
4149+
(let [info (if-not (contains? sym-meta ::analyzed)
41354150
(resolve-existing-var env sym)
41364151
(resolve-var env sym))]
4137-
(assert (:op info) (:op info))
4138-
(desugar-dotted-expr
4139-
(if-not (true? (:def-var env))
4140-
(merge
4141-
(assoc ret :info info)
4142-
(select-keys info [:op :name :ns :tag])
4143-
(when-let [const-expr (:const-expr info)]
4144-
{:const-expr const-expr}))
4145-
(let [info (resolve-var env sym)]
4146-
(merge (assoc ret :op :var :info info)
4147-
(select-keys info [:op :name :ns :tag]))))))))))
4152+
(assert (:op info) (:op info))
4153+
(desugar-dotted-expr
4154+
(if-not (true? (:def-var env))
4155+
(merge
4156+
(assoc ret :info info)
4157+
(select-keys info [:op :name :ns :tag])
4158+
(when-let [const-expr (:const-expr info)]
4159+
{:const-expr const-expr}))
4160+
(let [info (resolve-var env sym)]
4161+
(merge (assoc ret :op :var :info info)
4162+
(select-keys info [:op :name :ns :tag]))))))))))))
41484163

41494164
(defn excluded?
41504165
#?(:cljs {:tag boolean})

src/main/clojure/cljs/compiler.cljc

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1301,6 +1301,14 @@
13011301
(comma-sep args)
13021302
"))")))
13031303

1304+
(defmethod emit* :qualified-method
1305+
[{ctor :class :keys [args env kind name]}]
1306+
(if (= :new kind)
1307+
(emit-wrap env
1308+
(emits "(function (...args) { return Reflect.construct(" ctor ", args) })"))
1309+
(emit-wrap env
1310+
(emits "(function (x, ...args) { return Reflect.apply(" ctor ".prototype." name ", x, args) })"))))
1311+
13041312
(defmethod emit* :set!
13051313
[{:keys [target val env]}]
13061314
(emit-wrap env (emits "(" target " = " val ")")))

0 commit comments

Comments
 (0)