|
42 | 42 | symbol?)
|
43 | 43 | (some-fn r/Type? #(isa? % temp-binding))))
|
44 | 44 |
|
45 |
| -(t/ann ^:no-check name-env [-> NameEnv]) |
| 45 | +(t/ann ^:no-check name-env [t/Any -> NameEnv]) |
46 | 46 | (defn name-env [checker]
|
47 | 47 | (get (env/deref-checker checker) impl/current-name-env-kw {}))
|
48 | 48 |
|
|
51 | 51 | (env/swap-checker! checker assoc impl/current-name-env-kw nme-env)
|
52 | 52 | nil)
|
53 | 53 |
|
54 |
| -(t/ann ^:no-check find-type-name-entry [t/Sym t/Any -> (t/Nilable (t/MapEntry t/Sym (t/U t/Kw (t/Delay r/Type) [:-> r/Type])))]) |
| 54 | +(t/ann ^:no-check find-type-name-entry [t/Sym t/Any -> (t/Nilable (t/MapEntry t/Sym (t/U t/Kw r/Type)))]) |
55 | 55 | (defn find-type-name-entry [sym opts]
|
56 |
| - (or (find (name-env (env/checker opts)) sym) |
57 |
| - (when-some [sym-nsym ((requiring-resolve (impl/impl-case opts |
58 |
| - :clojure 'typed.clj.checker.parse-unparse/ns-rewrites-clj |
59 |
| - :cljs 'typed.clj.checker.parse-unparse/ns-rewrites-cljs)) |
60 |
| - (some-> sym namespace symbol))] |
61 |
| - (find (name-env (env/checker opts)) |
62 |
| - (symbol (name sym-nsym) (name sym)))))) |
63 |
| - |
64 |
| -(t/ann ^:no-check find-type-name [t/Sym t/Any -> (t/Nilable (t/U t/Kw (t/Delay r/Type) [:-> r/Type]))]) |
65 |
| -(defn find-type-name [sym opts] |
66 |
| - (or ((name-env (env/checker opts)) sym) |
67 |
| - (when-some [sym-nsym ((requiring-resolve (impl/impl-case opts |
68 |
| - :clojure 'typed.clj.checker.parse-unparse/ns-rewrites-clj |
69 |
| - :cljs 'typed.clj.checker.parse-unparse/ns-rewrites-cljs)) |
70 |
| - (some-> sym namespace symbol))] |
71 |
| - ((name-env (env/checker opts)) |
72 |
| - (symbol (name sym-nsym) (name sym)))))) |
| 56 | + (let [env (name-env (env/checker opts))] |
| 57 | + (some-> |
| 58 | + (or (find env sym) |
| 59 | + (when-some [sym-nsym (some-> (namespace sym) symbol |
| 60 | + ((requiring-resolve |
| 61 | + (impl/impl-case opts |
| 62 | + :clojure 'typed.clj.checker.parse-unparse/ns-rewrites-clj |
| 63 | + :cljs 'typed.clj.checker.parse-unparse/ns-rewrites-cljs))))] |
| 64 | + (find env (symbol (name sym-nsym) (name sym))))) |
| 65 | + (update 1 #(force-type % opts))))) |
| 66 | + |
| 67 | +(t/ann ^:no-check get-type-name* [t/Sym t/Any -> (t/Nilable (t/U t/Kw (t/Delay r/Type) [:-> r/Type]))]) |
| 68 | +(defn- get-type-name* |
| 69 | + "Does not resolve type." |
| 70 | + [sym opts] |
| 71 | + (let [env (name-env (env/checker opts))] |
| 72 | + (or (env sym) |
| 73 | + (when-some [sym-nsym (some-> (namespace sym) symbol |
| 74 | + ((requiring-resolve |
| 75 | + (impl/impl-case opts |
| 76 | + :clojure 'typed.clj.checker.parse-unparse/ns-rewrites-clj |
| 77 | + :cljs 'typed.clj.checker.parse-unparse/ns-rewrites-cljs))))] |
| 78 | + (env (symbol (name sym-nsym) (name sym))))))) |
73 | 79 |
|
74 | 80 | (t/ann ^:no-check get-type-name [t/Sym t/Any -> (t/U nil t/Kw r/Type)])
|
75 | 81 | (defn get-type-name
|
76 |
| - "Return the name with var symbol sym. |
| 82 | + "Return the (forced) type mapped to var with symbol sym. |
77 | 83 | Returns nil if not found."
|
78 | 84 | [sym opts]
|
79 | 85 | {:pre [(symbol? sym)]
|
80 |
| - :post [(or (assert (or (nil? %) |
81 |
| - (keyword? %) |
82 |
| - (r/Type? %)) |
83 |
| - (pr-str %)) |
84 |
| - true)]} |
85 |
| - (some-> (find-type-name sym opts) (force-type opts))) |
| 86 | + :post [(or (nil? %) |
| 87 | + (keyword? %) |
| 88 | + (r/Type? %))]} |
| 89 | + (some-> (get-type-name* sym opts) (force-type opts))) |
86 | 90 |
|
87 | 91 | (t/ann ^:no-check add-type-name [t/Any t/Sym (t/U t/Kw r/Type) -> nil])
|
88 | 92 | (def add-type-name impl/add-tc-type-name)
|
|
117 | 121 | (or (dtenv/get-datatype checker sym opts)
|
118 | 122 | (prenv/get-protocol checker sym opts)
|
119 | 123 | (impl/impl-case opts
|
120 |
| - :clojure (or (rcls/get-rclass checker sym opts) |
121 |
| - (when (class? (resolve sym)) |
122 |
| - (c/RClass-of-with-unknown-params sym opts))) |
123 |
| - :cljs ((requiring-resolve 'typed.cljs.checker.jsnominal-env/get-jsnominal) sym opts)) |
124 |
| - ; during the definition of RClass's that reference |
125 |
| - ; themselves in their definition, a temporary TFn is |
126 |
| - ; added to the declared kind env which is enough to determine |
127 |
| - ; type rank and variance. |
| 124 | + :clojure (or (rcls/get-rclass checker sym opts) |
| 125 | + (when (class? (resolve sym)) |
| 126 | + (c/RClass-of-with-unknown-params sym opts))) |
| 127 | + :cljs ((requiring-resolve 'typed.cljs.checker.jsnominal-env/get-jsnominal) sym opts)) |
| 128 | + ; during the definition of RClass's that reference |
| 129 | + ; themselves in their definition, a temporary TFn is |
| 130 | + ; added to the declared kind env which is enough to determine |
| 131 | + ; type rank and variance. |
128 | 132 | (kinds/declared-kind-or-nil checker sym opts)
|
129 | 133 | (cond
|
130 | 134 | (= impl/protocol-name-type t) (prenv/resolve-protocol checker sym opts)
|
|
0 commit comments