Move lexical binding renaming to JS:VARIABLE printer (part one)
[clinton/parenscript.git] / src / printer.lisp
index db34da6..66c07ff 100644 (file)
@@ -125,8 +125,23 @@ arguments, defines a printer for that form using the given body."
   (loop for idx in indices do
         (psw #\[) (ps-print idx) (psw #\])))
 
+(defvar *lexical-bindings* nil)
+
+(defun rename-js-variable (name)
+  (or (cdr (assoc name *lexical-bindings*))
+      name))
+
+(defprinter js:let (variables expression)
+  (let ((*lexical-bindings*
+        (append (mapcar (lambda (var)
+                          (cons var (if (assoc var *lexical-bindings*)
+                                        (ps-gensym var)
+                                        var)))
+                        variables))))
+    (ps-print expression)))
+
 (defprinter js:variable (var)
-  (psw (symbol-to-js-string var)))
+  (psw (symbol-to-js-string (rename-js-variable var))))
 
 ;;; arithmetic operators
 (defun parenthesize-print (ps-form)
@@ -233,7 +248,7 @@ arguments, defines a printer for that form using the given body."
 
 (defprinter js:var (var-name &rest var-value)
   (psw "var ")
-  (psw (symbol-to-js-string var-name))
+  (ps-print var-name)
   (when var-value
     (psw " = ")
     (ps-print (car var-value))))