aboutsummaryrefslogtreecommitdiff
path: root/clojurescript/tojs.clj
diff options
context:
space:
mode:
Diffstat (limited to 'clojurescript/tojs.clj')
-rw-r--r--clojurescript/tojs.clj34
1 files changed, 20 insertions, 14 deletions
diff --git a/clojurescript/tojs.clj b/clojurescript/tojs.clj
index ff605ecb..335189d4 100644
--- a/clojurescript/tojs.clj
+++ b/clojurescript/tojs.clj
@@ -29,8 +29,7 @@
*has-recur*])
mparm (into {} (for [p (.reqParms maxm)] [(.idx p) p]))
inits (concat
- (when has-recur
- ["_cnt" "_rtn"])
+ (when has-recur ["_cnt" "_rtn"])
(vals (reduce dissoc lm (cons thisfn (.reqParms fm))))
(when (:fnname ctx) [(str (lm thisfn) "=arguments.callee")])
(when (not= fm maxm)
@@ -59,7 +58,7 @@
manym (< 1 (count (.methods e)))
newctx (assoc ctx :fnname (.thisName e))]
(vstr [(when (.variadicMethod e)
- ["clojure.JS.variatic(" (count (.reqParms maxm)) ","])
+ ["clojure.JS.variadic(" (count (.reqParms maxm)) ","])
"(function"
(when *debug-fn-names*
[" __" (.replaceAll (.name e) "[\\W_]+" "_")])
@@ -104,8 +103,8 @@
(defn const-str [c]
(cond
(or (instance? Character c)
- (keyword? c)
(string? c)) (pr-str (str c))
+ (keyword? c) (str "clojure.keyword(\"" (namespace c) "\",\"" (name c) "\")")
(symbol? c) (str \" \' c \")
(class? c) (.getCanonicalName c)
(list? c) (vstr ["clojure.JS.lit_list(["
@@ -117,7 +116,7 @@
(defmethod tojs clojure.lang.Compiler$ConstantExpr [e ctx]
(const-str (.v e)))
-(def js-reserved '#{import boolean short byte char})
+(def js-reserved '#{import boolean short byte char class})
(defn var-munge [x]
(let [n (-> x str Compiler/munge (.replace "." "_DOT_"))]
@@ -155,9 +154,9 @@
(defmethod tojs clojure.lang.Compiler$InvokeExpr [e ctx]
(vstr [(tojs (.fexpr e) ctx)
- "("
+ ".apply(null,["
(vec (interpose "," (map #(tojs % ctx) (.args e))))
- ")"]))
+ "])"]))
(defmethod tojs clojure.lang.Compiler$LocalBindingExpr [e ctx]
((:localmap ctx) (.b e)))
@@ -187,6 +186,10 @@
(vec (interpose "," (map #(tojs % ctx) (.args e))))
"))"]))
+;(defmethod tojs clojure.lang.Compiler$InstanceMethodExpr [e ctx]
+; (vstr ["clojure.JS.invoke((" (tojs (.target e) ctx) "),\"" (.methodName e)
+; "\",[" (vec (interpose "," (map #(tojs % ctx) (.args e)))) "])"]))
+
(defmethod tojs clojure.lang.Compiler$InstanceMethodExpr [e ctx]
(vstr ["(" (tojs (.target e) ctx) ")." (.methodName e)
"(" (vec (interpose "," (map #(tojs % ctx) (.args e)))) ")"]))
@@ -209,14 +212,14 @@
")"]))
(defmethod tojs clojure.lang.Compiler$MapExpr [e ctx]
- (vstr ["clojure.lang.HashMap.create(["
+ (vstr ["clojure.hash_map("
(vec (interpose "," (map #(tojs % ctx) (.keyvals e))))
- "])"]))
+ ")"]))
(defmethod tojs clojure.lang.Compiler$SetExpr [e ctx]
- (vstr ["clojure.lang.HashSet.create(["
+ (vstr ["clojure.hash_set("
(vec (interpose "," (map #(tojs % ctx) (.keys e))))
- "])"]))
+ ")"]))
(defmethod tojs clojure.lang.Compiler$BooleanExpr [e ctx]
(if (.val e) "true" "false"))
@@ -247,8 +250,9 @@
(def skip-set '#{seq instance? assoc floats doubles ints longs
- global-hierarchy apply refer first rest import hash-map
- count find})
+ apply refer first rest import hash-map
+ count find keys vals get class contains?
+ print-method})
(defn skip-defs [expr]
(let [m ^(.var expr)]
@@ -261,7 +265,9 @@
;(when (instance? clojure.lang.Compiler$InvokeExpr mainexpr) (prn :invoke f))
(when-not (or (and (instance? clojure.lang.Compiler$DefExpr mainexpr)
(skip-defs mainexpr))
- (instance? clojure.lang.Compiler$InstanceMethodExpr mainexpr)
+ (and (instance? clojure.lang.Compiler$InstanceMethodExpr mainexpr)
+ (= "setMacro" (.methodName mainexpr)))
+
(and (instance? clojure.lang.Compiler$BodyExpr mainexpr)
(instance? clojure.lang.Compiler$DefExpr (first (.exprs mainexpr)))
(skip-defs (first (.exprs mainexpr)))))