From af20aea87dc3c219d2f25be3725ab3973a428bdd Mon Sep 17 00:00:00 2001 From: David Nolen Date: Sun, 11 Feb 2018 21:34:15 +0000 Subject: [PATCH] automatically setup printing for JS environment with console availble as well as Nashorn --- src/main/cljs/cljs/core.cljs | 17 +++++++++++++++++ src/main/clojure/cljs/cli.clj | 2 +- src/main/clojure/cljs/repl/nashorn.clj | 17 +++++++++-------- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/main/cljs/cljs/core.cljs b/src/main/cljs/cljs/core.cljs index 98c8209913..adbcadfbc5 100644 --- a/src/main/cljs/cljs/core.cljs +++ b/src/main/cljs/cljs/core.cljs @@ -11447,3 +11447,20 @@ reduces them without incurring seq initialization" {:added "1.9"} [x] (instance? goog.Uri x)) + +(defn maybe-enable-print! [] + (cond + (exists? js/console) + (enable-console-print!) + + (identical? *target* "nashorn") + (let [system (.type js/Java "java.lang.System")] + (set! *print-newline* false) + (set! *print-fn* + (fn [& args] + (.println (.-out system) (.join (into-array args) "")))) + (set! *print-err-fn* + (fn [& args] + (.println (.-error system) (.join (into-array args) ""))))))) + +(maybe-enable-print!) diff --git a/src/main/clojure/cljs/cli.clj b/src/main/clojure/cljs/cli.clj index 49a4ebf38a..ddf1b881f4 100644 --- a/src/main/clojure/cljs/cli.clj +++ b/src/main/clojure/cljs/cli.clj @@ -102,7 +102,7 @@ present" (util/debug-prn "Compiler options:" repl/*repl-opts*)) (comp/with-core-cljs repl/*repl-opts* (fn [] - (repl/-setup renv (merge (repl/-repl-options renv) repl/*repl-opts*)) + (repl/-setup renv repl/*repl-opts*) ;; REPLs don't normally load cljs_deps.js (when (and coptsf (.exists coptsf)) (let [depsf (io/file (:output-dir options) "cljs_deps.js")] diff --git a/src/main/clojure/cljs/repl/nashorn.clj b/src/main/clojure/cljs/repl/nashorn.clj index 9573befc48..79867cb11e 100644 --- a/src/main/clojure/cljs/repl/nashorn.clj +++ b/src/main/clojure/cljs/repl/nashorn.clj @@ -10,6 +10,7 @@ (:require [clojure.java.io :as io] [clojure.string :as string] [clojure.stacktrace] + [clojure.data.json :as json] [cljs.analyzer :as ana] [cljs.env :as env] [cljs.util :as util] @@ -51,12 +52,15 @@ (eval-str engine (slurp r)) (when debug (println "loaded: " path)))) - (defn init-engine [engine output-dir debug] + (defn init-engine [engine {:keys [output-dir] :as opts} debug] (eval-str engine (format "var CLJS_DEBUG = %s;" (boolean debug))) (eval-str engine (format "var CLJS_OUTPUT_DIR = \"%s\";" output-dir)) (eval-resource engine "goog/base.js" debug) (eval-resource engine "goog/deps.js" debug) (eval-resource engine "cljs/bootstrap_nashorn.js" debug) + (eval-str engine + (format "goog.global.CLOSURE_UNCOMPILED_DEFINES = %s;" + (json/write-str (:closure-defines opts)))) engine) (defn load-js-file [engine file] @@ -96,20 +100,17 @@ (defrecord NashornEnv [engine debug] repl/IReplEnvOptions (-repl-options [this] - {:output-dir ".cljs_nashorn_repl"}) + {:output-dir ".cljs_nashorn_repl" + :target :nashorn}) repl/IJavaScriptEnv (-setup [this {:keys [output-dir bootstrap output-to] :as opts}] - (init-engine engine output-dir debug) + (init-engine engine opts debug) (let [env (ana/empty-env)] (if output-to (load-js-file engine output-to) (bootstrap-repl engine output-dir opts)) (repl/evaluate-form this env repl-filename - '(do - (.require js/goog "cljs.core") - (set! *print-newline* false) - (set! *print-fn* js/print) - (set! *print-err-fn* js/print))) + '(.require js/goog "cljs.core")) ;; monkey-patch goog.isProvided_ to suppress useless errors (repl/evaluate-form this env repl-filename '(set! js/goog.isProvided_ (fn [ns] false)))