Skip to content

Commit 67096a2

Browse files
committed
Fix babashka/babashka#1339: resolve record name with dot
1 parent 85aac80 commit 67096a2

File tree

2 files changed

+39
-28
lines changed

2 files changed

+39
-28
lines changed

src/sci/impl/parser.cljc

+36-28
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,22 @@
1515

1616
(def read-eval
1717
(utils/new-var '*read-eval* false {:ns utils/clojure-core-ns
18-
:dynamic true}))
18+
:dynamic true}))
1919

2020
(def data-readers
2121
(utils/new-var '*data-readers* {}
22-
{:ns utils/clojure-core-ns
23-
:dynamic true}))
22+
{:ns utils/clojure-core-ns
23+
:dynamic true}))
2424

2525
(def default-data-reader-fn
2626
(utils/new-var '*default-data-reader-fn* nil
27-
{:ns utils/clojure-core-ns
28-
:dynamic true}))
27+
{:ns utils/clojure-core-ns
28+
:dynamic true}))
2929

3030
(def reader-resolver
3131
(utils/new-var '*reader-resolver* nil
32-
{:ns utils/clojure-core-ns
33-
:dynamic true}))
32+
{:ns utils/clojure-core-ns
33+
:dynamic true}))
3434

3535
(def default-opts
3636
(edamame/normalize-opts
@@ -56,36 +56,44 @@
5656
(let [env @(:env ctx)
5757
sym-ns (when-let [n (namespace sym)]
5858
(symbol n))
59-
sym-name-str (name sym)
6059
current-ns (utils/current-ns-name)
6160
current-ns-str (str current-ns)
6261
namespaces (get env :namespaces)
6362
the-current-ns (get namespaces current-ns)
6463
aliases (:aliases the-current-ns)
64+
res-without-sym
65+
(fn res-without-sym [sym]
66+
(let [sym-name-str (name sym)]
67+
(or (when-let [refers (:refers the-current-ns)]
68+
(when-let [v (get refers sym)]
69+
(var->sym v)))
70+
(when-let [v (get the-current-ns sym)]
71+
(var->sym v))
72+
(when (or (and (contains? (get namespaces 'clojure.core) sym)
73+
;; only valid when the symbol isn't excluded
74+
(not (some-> the-current-ns
75+
:refer
76+
(get 'clojure.core)
77+
:exclude
78+
(contains? sym ))))
79+
(contains? utils/ana-macros sym))
80+
(symbol "clojure.core" sym-name-str))
81+
(interop/fully-qualify-class ctx sym)
82+
;; all unresolvable symbols all resolved in the current namespace
83+
(if (str/includes? sym-name-str ".")
84+
;; NOTE: this should probably be moved to edamame at some
85+
;; point, but it's at a pristine 1.0.0 status right now ;)
86+
(if (str/ends-with? sym-name-str ".")
87+
(symbol (str (res-without-sym (symbol (subs sym-name-str 0 (dec (count sym-name-str))))) "."))
88+
;; unresolved class
89+
sym)
90+
(symbol current-ns-str sym-name-str)))))
6591
ret (if-not sym-ns
66-
(or (when-let [refers (:refers the-current-ns)]
67-
(when-let [v (get refers sym)]
68-
(var->sym v)))
69-
(when-let [v (get the-current-ns sym)]
70-
(var->sym v))
71-
(when (or (and (contains? (get namespaces 'clojure.core) sym)
72-
;; only valid when the symbol isn't excluded
73-
(not (some-> the-current-ns
74-
:refer
75-
(get 'clojure.core)
76-
:exclude
77-
(contains? sym ))))
78-
(contains? utils/ana-macros sym))
79-
(symbol "clojure.core" sym-name-str))
80-
(interop/fully-qualify-class ctx sym)
81-
;; all unresolvable symbols all resolved in the current namespace
82-
(if (str/includes? sym-name-str ".")
83-
sym ;; unresolved class
84-
(symbol current-ns-str sym-name-str)))
92+
(res-without-sym sym)
8593
(if (get-in env [:namespaces sym-ns])
8694
sym
8795
(if-let [ns (get aliases sym-ns)]
88-
(symbol (str ns) sym-name-str)
96+
(symbol (str ns) (name sym))
8997
sym)))]
9098
ret))
9199

test/sci/records_test.cljc

+3
Original file line numberDiff line numberDiff line change
@@ -206,3 +206,6 @@
206206

207207
(deftest satisfies-IRecord-test
208208
#?(:cljs (is (true? (sci/eval-string "(defrecord Foo []) (satisfies? IRecord (->Foo))")))))
209+
210+
(deftest resolve-record-test
211+
(is (= '(user.Foo.) (sci/eval-string "(defrecord Foo []) `(Foo.)"))))

0 commit comments

Comments
 (0)