Skip to content

Commit f0fd8eb

Browse files
committed
(WIP) Add read conditionalization for clj.runtime
1 parent 32e6e79 commit f0fd8eb

15 files changed

+300
-95
lines changed

doc/runtime-dependencies.dot

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
strict digraph G {
2+
3+
rankdir = RL;
4+
5+
/* here start the interfaces */
6+
7+
8+
{
9+
node [shape=box];
10+
11+
12+
"typed.clojure" -> {
13+
"clojure.core.typed",
14+
"cct.macros",
15+
"cct.platform-case"};
16+
"t.clojure.jvm" -> {
17+
"clojure.core.typed",
18+
"cct.current-impl",
19+
"cct.internal",
20+
"t.cljc.rt.env-utils",
21+
"cct.macros"};
22+
23+
"t.clj.rt.env" -> {"t.cljc.rt.env"};
24+
"t.cljc.rt.env";
25+
"t.cljc.rt.env-utils" -> {"typed.clojure"};
26+
"t.cljc.rt.env-utils-annotations" -> {
27+
"typed.clojure",
28+
"t.cljc.rt.env-utils"};
29+
30+
"clojure.core.typed" -> {
31+
"cct.util-vars",
32+
"cct.special-form",
33+
"cct.import-macros",
34+
"cct.contract",
35+
"cct.type-contract",
36+
"cct.macros"};
37+
38+
"cct.all-envs" -> {
39+
"cct.current-impl",
40+
"cct.load-if-needed",
41+
"cct.util-vars",
42+
"t.cljc.rt.env-utils",
43+
"t.clj.checker.parse-unparse",
44+
"t.cljc.checker.name-env",
45+
"t.cljc.checker.var-env",
46+
"t.cljc.rt.env" };
47+
48+
"cct.ast-ops" -> {"cct.errors"};
49+
"cct.ast-utils" -> {"cct.current-impl", "cct.contract-utils"};
50+
"cct.coerce-utils" -> {"typed.clojure", "cct.current-impl"};
51+
"cct.contract";
52+
"cct.contract-utils";
53+
"cct.contract-utils-platform-specific" ->{"cct.contract-utils"};
54+
"cct.current-impl" -> {
55+
"cct.contract-utils",
56+
"cct.util-vars",
57+
"t.cljc.rt.env",
58+
"t.clj.rt.env",
59+
"t.cljs.rt.env"};
60+
"cct.errors" -> {
61+
"cct.util-vars",
62+
"cct.current-impl",
63+
"cct.ast-utils"};
64+
"cct.expand" -> {
65+
"clojure.core.typed",
66+
"cct.special-form",
67+
"cct.internal"};
68+
"cct.hold" -> {"clojure.core.typed"};
69+
"cct.import-macros";
70+
"cct.internal" -> {
71+
"cct.contract-utils",
72+
"cct.internal.add-destructure-blame-form"};
73+
"cct.load" -> {"cct.load-if-needed", "cct.current-impl"};
74+
"cct.load-if-needed" -> {"cct.errors", "cct.util-vars"};
75+
"cct.macros" -> {
76+
"cct.internal",
77+
"cct.special-form",
78+
"cct.platform-case"};
79+
"cct.parse-ast" -> {
80+
"clojure.core.typed",
81+
"cct.current-impl",
82+
"cct.errors",
83+
"cct.util-vars",
84+
"cct.coerce-utils"};
85+
"cct.platform-case";
86+
"cct.rules" -> {
87+
"typed.clojure",
88+
"cct.internal",
89+
"t.cljc.analyzer"};
90+
"cct.special-form";
91+
"cct.type-contract" -> {
92+
"cct.errors",
93+
"cct.current-impl",
94+
"cct.ast-ops",
95+
"cct.contract"};
96+
"cct.unsafe";
97+
"cct.util-vars";
98+
99+
"cct.rt.jvm.configs";
100+
"cct.internal.add-destructure-blame-form";
101+
102+
103+
}
104+
}

doc/runtime-dependencies.png

316 KB
Loading

typed/clj.runtime/deps-clr.edn

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
{:paths ["src" "resources"] }
1.57 KB
Binary file not shown.

typed/clj.runtime/src/clojure/core/typed.clj renamed to typed/clj.runtime/src/clojure/core/typed.cljc

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ for checking namespaces, cf for checking individual forms."}
7171
Intended for use at the REPL."
7272
[mname]
7373
(load-if-needed)
74-
(core/let [ms (->> (Class/forName (namespace mname))
74+
(core/let [ms (->> (#?(:cljr clojure.lang.RT/classForNameE :default Class/forName) (namespace mname))
7575
reflect/type-reflect
7676
:members
7777
(core/filter #(and (instance? clojure.reflect.Method %)
@@ -344,9 +344,9 @@ for checking namespaces, cf for checking individual forms."}
344344
(binding [vs/*current-env* {:ns {:name (ns-name *ns*)}
345345
:file *file*
346346
:line (or (-> form# meta :line)
347-
@Compiler/LINE)
347+
#?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE))
348348
:column (or (-> form# meta :column)
349-
@Compiler/COLUMN)}]
349+
#?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN))}]
350350
(do ~@body))))
351351

352352
(defmacro ^:private delay-rt-parse
@@ -444,7 +444,7 @@ for checking namespaces, cf for checking individual forms."}
444444
(defalias* '~qsym '~t '~&form)))))
445445

446446
(defmacro ^:private defspecial [& body]
447-
(when (= "true" (System/getProperty "clojure.core.typed.special-vars"))
447+
(when (= "true" (#?(:cljr Environment/GetEnvironmentVariable :default System/getProperty) "clojure.core.typed.special-vars"))
448448
`(def ~@body)))
449449

450450
(defspecial
@@ -1681,10 +1681,10 @@ for checking namespaces, cf for checking individual forms."}
16811681
~*file*)
16821682
:line (or (:line opt#)
16831683
~(or (-> &form meta :line)
1684-
@Compiler/LINE))
1684+
#?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE)))
16851685
:column (or (:column opt#)
16861686
~(or (-> &form meta :column)
1687-
@Compiler/COLUMN))))))
1687+
#?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN)))))))
16881688
~x))))
16891689

16901690
(core/defn infer-unannotated-vars
@@ -1721,7 +1721,7 @@ for checking namespaces, cf for checking individual forms."}
17211721
; thus dynaload as lazily as possible.
17221722
;============================================================
17231723

1724-
(when (= "true" (System/getProperty "clojure.core.typed.deprecated-wrapper-macros"))
1724+
(when (= "true" (#?(:cljr Environment/GetEnvironmentVariable :default System/getProperty) "clojure.core.typed.deprecated-wrapper-macros"))
17251725
(load "typed/deprecated_wrapper_macros"))
17261726

17271727
;;TODO make typing rule

typed/clj.runtime/src/clojure/core/typed/ast_utils.clj

Lines changed: 32 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
(defn emit-form-fn [expr]
2020
(impl/impl-case
2121
:clojure ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr)
22-
:cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr)))
22+
:cljs ((requiring-resolve 'typed.cljs.checker.util/emit-form) expr)
23+
:cljr ((requiring-resolve 'typed.clj.analyzer.passes.emit-form/emit-form) expr)))
2324

2425
(defn constant-expr [expr]
2526
{:pre [(#{:quote} (:op expr))
@@ -40,7 +41,17 @@
4041
(:vals expr))
4142
_ (assert (contains? m key))
4243
vexpr (get m key)]
43-
(:form vexpr))))
44+
(:form vexpr))
45+
46+
:cljr (case (:op expr)
47+
:map (let [const ((requiring-resolve 'typed.cljc.analyzer.passes.constant-lifter/constant-lift) expr)]
48+
(assert (#{:const} (:op const)))
49+
(map-expr-at const key))
50+
:const (let [v (:val expr)]
51+
(assert (contains? v key) key)
52+
(get v key)))
53+
54+
))
4455

4556
(defn constant-exprs [exprs]
4657
(map constant-expr exprs))
@@ -151,7 +162,17 @@
151162
:cljs (assoc method
152163
:params (vec (concat required-params
153164
(when rest-param
154-
[rest-param]))))))
165+
[rest-param]))))
166+
:cljr (case (:op method)
167+
:fn-method (assoc method
168+
:params (vec (concat required-params
169+
(when rest-param
170+
[rest-param]))))
171+
:method (do (assert (nil? rest-param))
172+
(assert (seq required-params))
173+
(assoc method
174+
:this (first required-params)
175+
:params (vec (rest required-params)))))))
155176

156177
(defn let-body-kw []
157178
:body)
@@ -160,7 +181,9 @@
160181
{:post [(symbol? %)]}
161182
(impl/impl-case
162183
:clojure ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr))
163-
:cljs (:name expr)))
184+
:cljs (:name expr)
185+
:cljr ((requiring-resolve 'clojure.core.typed.coerce-utils/var->symbol) (:var expr))
186+
))
164187

165188
(defn new-op-class [expr]
166189
{:pre [(#{:new} (:op expr))
@@ -179,7 +202,9 @@
179202
:clojure ((every-pred map? (comp #{:method} :op))
180203
m)
181204
; FIXME should be nyi-error but c.c.t.errors depends on this namespace
182-
:cljs (assert nil "Method for CLJS"))))
205+
:cljs (assert nil "Method for CLJS")
206+
:cljr ((every-pred map? (comp #{:method} :op))
207+
m))))
183208

184209
(def fn-method? (fn [m]
185210
((every-pred map? (comp #{:fn-method} :op))
@@ -189,7 +214,8 @@
189214
:clojure ((con/vec-c? fn-method?) ms)
190215
:cljs ((every-pred (con/every-c? fn-method?)
191216
seq?)
192-
ms))))
217+
ms)
218+
:clojure ((con/vec-c? fn-method?) ms))))
193219

194220
(defn variadic-method? [m]
195221
{:pre [((some-fn fn-method? deftype-method?) m)]

typed/clj.runtime/src/clojure/core/typed/contract.cljc

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@
128128
[& {:as bls}]
129129
(map->Blame bls))
130130

131-
#?(:clj
131+
#?(:cljs :ignore :default
132132
(defmacro contract
133133
"Check a contract against a value, with an optional Blame object.
134134
@@ -142,9 +142,9 @@
142142
:negative ~(str "Not " (ns-name *ns*))
143143
:file ~*file*
144144
:line ~(or (-> &form meta :line)
145-
@Compiler/LINE)
145+
#?(:cljr @clojure.lang.Compiler/LineVar :default @Compiler/LINE))
146146
:column ~(or (-> &form meta :column)
147-
@Compiler/COLUMN))))
147+
#?(:cljr @clojure.lang.Compiler/ColumnVar :default @Compiler/COLUMN)))))
148148
~x))))
149149

150150
#_(ann swap-blame [Blame :-> Blame])
@@ -165,7 +165,7 @@
165165
(make-flat-contract :name 'int-c :first-order integer?))
166166

167167
;; macro to allow instance? specialisation
168-
#?(:clj
168+
#?(:cljs :ignore :default
169169
(defmacro instance-c
170170
"Flat contracts for instance? checks on Class's."
171171
[c]
@@ -294,16 +294,20 @@
294294
(next [this]
295295
(when-let [n (next s)]
296296
(->CheckedISeq n c b)))
297-
(cons [this x]
297+
#?(:cljr
298+
(^clojure.lang.ISeq cons [this ^Object x] ;; Sigh -- overloaded in cljr
298299
(->CheckedISeq (conj s x) c b))
300+
:default
301+
(cons [this x]
302+
(->CheckedISeq (conj s x) c b)))
299303
(empty [this]
300304
(empty s))
301305
(seq [this]
302306
(when (seq s)
303307
this))
304308
(equiv [this o]
305309
(if (or (not (instance? clojure.lang.Sequential o))
306-
(not (instance? java.util.List o)))
310+
(not (instance? #?(:cljr System.Collections.IEnumerable :default java.util.List) o)))
307311
false
308312
(loop [ms this
309313
s (seq o)]

typed/clj.runtime/src/clojure/core/typed/contract_utils_platform_specific.cljc

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,19 @@
1111
;; reader conditions in .clj files, and where PersistentArrayMap doesn't
1212
;; exist.
1313
(ns ^:no-doc clojure.core.typed.contract-utils-platform-specific
14-
#?(:clj (:require [clojure.core.typed.contract-utils :as con]))
15-
#?(:clj (:import (clojure.lang PersistentArrayMap))))
14+
#?(:clj (:require [clojure.core.typed.contract-utils :as con])
15+
:cljr (:require [clojure.core.typed.contract-utils :as con]))
16+
#?(:clj (:import (clojure.lang PersistentArrayMap))
17+
:cljr (:import (clojure.lang PersistentArrayMap))))
1618

1719
#?(:bb nil
18-
:clj (def namespace? #(instance? clojure.lang.Namespace %)))
20+
:clj (def namespace? #(instance? clojure.lang.Namespace %))
21+
:cljr (def namespace? #(instance? clojure.lang.Namespace %)))
1922

2023
#?(:clj (defn array-map-c? [ks-c? vs-c?]
24+
(every-pred #(instance? PersistentArrayMap %)
25+
(con/every-c? (con/hvector-c? ks-c? vs-c?))))
26+
:cljr (defn array-map-c? [ks-c? vs-c?]
2127
(every-pred #(instance? PersistentArrayMap %)
2228
(con/every-c? (con/hvector-c? ks-c? vs-c?)))))
2329

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy