aboutsummaryrefslogtreecommitdiff
path: root/clojurescript/tojs.clj
diff options
context:
space:
mode:
Diffstat (limited to 'clojurescript/tojs.clj')
-rw-r--r--clojurescript/tojs.clj40
1 files changed, 23 insertions, 17 deletions
diff --git a/clojurescript/tojs.clj b/clojurescript/tojs.clj
index b4715b2f..4addd141 100644
--- a/clojurescript/tojs.clj
+++ b/clojurescript/tojs.clj
@@ -16,13 +16,6 @@
(defmulti tojs (fn [e ctx] (class e)))
-(defmethod tojs clojure.lang.Var [e ctx]
- (let [{:keys [name ns]} ^e]
- (str (Compiler/munge (str (.getName ns))) "." (Compiler/munge (str name)))))
-
-(defmethod tojs clojure.lang.Compiler$DefExpr [e ctx]
- (str (tojs (.var e) ctx) "=" (tojs (.init e) ctx)))
-
(defn fnmethod [fm maxm ctx]
(let [lm (into {} (for [[lb lb] (.locals fm)]
[lb (str (.name lb) "_" (.idx lb))]))
@@ -107,11 +100,34 @@
(defmethod tojs clojure.lang.Compiler$ConstantExpr [e ctx]
(const-str (.v e)))
+
+(defn var-parts [e]
+ (let [{:keys [name ns]} ^(.var e)]
+ [(Compiler/munge (str (.getName ns)))
+ (Compiler/munge (str name))]))
+
(defmethod tojs clojure.lang.Compiler$UnresolvedVarExpr [e ctx]
(vstr ["clojure.JS.resolveVar(\""
(Compiler/munge (name (.symbol e))) "\","
(Compiler/munge (name (.name *ns*))) ")"]))
+(defmethod tojs clojure.lang.Compiler$VarExpr [e ctx]
+ (let [[vns vname] (var-parts e)]
+ (str vns "." vname)))
+
+(defmethod tojs clojure.lang.Compiler$TheVarExpr [e ctx]
+ (let [[vns vname] (var-parts e)]
+ (str vns "._var_" vname)))
+
+(defmethod tojs clojure.lang.Compiler$AssignExpr [e ctx]
+ (let [[vns vname] (var-parts (.target e))]
+ (str vns "._var_" vname ".set(" (tojs (.val e) ctx) ")")))
+
+(defmethod tojs clojure.lang.Compiler$DefExpr [e ctx]
+ (let [[vns vname] (var-parts e)]
+ (str "clojure.JS.def(" vns ",\"" vname "\"," (tojs (.init e) ctx) ")")))
+
+
(defmethod tojs clojure.lang.Compiler$InvokeExpr [e ctx]
(vstr [(tojs (.fexpr e) ctx)
"("
@@ -130,13 +146,6 @@
(defmethod tojs clojure.lang.Compiler$StringExpr [e ctx]
(const-str (.str e)))
-(defmethod tojs clojure.lang.Compiler$VarExpr [e ctx]
- (tojs (.var e) ctx))
-
-(defmethod tojs clojure.lang.Compiler$TheVarExpr [e ctx]
- ; XXX not really right
- (tojs (.var e) ctx))
-
(defmethod tojs clojure.lang.Compiler$KeywordExpr [e ctx]
(const-str (.k e)))
@@ -186,9 +195,6 @@
(defmethod tojs clojure.lang.Compiler$BooleanExpr [e ctx]
(if (.val e) "true" "false"))
-(defmethod tojs clojure.lang.Compiler$AssignExpr [e ctx]
- (vstr ["(" (tojs (.target e) ctx) "=" (tojs (.val e) ctx) ")"]))
-
(defmethod tojs clojure.lang.Compiler$ThrowExpr [e ctx]
(vstr ["(function(){throw " (tojs (.excExpr e) ctx) "})()"]))