[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] master 1e1e410 082/110: Merge pull request #289 from dgreensp/fix
From: |
Dmitry Gutov |
Subject: |
[elpa] master 1e1e410 082/110: Merge pull request #289 from dgreensp/fix-array-rest |
Date: |
Thu, 23 Jun 2016 01:13:01 +0000 (UTC) |
branch: master
commit 1e1e4109b7072a1fb94b973b37e06a643dd47b30
Merge: 849e061 7fe7165
Author: Dmitry Gutov <address@hidden>
Commit: Dmitry Gutov <address@hidden>
Merge pull request #289 from dgreensp/fix-array-rest
Fix array destructuring including triple-dot
---
js2-mode.el | 52 ++++++++++++++++++++++------------------------------
tests/parser.el | 14 ++++++++++++++
2 files changed, 36 insertions(+), 30 deletions(-)
diff --git a/js2-mode.el b/js2-mode.el
index 8420c4e..7c30a1c 100644
--- a/js2-mode.el
+++ b/js2-mode.el
@@ -8107,7 +8107,11 @@ declared; probably to check them for errors."
((js2-array-node-p node)
(dolist (elem (js2-array-node-elems node))
(when elem
- (if (js2-infix-node-p elem) (setq elem (js2-infix-node-left elem)))
+ (setq elem (cond ((js2-infix-node-p elem) ;; default (=)
+ (js2-infix-node-left elem))
+ ((js2-unary-node-p elem) ;; rest (...)
+ (js2-unary-node-operand elem))
+ (t elem)))
(push (js2-define-destruct-symbols
elem decl-type face ignore-not-in-block)
name-nodes)))
@@ -10478,19 +10482,13 @@ array-literals, array comprehensions and regular
expressions."
(defun js2-parse-array-literal (pos)
(let ((after-lb-or-comma t)
- after-comma tt elems pn
+ after-comma tt elems pn was-rest
(continue t))
(unless js2-is-in-destructuring
(js2-push-scope (make-js2-scope))) ; for the legacy array comp
(while continue
(setq tt (js2-get-token))
(cond
- ;; comma
- ((= tt js2-COMMA)
- (setq after-comma (js2-current-token-end))
- (if (not after-lb-or-comma)
- (setq after-lb-or-comma t)
- (push nil elems)))
;; end of array
((or (= tt js2-RB)
(= tt js2-EOF)) ; prevent infinite loop
@@ -10504,27 +10502,18 @@ array-literals, array comprehensions and regular
expressions."
:len (- js2-ts-cursor pos)
:elems (nreverse elems)))
(apply #'js2-node-add-children pn (js2-array-node-elems pn)))
- ;; destructuring binding
- (js2-is-in-destructuring
- (push (cond
- ((and (= tt js2-NAME)
- (= js2-ASSIGN (js2-peek-token)))
- ;; a=defaultValue
- (js2-parse-initialized-binding (js2-parse-name js2-NAME)))
- ((or (= tt js2-LC)
- (= tt js2-LB)
- (= tt js2-NAME))
- ;; [a, b, c] | {a, b, c} | {a:x, b:y, c:z} | a
- (js2-parse-destruct-primary-expr))
- ;; invalid pattern
- (t
- (js2-report-error "msg.bad.var")
- (make-js2-error-node)))
- elems)
- (setq after-lb-or-comma nil
- after-comma nil))
+ ;; anything after rest element (...foo)
+ (was-rest
+ (js2-report-error "msg.param.after.rest"))
+ ;; comma
+ ((= tt js2-COMMA)
+ (setq after-comma (js2-current-token-end))
+ (if (not after-lb-or-comma)
+ (setq after-lb-or-comma t)
+ (push nil elems)))
;; array comp
((and (>= js2-language-version 170)
+ (not js2-is-in-destructuring)
(= tt js2-FOR) ; check for array comprehension
(not after-lb-or-comma) ; "for" can't follow a comma
elems ; must have at least 1 element
@@ -10538,9 +10527,12 @@ array-literals, array comprehensions and regular
expressions."
(js2-report-error "msg.no.bracket.arg"))
(if (and (= tt js2-TRIPLEDOT)
(>= js2-language-version 200))
- ;; spread operator
- (push (js2-make-unary tt 'js2-parse-assign-expr)
- elems)
+ ;; rest/spread operator
+ (progn
+ (push (js2-make-unary tt 'js2-parse-assign-expr)
+ elems)
+ (if js2-is-in-destructuring
+ (setq was-rest t)))
(js2-unget-token)
(push (js2-parse-assign-expr) elems))
(setq after-lb-or-comma nil
diff --git a/tests/parser.el b/tests/parser.el
index d32f042..90bbadd 100644
--- a/tests/parser.el
+++ b/tests/parser.el
@@ -363,6 +363,20 @@ the test."
(js2-deftest-parse spread-in-function-call
"f(3, ...[t(2), t(3)], 42, ...[t(4)]);")
+(js2-deftest-parse rest-in-array-destructure
+ "let [x, y, z, ...w] = [1, ...a, ...b, c];")
+
+(js2-deftest-parse comma-after-rest-in-array
+ "let [...x,] = [1, 2, 3];"
+ :syntax-error "," :errors-count 1)
+
+(js2-deftest-parse elem-after-rest-in-array
+ "let [...x, y] = [1, 2, 3];"
+ :syntax-error "," :errors-count 2)
+
+(js2-deftest-parse array-destructure-expr-default
+ "let [[x] = [3]] = y;")
+
;;; Arrow functions
(js2-deftest-parse arrow-function-with-empty-args-and-no-curlies
- [elpa] master 5ebc7b8 099/110: Change warning message to not conflict with spec, (continued)
- [elpa] master 5ebc7b8 099/110: Change warning message to not conflict with spec, Dmitry Gutov, 2016/06/22
- [elpa] master ae3ed93 102/110: Backport for fix for #335, Dmitry Gutov, 2016/06/22
- [elpa] master fa419df 093/110: Merge pull request #327 from XeCycle/ckw-as, Dmitry Gutov, 2016/06/22
- [elpa] master b78d224 045/110: Parse async methods, Dmitry Gutov, 2016/06/22
- [elpa] master 5f00a97 059/110: Use SVG for Travis CI badge, Dmitry Gutov, 2016/06/22
- [elpa] master 4fc6ef8 064/110: js2-class-node: Inherit from js2-object-node, Dmitry Gutov, 2016/06/22
- [elpa] master ae922a3 067/110: Remove js2-make-await as unused, Dmitry Gutov, 2016/06/22
- [elpa] master 502c14a 003/110: Use = instead of eq; Refs #185, Dmitry Gutov, 2016/06/22
- [elpa] master 73c0348 062/110: Merge pull request #297 from Christoph-D/master, Dmitry Gutov, 2016/06/22
- [elpa] master 49954ea 084/110: Use idle timer to reparse, even when the buffer's just been opened, Dmitry Gutov, 2016/06/22
- [elpa] master 1e1e410 082/110: Merge pull request #289 from dgreensp/fix-array-rest,
Dmitry Gutov <=
- [elpa] master 16c42ce 087/110: Run all tests on 'make test', Dmitry Gutov, 2016/06/22
- [elpa] master e265b69 090/110: Fix a byte compilation warning on Emacs 25, Dmitry Gutov, 2016/06/22
- [elpa] master 87f43f3 089/110: Fix more remaining failures, Dmitry Gutov, 2016/06/22
- [elpa] master 6d22df2 094/110: Colorize imported names as variables, Dmitry Gutov, 2016/06/22
- [elpa] master bc46db5 104/110: Add a test for #335 as well, Dmitry Gutov, 2016/06/22
- [elpa] master 92f5479 108/110: Parse generator methods better, Dmitry Gutov, 2016/06/22
- [elpa] master 58857dc 103/110: Merge branch 'dgreensp-object-rest-spread', Dmitry Gutov, 2016/06/22
- [elpa] master 0cda392 109/110: Make a new release, Dmitry Gutov, 2016/06/22
- [elpa] master be0b00d 063/110: js2-mode-extend-comment: Don't check that the next line is also commented, Dmitry Gutov, 2016/06/22
- [elpa] master 757f91d 065/110: And move its definition below, Dmitry Gutov, 2016/06/22