Skip to content

Commit c8248ec

Browse files
committed
towards solution
1 parent 4f46d46 commit c8248ec

File tree

5 files changed

+29
-11
lines changed

5 files changed

+29
-11
lines changed

src/sci/impl/analyzer.cljc

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -596,12 +596,16 @@
596596
binding-name (if t (vary-meta binding-name
597597
assoc :tag t)
598598
binding-name)
599-
binding-meta (meta binding-name)
600-
t (when m (:tag binding-meta))
601-
binding-name (if (symbol? t)
602-
(vary-meta binding-name
603-
assoc :tag-class (interop/resolve-type-hint ctx t))
604-
binding-name)
599+
#?@(:clj [binding-meta (meta binding-name)
600+
t (when m (:tag binding-meta))
601+
binding-name (if (symbol? t)
602+
(vary-meta binding-name
603+
assoc :tag-class
604+
(or (interop/resolve-type-hint ctx t)
605+
(records/resolve-record-class ctx t)
606+
(throw-error-with-location
607+
(str "Unable to resolve classname: " t) t)))
608+
binding-name)])
605609
v (analyze ctx binding-value)
606610
new-iden (gensym)
607611
cb (:closure-bindings ctx)

src/sci/impl/doseq_macro.cljc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
~@(when needrec [recform]))
3737
~recform)]))
3838
(let [seq- (gensym "seq_")
39-
chunk- (with-meta (gensym "chunk_")
39+
chunk- (gensym "chunk_") #_(with-meta (gensym "chunk_")
4040
{:tag 'clojure.lang.IChunk})
4141
count- (gensym "count_")
4242
i- (gensym "i_")

src/sci/impl/interop.cljc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,9 +159,10 @@
159159
'char Character/TYPE
160160
'chars (Class/forName "[C")}))
161161

162-
(defn resolve-type-hint [ctx sym]
163-
(or (get prim->class sym)
164-
(:class (resolve-class-opts ctx sym))))
162+
#?(:clj
163+
(defn resolve-type-hint [ctx sym]
164+
(or (get prim->class sym)
165+
(:class (resolve-class-opts ctx sym)))))
165166

166167
#?(:clj
167168
(def ->array-class

src/sci/impl/resolve.cljc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,10 @@
195195
#?@(:clj [tag (with-meta
196196
{:tag tag
197197
:tag-class (or tag-class
198-
(interop/resolve-type-hint ctx tag))})])
198+
(interop/resolve-type-hint ctx tag)
199+
(records/resolve-record-class ctx tag)
200+
(throw-error-with-location
201+
(str "Unable to resolve classname: " tag) tag))})])
199202
mutable? (vary-meta assoc :mutable true))]
200203
v))]
201204
[k v]))

test/sci/interop_test.cljc

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,3 +332,13 @@
332332

333333
#?(:cljs (deftest local-interop-test
334334
(is (= 1 (tu/eval* "(let [j #js {:a (fn [] 1)}] (j.a))" nil)))))
335+
336+
(deftest type-hint-test
337+
(testing "type hinting with runnable returns nil on futuretask get"
338+
#?(:clj
339+
(let [config {:classes {'java.util.concurrent.Executors java.util.concurrent.Executors 'java.util.concurrent.ThreadPoolExecutor java.util.concurrent.ThreadPoolExecutor 'java.util.concurrent.Callable java.util.concurrent.Callable 'java.util.concurrent.FutureTask java.util.concurrent.FutureTask 'java.lang.Runnable java.lang.Runnable}}]
340+
(is (nil? (sci/eval-string "(def fut (let [^java.lang.Runnable f (fn [] 3)] (.submit (java.util.concurrent.Executors/newCachedThreadPool) f))) (.get fut)" config))))))
341+
(testing "type hinting with callable returns nil on futuretask get"
342+
#?(:clj
343+
(let [config {:classes {'java.util.concurrent.Executors java.util.concurrent.Executors 'java.util.concurrent.ThreadPoolExecutor java.util.concurrent.ThreadPoolExecutor 'java.util.concurrent.Callable java.util.concurrent.Callable 'java.util.concurrent.FutureTask java.util.concurrent.FutureTask 'java.lang.Runnable java.lang.Runnable}}]
344+
(is (= 3 (sci/eval-string "(def fut (let [^java.util.concurrent.Callable f (fn [] 3)] (.submit (java.util.concurrent.Executors/newCachedThreadPool) f))) (.get fut)" config)))))))

0 commit comments

Comments
 (0)