resolve ^Type hint to canonical class name in var :tag

(def ^String tv ...) left (:tag (meta (var tv))) as the unresolved "String";
the JVM compiler resolves the hint to java.lang.String at def time. Add a
resolve-class-hint host seam (built from the existing class-token table) and
resolve a def's :tag through it in the analyzer. The reader path
(read-string "^String x") stays unresolved, matching the JVM (only the
compiler resolves). Closes ^Type-tag-on-var.
This commit is contained in:
Yogthos 2026-06-21 23:52:47 -04:00
parent d1c2811d13
commit 7db5fabc8d
5 changed files with 32 additions and 9 deletions

View file

@ -405,7 +405,7 @@
{:suite "type" :expr "(type (random-uuid))" :expected ":jolt/uuid"}
{:suite "type" :expr "(type (ex-info \"x\" {}))" :expected ":jolt/ex-info"}
{:suite "var_meta" :expr "(do (def ^:private pv 1) (:private (meta (var pv))))" :expected "true"}
{:suite "var_meta" :expr "(do (def ^String tv \"a\") (:tag (meta (var tv))))" :expected "String"}
{:suite "var_meta" :expr "(do (def ^String tv \"a\") (:tag (meta (var tv))))" :expected "java.lang.String"}
{:suite "var_meta" :expr "(do (def dv2 \"hi\" 1) (:doc (meta (var dv2))))" :expected "hi"}
{:suite "var_meta" :expr "(do (def mv 1) (:name (meta (var mv))))" :expected "mv"}
{:suite "var_meta" :expr "(do (def nv 1) (:ns (meta (var nv))))" :expected "user"}