From 2421d28fe1a1828855a91d61e0b8c8557e291060 Mon Sep 17 00:00:00 2001 From: Vladimir Sedach Date: Sun, 30 Jan 2011 22:49:24 -0500 Subject: [PATCH] Fixed equality operators not being parenthesized. --- src/printer.lisp | 15 ++++++++++++--- t/output-tests.lisp | 9 ++++++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/printer.lisp b/src/printer.lisp index 091f35c..924e602 100644 --- a/src/printer.lisp +++ b/src/printer.lisp @@ -122,8 +122,10 @@ vice-versa.") (defmethod ps-print ((number number)) (format *psw-stream* (if (integerp number) "~S" "~F") number)) +(defvar %equality-ops '(ps-js:== ps-js:!= ps-js:=== ps-js:!==)) + (let ((precedence-table (make-hash-table :test 'eq))) - (loop for level in '((ps-js:getprop ps-js:aref ps-js:new ps-js:funcall) + (loop for level in `((ps-js:getprop ps-js:aref ps-js:new ps-js:funcall) (ps-js:lambda) ;; you won't find this in JS books (ps-js:++ ps-js:-- ps-js:post++ ps-js:post--) (ps-js:! ps-js:~ ps-js:negate ps-js:typeof ps-js:delete) @@ -132,7 +134,7 @@ vice-versa.") (ps-js:+) (ps-js:<< ps-js:>> ps-js:>>>) (ps-js:< ps-js:> ps-js:<= ps-js:>= ps-js:instanceof ps-js:in) - (ps-js:== ps-js:!= ps-js:=== ps-js:!==) + ,%equality-ops (ps-js:&) (ps-js:^) (ps-js:\|) @@ -181,12 +183,19 @@ vice-versa.") (defprinter ps-js:post-- (x) (ps-print x)"--") -(defprinter (ps-js:+ ps-js:- ps-js:* ps-js:/ ps-js:% ps-js:&& ps-js:\|\| ps-js:& ps-js:\| ps-js:-= ps-js:+= ps-js:*= ps-js:/= ps-js:%= ps-js:^ ps-js:<< ps-js:>> ps-js:&= ps-js:^= ps-js:\|= ps-js:= ps-js:== ps-js:=== ps-js:!== ps-js:in ps-js:!= ps-js:> ps-js:>= ps-js:< ps-js:<=) +(defprinter (ps-js:+ ps-js:- ps-js:* ps-js:/ ps-js:% ps-js:&& ps-js:\|\| ps-js:& ps-js:\| ps-js:-= ps-js:+= ps-js:*= ps-js:/= ps-js:%= ps-js:^ ps-js:<< ps-js:>> ps-js:&= ps-js:^= ps-js:\|= ps-js:= ps-js:in ps-js:> ps-js:>= ps-js:< ps-js:<=) (&rest args) (loop for (arg . remaining) on args do (print-op-argument op arg) (when remaining (format *psw-stream* " ~(~A~) " op)))) +(defprinter (ps-js:== ps-js:!= ps-js:=== ps-js:!==) (x y) + (flet ((parenthesize-equality (form) + (if (and (consp form) (member (car form) %equality-ops)) + (parenthesize-print form) + (print-op-argument op form)))) + (parenthesize-equality x) (format *psw-stream* " ~A " op) (parenthesize-equality y))) + (defprinter ps-js:aref (array &rest indices) (print-op-argument 'ps-js:aref array) (dolist (idx indices) diff --git a/t/output-tests.lisp b/t/output-tests.lisp index c6cce89..28f28d4 100644 --- a/t/output-tests.lisp +++ b/t/output-tests.lisp @@ -2766,4 +2766,11 @@ foo = 3;") (test-ps-js create-let-exp (create :abc (let ((x (+ 1 2))) (if x 123 456))) - "{ 'abc' : (x = 1 + 2, x ? 123 : 456) };") \ No newline at end of file + "{ 'abc' : (x = 1 + 2, x ? 123 : 456) };") + +(test-ps-js eql-eql-eql-precedence + (unless (equal (= 3 3) (= 3 4)) + (chain console (log 1))) + "if ((3 === 3) != (3 === 4)) { + console.log(1); +};") -- 2.11.4.GIT