aboutsummaryrefslogtreecommitdiff
path: root/clojurescript/tojs.clj
diff options
context:
space:
mode:
Diffstat (limited to 'clojurescript/tojs.clj')
-rw-r--r--clojurescript/tojs.clj36
1 files changed, 27 insertions, 9 deletions
diff --git a/clojurescript/tojs.clj b/clojurescript/tojs.clj
index 4a8bc2dd..a46b0e28 100644
--- a/clojurescript/tojs.clj
+++ b/clojurescript/tojs.clj
@@ -13,7 +13,9 @@
Compiler$DefExpr Compiler$InstanceMethodExpr)
(java.io BufferedReader InputStreamReader StringReader PrintWriter)
(java.net URLDecoder))
- (:require [clojure.contrib.duck-streams :as ds]))
+ (:use [clojure.contrib.command-line :only (with-command-line)])
+ (:require (clojure.contrib [duck-streams :as ds]
+ [seq-utils :as su])))
(defn vstr [v]
(let [sb (StringBuilder.)
@@ -196,7 +198,8 @@
(const-str (.k e)))
(defmethod tojs clojure.lang.Compiler$StaticFieldExpr [e ctx]
- (str (.getCanonicalName (.c e)) "." (.fieldName e)))
+ (str "clojure.JS.getOrRun(" (.getCanonicalName (.c e)) ",\""
+ (var-munge (.fieldName e)) "\")"))
(defmethod tojs clojure.lang.Compiler$StaticMethodExpr [e ctx]
(vstr [(.getCanonicalName (.c e)) "." (.methodName e) "("
@@ -213,7 +216,8 @@
"(" (vec (interpose "," (map #(tojs % ctx) (.args e)))) ")"]))
(defmethod tojs clojure.lang.Compiler$InstanceFieldExpr [e ctx]
- (vstr ["(" (tojs (.target e) ctx) ")." (var-munge (.fieldName e))]))
+ (vstr ["clojure.JS.getOrRun(" (tojs (.target e) ctx) ",\""
+ (var-munge (.fieldName e)) "\")"]))
(defmethod tojs clojure.lang.Compiler$IfExpr [e ctx]
(str "((" (tojs (.testExpr e) ctx)
@@ -359,7 +363,7 @@
(println (formtojs '(fn forever[] (forever))))
(println (formtojs '(fn forever[] (loop [] (recur))))))
-(defn serve [port]
+(defn start-server [port]
(loop [server (java.net.ServerSocket. port)]
(with-open socket (.accept server)
(binding [*debug-fn-names* false
@@ -383,8 +387,22 @@
(.replace trace "\n" "\\n") "\");")))))))
(recur server)))
-;(simple-tests)
-
-;(serve 8081)
-
-(filetojs (first *command-line-args*))
+(defn mkboot []
+ (binding [*out* (ds/writer "boot.js")]
+ (filetojs (.getResourceAsStream (clojure.lang.RT/baseLoader)
+ "clojure/boot.clj"))))
+
+(with-command-line *command-line-args*
+ "tojs -- Compile ClojureScript to JavaScript"
+ [[simple? "Runs some simple built-in tests"]
+ [serve "Starts a repl server on the given port" 8081]
+ [mkboot? "Generates a boot.js file"]
+ [v? "Includes extra fn names and comments in js"]
+ filenames]
+ (binding [*debug-fn-names* v? *debug-comments* v?]
+ (cond
+ simple? (simple-tests)
+ serve (start-server (Integer/parseInt serve))
+ mkboot? (mkboot)
+ :else (doseq filename filenames
+ (filetojs filename)))))