From 5a94364bed25852d7ba8d2a9792deca6d057b91c Mon Sep 17 00:00:00 2001 From: davidnolen Date: Thu, 20 Nov 2025 20:56:33 -0500 Subject: [PATCH] Support Persistent/VECTOR in a backwards compatible way If we have a symbol of the form A/B and the following conditions are met: 1. A is not an namespace alias 2. A is not a dotted symbol 3. A is an unqualifed var defined or referred in the current ns Then interpret A/B as A.B Note this means that namespace aliases will always shadow unqualified vars defined or referred in the current ns --- src/main/clojure/cljs/analyzer.cljc | 37 ++++++++++++++++++----------- 1 file changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/clojure/cljs/analyzer.cljc b/src/main/clojure/cljs/analyzer.cljc index 321489c303..aa52f6fc9d 100644 --- a/src/main/clojure/cljs/analyzer.cljc +++ b/src/main/clojure/cljs/analyzer.cljc @@ -1313,6 +1313,10 @@ {:name sym} lb)) +(defn qualified->dotted + [sym] + (symbol (str (namespace sym) "." (name sym)))) + (defn resolve-var "Resolve a var. Accepts a side-effecting confirm fn for producing warnings about unresolved vars." @@ -1356,20 +1360,25 @@ (some? lb) (assoc lb :op :local) (some? (namespace sym)) - (let [ns (namespace sym) - ns (if #?(:clj (= "clojure.core" ns) - :cljs (identical? "clojure.core" ns)) - "cljs.core" - ns) - full-ns (resolve-ns-alias env ns - (or (and (js-module-exists? ns) - (gets @env/*compiler* :js-module-index ns :name)) - (symbol ns)))] - (when (some? confirm) - (when (not= current-ns full-ns) - (confirm-ns env full-ns)) - (confirm env full-ns (symbol (name sym)))) - (resolve* env sym full-ns current-ns)) + (let [ns (namespace sym)] + (if-let [resolved (and (nil? (resolve-ns-alias env ns nil)) + (not (dotted-symbol? ns)) + (resolve-var env (symbol ns) nil false) + (resolve-var env (qualified->dotted sym) nil false))] + resolved + (let [ns (if #?(:clj (= "clojure.core" ns) + :cljs (identical? "clojure.core" ns)) + "cljs.core" + ns) + full-ns (resolve-ns-alias env ns + (or (and (js-module-exists? ns) + (gets @env/*compiler* :js-module-index ns :name)) + (symbol ns)))] + (when (some? confirm) + (when (not= current-ns full-ns) + (confirm-ns env full-ns)) + (confirm env full-ns (symbol (name sym)))) + (resolve* env sym full-ns current-ns)))) (dotted-symbol? sym) (let [idx (.indexOf s ".")