Skip to content

Commit c0ea680

Browse files
committed
wip
1 parent e1eb9a8 commit c0ea680

File tree

2 files changed

+22
-10
lines changed

2 files changed

+22
-10
lines changed

src/sci/impl/analyzer.cljc

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,12 @@
575575
closure-idx (get-in new-cb (conj parents :syms ob))]
576576
closure-idx))
577577

578+
(defn resolve-type-hint [ctx t]
579+
(or (interop/resolve-type-hint ctx t)
580+
(records/resolve-record-class ctx t)
581+
(throw-error-with-location
582+
(str "Unable to resolve classnamex: " t) t)))
583+
578584
(defn analyze-let*
579585
[ctx expr destructured-let-bindings exprs]
580586
(if (> (count destructured-let-bindings)
@@ -601,10 +607,7 @@
601607
binding-name (if (symbol? t)
602608
(vary-meta binding-name
603609
assoc :tag-class
604-
(delay (or (interop/resolve-type-hint ctx t)
605-
(records/resolve-record-class ctx t)
606-
(throw-error-with-location
607-
(str "Unable to resolve classnamex: " t) t))))
610+
(delay (resolve-type-hint ctx t)))
608611
binding-name)])
609612
v (analyze ctx binding-value)
610613
new-iden (gensym)
@@ -1062,9 +1065,14 @@
10621065
has-types? (volatile! nil)])]
10631066
#?(:clj (when arg-types
10641067
(areduce args idx _ret nil
1065-
(when-let [t (:tag-class (meta (aget args idx)))]
1066-
(vreset! has-types? true)
1067-
(aset arg-types idx (force t))))))
1068+
(let [arg-meta (meta (aget args idx))]
1069+
(if-let [t (:tag-class arg-meta)]
1070+
(do (vreset! has-types? true)
1071+
(aset arg-types idx (force t)))
1072+
(when-let [t (:tag arg-meta)]
1073+
(let [t (resolve-type-hint ctx t)]
1074+
(do (vreset! has-types? true)
1075+
(aset arg-types idx (force t))))))))))
10681076
(with-meta (sci.impl.types/->Node
10691077
(eval/eval-instance-method-invocation
10701078
ctx bindings instance-expr meth-name field-access args arg-count

test/sci/interop_test.cljc

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,13 @@
337337
(deftest type-hint-test
338338
(testing "string type hints"
339339
(is (string? (sci/eval-string "(defn read-string [^\"[B\" v] (String. v)) (read-string \"1\")"))))
340-
(testing "type hinting with runnable returns nil on futuretask get"
341-
(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}}]
342-
(is (nil? (sci/eval-string "(def fut (let [^java.lang.Runnable f (fn [] 3)] (.submit (java.util.concurrent.Executors/newCachedThreadPool) f))) (.get fut)" config)))))
340+
(testing "runnable"
341+
(testing "type hinting with runnable returns nil on futuretask get"
342+
(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}}]
343+
(is (nil? (sci/eval-string "(def fut (let [^java.lang.Runnable f (fn [] 3)] (.submit (java.util.concurrent.Executors/newCachedThreadPool) f))) (.get fut)" config)))))
344+
(testing "type hinting on expression with runnable returns nil on futuretask get"
345+
(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}}]
346+
(is (nil? (sci/eval-string "(def fut (let [f (fn [] 3)] (.submit (java.util.concurrent.Executors/newCachedThreadPool) ^java.lang.Runnable f))) (.get fut)" config))))))
343347
(testing "type hinting with callable returns nil on futuretask get"
344348
(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}}]
345349
(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)