Created
June 12, 2012 22:28
-
-
Save pascalc/2920519 to your computer and use it in GitHub Desktop.
Himera - Compile CLJS in a custom namespace
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; Handler | |
(ns ttmachines.server.views.repl-service ...) | |
... | |
(defpage [:post "/compile"] {:keys [expr cljs-ns] :or {cljs-ns "cljs.user"}} | |
(let [cljs-ns (symbol cljs-ns)] | |
(try | |
(generate-repl-response (cljs/compilation expr :cljs-ns cljs-ns)) | |
(catch RuntimeException e | |
(generate-repl-response {:result nil} 400))))) | |
;; Service | |
(ns himera.server.cljs | |
(:require [cljs.compiler :as comp]) | |
(:require [himera.server.setup :as setup]) | |
(:import [java.io PushbackReader BufferedReader StringReader] | |
[clojure.lang ISeq])) | |
(declare exp) | |
(defn build [action locals expr & {:keys [opt pp] :or {opt :simple pp false}}] | |
{:result | |
(let [env {:ns (@comp/namespaces comp/*cljs-ns*) | |
:uses #{'cljs.core} | |
:context :expr | |
:locals locals}] | |
(with-redefs [comp/get-expander exp] | |
(action env expr))) | |
:status 200}) | |
(defn compilation [expr & {:keys [cljs-ns]}] | |
(binding [comp/*cljs-ns* cljs-ns] | |
(build | |
#(comp/emits (comp/analyze % %2)) | |
(setup/load-core-names) | |
expr))) | |
;; privates | |
(defn- exp [sym env] | |
(let [mvar | |
(when-not (or (-> env :locals sym) ;locals hide macros | |
(-> env :ns :excludes sym)) | |
(if-let [nstr (namespace sym)] | |
(when-let [ns (cond | |
(= "clojure.core" nstr) (find-ns 'cljs.core) | |
(.contains nstr ".") (find-ns (symbol nstr)) | |
:else | |
(-> env :ns :requires-macros (get (symbol nstr))))] | |
(.findInternedVar ^clojure.lang.Namespace ns (symbol (name sym)))) | |
(if-let [nsym (-> env :ns :uses-macros sym)] | |
(.findInternedVar ^clojure.lang.Namespace (find-ns nsym) sym) | |
(.findInternedVar ^clojure.lang.Namespace (find-ns 'cljs.core) sym))))] | |
(println [sym mvar]) | |
(let [sym (symbol (.getName sym))] | |
(when (and mvar (or (setup/clojure-macros sym) (setup/cljs-macros sym))) | |
@mvar)))) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment