Skip to content

Commit 1f8da01

Browse files
committed
(wip)
1 parent 79414ff commit 1f8da01

File tree

2 files changed

+132
-1
lines changed

2 files changed

+132
-1
lines changed

deps.edn

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
:main-opts ["-i" "src/test/cljs_cli/cljs_cli/test_runner.clj"
1414
"-e" "(cljs-cli.test-runner/-main)"]}
1515
:compiler.test {:extra-paths ["src/test/cljs" "src/test/cljs_build" "src/test/cljs_cp"
16-
"src/test/clojure" "src/test/self"]}
16+
"src/test/clojure" "src/test/self"]
17+
:extra-deps {org.clojure/spec.alpha {:mvn/version "0.5.238"}}}
1718
:compiler.test.run {:main-opts ["-i" "src/test/clojure/cljs/test_runner.clj"
1819
"-e" "(cljs.test-runner/-main)"]}
1920
:runtime.test.build {:extra-paths ["src/test/cljs"]
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
;; Copyright (c) Rich Hickey. All rights reserved.
2+
;; The use and distribution terms for this software are covered by the
3+
;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
4+
;; which can be found in the file epl-v10.html at the root of this distribution.
5+
;; By using this software in any fashion, you are agreeing to be bound by
6+
;; the terms of this license.
7+
;; You must not remove this notice, or any other, from this software.
8+
9+
(ns cljs.analyzer.specs
10+
(:require [clojure.spec.alpha :as s]))
11+
12+
(s/def ::op keyword?)
13+
(s/def ::form any?)
14+
(s/def ::env map?)
15+
(s/def ::context #{:expr :return :statement})
16+
17+
(defmulti node :op)
18+
(s/def ::node (s/multi-spec node :op))
19+
20+
(s/def ::test ::node)
21+
(s/def ::then ::node)
22+
(s/def ::else ::node)
23+
24+
;; TODO: :tag
25+
(s/def ::base
26+
(s/keys
27+
:req-un [::op ::env ::form]))
28+
29+
(defmethod node :if [_]
30+
(s/merge ::base
31+
(s/keys
32+
:req-un [::test ::then]
33+
:opt-un [::else])))
34+
35+
(s/def ::literal? boolean?)
36+
(s/def ::val any?)
37+
38+
(defmethod node :const [_]
39+
(s/merge ::base
40+
(s/keys
41+
:req-un [::literal? ::val]
42+
:opt-un [])))
43+
44+
(s/def ::keys (s/* ::node))
45+
(s/def ::vals (s/* ::node))
46+
47+
(defmethod node :map [_]
48+
(s/merge ::base
49+
(s/keys :req-un [::keys ::vals])))
50+
51+
(s/def ::items (s/* ::node))
52+
53+
(defmethod node :list [_]
54+
(s/merge ::base
55+
(s/keys
56+
:req-un [::items])))
57+
58+
(defmethod node :vector [_]
59+
(s/merge ::base
60+
(s/keys
61+
:req-un [::items])))
62+
63+
(defmethod node :set [_]
64+
(s/merge ::base
65+
(s/keys
66+
:req-un [::items])))
67+
68+
(defmethod node :js-object [_]
69+
(s/merge ::base
70+
(s/keys
71+
:req-un [::keys ::vals])))
72+
73+
(defmethod node :js-array [_]
74+
(s/merge ::base
75+
(s/keys
76+
:req-un [::items])))
77+
78+
(s/def ::var ::node)
79+
(s/def ::sym ::node)
80+
(s/def ::meta map?)
81+
82+
(defmethod node :the-var [_]
83+
(s/merge ::base
84+
(s/keys
85+
:opt-un [::var ::sym ::meta])))
86+
87+
(s/def ::nodes (s/* ::node))
88+
(s/def ::default ::node)
89+
90+
(defmethod node ::case [_]
91+
(s/merge ::base
92+
(s/keys
93+
:req-un [::test ::nodes ::default])))
94+
95+
(defmethod node ::case-node [_]
96+
(s/merge ::base
97+
(s/keys
98+
:req-un [::tests ::then])))
99+
100+
(comment
101+
102+
(s/valid? ::node 1)
103+
(s/valid? ::node
104+
{:op :const
105+
:env {}
106+
:form 1
107+
:literal? true
108+
:val 1})
109+
110+
(s/explain-data ::node
111+
{:op :if
112+
:env {}
113+
:form '(if true true false)
114+
:test {:op :const
115+
:env {}
116+
:form true
117+
:literal? true
118+
:val true}
119+
:then {:op :const
120+
:env {}
121+
:form true
122+
:literal? true
123+
:val true}
124+
:else {:op :const
125+
:env 1
126+
:form false
127+
:literal? true
128+
:val false}})
129+
130+
)

0 commit comments

Comments
 (0)