Skip to content

Commit c9c1229

Browse files
anmonteiroswannodette
authored andcommitted
CLJS-1803: Use new require capability in REPLs
1 parent b5147bf commit c9c1229

File tree

3 files changed

+20
-110
lines changed

3 files changed

+20
-110
lines changed

src/main/clojure/cljs/analyzer.cljc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,7 +2315,7 @@
23152315
(when-not *allow-ns*
23162316
(throw (error env "Namespace declarations must be at the top-level.")))
23172317
(let [specs (canonicalize-specs quoted-specs)
2318-
name 'cljs.user
2318+
name (-> env :ns :name)
23192319
args (desugar-ns-specs
23202320
#?(:clj (list (process-rewrite-form
23212321
specs))
@@ -2354,7 +2354,7 @@
23542354
(map (spec-parsers k)
23552355
(remove #{:reload :reload-all} libs))))
23562356
{} (remove (fn [[r]] (= r :refer-clojure)) args))]
2357-
(set! *cljs-ns* 'cljs.user)
2357+
(set! *cljs-ns* name)
23582358
(let [require-info
23592359
{:name name
23602360
:excludes excludes

src/main/clojure/cljs/repl.cljc

Lines changed: 10 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -452,16 +452,16 @@
452452
{:source-type :fragment
453453
:source-form form})
454454
def-emits-var (:def-emits-var opts)
455+
ast (ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var)
456+
(wrap form) nil opts)
455457
wrap-js
456458
;; TODO: check opts as well - David
457459
(if (:source-map repl-env)
458460
(binding [comp/*source-map-data*
459461
(atom {:source-map (sorted-map)
460462
:gen-col 0
461463
:gen-line 0})]
462-
(let [js (comp/emit-str
463-
(ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var)
464-
(wrap form) nil opts))
464+
(let [js (comp/emit-str ast)
465465
t (System/currentTimeMillis)]
466466
(str js
467467
"\n//# sourceURL=repl-" t ".js"
@@ -478,12 +478,10 @@
478478
;; handle strings / primitives without metadata
479479
(with-out-str (pr form)))]})
480480
"UTF-8")))))
481-
(comp/emit-str
482-
(ana/analyze (assoc env :repl-env repl-env :def-emits-var def-emits-var)
483-
(wrap form) nil opts)))]
481+
(comp/emit-str ast))]
484482
;; NOTE: means macros which expand to ns aren't supported for now
485483
;; when eval'ing individual forms at the REPL - David
486-
(when (and (sequential? form) (= 'ns (first form)))
484+
(when (#{:ns :ns*} (:op ast))
487485
(let [ast (ana/no-warn (ana/analyze env form nil opts))]
488486
(load-dependencies repl-env
489487
(into (vals (:requires ast))
@@ -548,7 +546,11 @@
548546

549547
(defn- wrap-fn [form]
550548
(cond
551-
(and (seq? form) (= 'ns (first form))) identity
549+
(and (seq? form)
550+
(#{'ns 'require 'require-macros
551+
'use 'use-macros 'import 'refer-clojure} (first form)))
552+
identity
553+
552554
('#{*1 *2 *3 *e} form) (fn [x] `(cljs.core.pr-str ~x))
553555
:else
554556
(fn [x]
@@ -612,17 +614,6 @@
612614
;; form - complete form entered at the repl
613615
;; opts - REPL options, essentially augmented cljs.closure/build options
614616

615-
(defn self-require? [specs]
616-
(some
617-
(fn [quoted-spec-or-kw]
618-
(and (not (keyword? quoted-spec-or-kw))
619-
(let [spec (second quoted-spec-or-kw)
620-
ns (if (sequential? spec)
621-
(first spec)
622-
spec)]
623-
(= ns ana/*cljs-ns*))))
624-
specs))
625-
626617
(defn- wrap-self
627618
"Takes a self-ish fn and returns it wrapped with exception handling.
628619
Compiler state is restored if self-ish fn fails."
@@ -666,92 +657,6 @@
666657
(wrap-special-fns wrap-self
667658
{'in-ns in-ns-fn
668659
'clojure.core/in-ns in-ns-fn
669-
'require
670-
(fn self
671-
([repl-env env form]
672-
(self repl-env env form nil))
673-
([repl-env env [_ & specs :as form] opts]
674-
(let [is-self-require? (self-require? specs)
675-
[target-ns restore-ns]
676-
(if-not is-self-require?
677-
[ana/*cljs-ns* nil]
678-
['cljs.user ana/*cljs-ns*])]
679-
(evaluate-form repl-env env "<cljs repl>"
680-
(with-meta
681-
`(~'ns ~target-ns
682-
(:require ~@(-> specs ana/canonicalize-specs decorate-specs)))
683-
{:merge true :line 1 :column 1})
684-
identity opts)
685-
(when is-self-require?
686-
(set! ana/*cljs-ns* restore-ns)))))
687-
'require-macros
688-
(fn self
689-
([repl-env env form]
690-
(self repl-env env form nil))
691-
([repl-env env [_ & specs :as form] opts]
692-
(evaluate-form repl-env env "<cljs repl>"
693-
(with-meta
694-
`(~'ns ~ana/*cljs-ns*
695-
(:require-macros ~@(-> specs ana/canonicalize-specs decorate-specs)))
696-
{:merge true :line 1 :column 1})
697-
identity opts)))
698-
'use
699-
(fn self
700-
([repl-env env form]
701-
(self repl-env env form nil))
702-
([repl-env env [_ & specs :as form] opts]
703-
(let [is-self-require? (self-require? specs)
704-
[target-ns restore-ns]
705-
(if-not is-self-require?
706-
[ana/*cljs-ns* nil]
707-
['cljs.user ana/*cljs-ns*])]
708-
(evaluate-form repl-env env "<cljs repl>"
709-
(with-meta
710-
`(~'ns ~target-ns
711-
(:use ~@(-> specs ana/canonicalize-specs decorate-specs)))
712-
{:merge true :line 1 :column 1})
713-
identity opts)
714-
(when is-self-require?
715-
(set! ana/*cljs-ns* restore-ns)))))
716-
'use-macros
717-
(fn self
718-
([repl-env env form]
719-
(self repl-env env form nil))
720-
([repl-env env [_ & specs :as form] opts]
721-
(evaluate-form repl-env env "<cljs repl>"
722-
(with-meta
723-
`(~'ns ~ana/*cljs-ns*
724-
(:use-macros ~@(-> specs ana/canonicalize-specs decorate-specs)))
725-
{:merge true :line 1 :column 1})
726-
identity opts)))
727-
'import
728-
(fn self
729-
([repl-env env form]
730-
(self repl-env env form nil))
731-
([repl-env env [_ & specs :as form] opts]
732-
(evaluate-form repl-env env "<cljs repl>"
733-
(with-meta
734-
`(~'ns ~ana/*cljs-ns*
735-
(:import
736-
~@(map
737-
(fn [quoted-spec-or-kw]
738-
(if (keyword? quoted-spec-or-kw)
739-
quoted-spec-or-kw
740-
(second quoted-spec-or-kw)))
741-
specs)))
742-
{:merge true :line 1 :column 1})
743-
identity opts)))
744-
'refer-clojure
745-
(fn self
746-
([repl-env env form]
747-
(self repl-env env form nil))
748-
([repl-env env [_ & specs :as form] opts]
749-
(evaluate-form repl-env env "<cljs repl>"
750-
(with-meta
751-
`(~'ns ~ana/*cljs-ns*
752-
(:refer-clojure ~@specs))
753-
{:merge true :line 1 :column 1})
754-
identity opts)))
755660
'load-file load-file-fn
756661
'clojure.core/load-file load-file-fn
757662
'load-namespace

src/main/clojure/cljs/repl/rhino.clj

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@
3939
String
4040
(-eval [this {:keys [cx scope]} filename line]
4141
(.evaluateString cx scope this filename line nil))
42-
42+
4343
Reader
4444
(-eval [this {:keys [cx scope]} filename line]
4545
(.evaluateReader cx scope this filename line nil)))
@@ -159,8 +159,13 @@
159159
;; https://groups.google.com/d/msg/mozilla.dev.tech.js-engine.rhino/inMyVKhPq6M/cY39hX20_z8J
160160
(defn wrap-fn [form]
161161
(cond
162-
(and (seq? form) (= 'ns (first form))) identity
162+
(and (seq? form)
163+
(#{'ns 'require 'require-macros
164+
'use 'use-macros 'import 'refer-clojure} (first form)))
165+
identity
166+
163167
('#{*1 *2 *3 *e} form) (fn [x] `(cljs.core.pr-str ~x))
168+
164169
:else
165170
(fn [x]
166171
`(cljs.core.pr-str
@@ -254,5 +259,5 @@
254259

255260
(load-namespace 'goog.date.Date)
256261
(goog.date.Date.)
257-
262+
258263
)

0 commit comments

Comments
 (0)