-
Notifications
You must be signed in to change notification settings - Fork 175
/
cljs.clj
96 lines (82 loc) · 2.68 KB
/
cljs.clj
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
(ns cider.nrepl.middleware.util.cljs)
;; piggieback 0.3 changed the namespace of the library, so in
;; order to support 0.2 and 0.3 we need to do a bit of extra work
(def cider-piggieback?
(try (require 'cider.piggieback) true
(catch Throwable _ false)))
(def cemerick-piggieback?
(try (require 'cemerick.piggieback) true
(catch Throwable _ false)))
(defn try-piggieback
"If piggieback is loaded, returns `#'cider.piggieback/wrap-cljs-repl`, or
false otherwise."
[]
(cond
cider-piggieback? (resolve 'cider.piggieback/wrap-cljs-repl)
cemerick-piggieback? (resolve 'cemerick.piggieback/wrap-cljs-repl)
:else false))
(defn- maybe-piggieback
[descriptor descriptor-key]
(if-let [piggieback (try-piggieback)]
(update-in descriptor [descriptor-key] #(set (conj % piggieback)))
descriptor))
(defn expects-piggieback
"If piggieback is loaded, returns the descriptor with piggieback's
`wrap-cljs-repl` handler assoc'd into its `:expects` set."
[descriptor]
(maybe-piggieback descriptor :expects))
(defn requires-piggieback
"If piggieback is loaded, returns the descriptor with piggieback's
`wrap-cljs-repl` handler assoc'd into its `:requires` set."
[descriptor]
(maybe-piggieback descriptor :requires))
(defn- cljs-env-path
"Returns the path in the session map for the ClojureScript compiler
environment used by piggieback."
[]
[(if cemerick-piggieback?
(resolve 'cemerick.piggieback/*cljs-compiler-env*)
(resolve 'cider.piggieback/*cljs-compiler-env*))])
(defn- maybe-deref
[x]
(if (instance? clojure.lang.IDeref x) @x x))
(defn grab-cljs-env*
[msg]
(let [path (cljs-env-path)]
(some-> msg
:session
maybe-deref
(get-in path))))
(defn grab-cljs-env
"If piggieback is active, returns the ClojureScript compiler environment for
the running REPL."
[msg]
(maybe-deref (grab-cljs-env* msg)))
(defn cljs-response-value
"Returns the :value slot of an eval response from piggieback as a Clojure
value."
[response]
(let [value (:value response)]
(try
(read-string value)
(catch Exception _
value))))
(defn response-value
"Returns the :value slot of an eval response as a Clojure value, reading the
slot if necessary (piggieback 0.2.x)."
[msg response]
(if (grab-cljs-env msg)
(cljs-response-value response)
(:value response)))
(defmacro with-cljs-env [msg & body]
(try
(require 'cljs.env)
`(binding [cljs.env/*compiler* (grab-cljs-env* ~msg)]
~@body)
(catch Exception _)))
(defmacro with-cljs-ns [ns-sym & body]
(try
(require 'cljs.analyzer)
`(binding [cljs.analyzer/*cljs-ns* ~ns-sym]
~@body)
(catch Exception _)))