+\r
+;;; Spread operator\r
+\r
+(js2-deftest-parse spread-in-array-literal\r
+ "[1, ...[2, 3], 4, ...[5, 6]];")\r
+\r
+(js2-deftest-parse spread-in-function-call\r
+ "f(3, ...[t(2), t(3)], 42, ...[t(4)]);")\r
+\r
+;;; Arrow functions\r
+\r
+(js2-deftest-parse arrow-function-with-empty-args-and-no-curlies\r
+ "() => false;" :reference "() => {false};")\r
+\r
+(js2-deftest-parse arrow-function-with-args-and-curlies\r
+ "(a, b = 1, ...c) => { c;\n};")\r
+\r
+(js2-deftest-parse parenless-arrow-function-prohibits-rest\r
+ "...b => {b + 1;};" :syntax-error "b" :errors-count 2)\r
+\r
+(js2-deftest-parse parenless-arrow-function-prohibits-destructuring\r
+ "[a, b] => {a + b;};" :syntax-error "]" :errors-count 5)\r
+\r
+;;; Automatic semicolon insertion\r
+\r
+(js2-deftest-parse no-auto-semi-insertion-after-if\r
+ "if (true) {\n}")\r
+\r
+(js2-deftest-parse auto-semi-insertion-after-function\r
+ "a = function() {}" :reference "a = function() {};")\r
+\r
+(js2-deftest-parse auto-semi-one-variable-per-line\r
+ "x\ny" :reference "x;\ny;")\r
+\r
+;;; Labels\r
+\r
+(js2-deftest-parse labeled-stmt-node\r
+ "foo:\nbar:\nx = y + 1;")\r
+\r
+(js2-deftest no-label-node-inside-expr "x = y:"\r
+ (let (js2-parse-interruptable-p)\r
+ (js2-mode))\r
+ (let ((assignment (js2-expr-stmt-node-expr (car (js2-scope-kids js2-mode-ast)))))\r
+ (should (js2-name-node-p (js2-assign-node-right assignment)))))\r
+\r
+(js2-deftest-parse label-and-loops "for (; ; ) {\r
+ loop:\r
+ for (; ; ) {\r
+ continue loop;\r
+ }\r
+}")\r
+\r
+;;; Generators\r
+\r
+(js2-deftest-parse legacy-generator "function foo() {\n yield 1;\n}")\r
+\r
+(js2-deftest-parse legacy-generator-cannot-return\r
+ "function foo() {\n yield 1;\n return 2;\n}" :syntax-error "return 2")\r
+\r
+(js2-deftest-parse harmony-generator "function* bar() {\n yield 2;\n return 3;\n}")\r
+\r
+;;; Scopes\r
+\r
+(js2-deftest ast-symbol-table-includes-fn-node "function foo() {}"\r
+ (js2-mode)\r
+ (let ((entry (js2-scope-get-symbol js2-mode-ast 'foo)))\r
+ (should (= (js2-symbol-decl-type entry) js2-FUNCTION))\r
+ (should (equal (js2-symbol-name entry) "foo"))\r
+ (should (js2-function-node-p (js2-symbol-ast-node entry)))))\r
+\r
+(js2-deftest fn-symbol-table-includes-nested-fn "function foo() {\r
+ function bar() {}\r
+ var x;\r
+}"\r
+ (js2-mode)\r
+ (let* ((scope (js2-node-at-point (point-min)))\r
+ (fn-entry (js2-scope-get-symbol scope 'bar))\r
+ (var-entry (js2-scope-get-symbol scope 'x)))\r
+ (should (string= (js2-name-node-name (js2-function-node-name scope)) "foo"))\r
+ (should (= (js2-symbol-decl-type fn-entry) js2-FUNCTION))\r
+ (should (js2-function-node-p (js2-symbol-ast-node fn-entry)))\r
+ (should (= (js2-symbol-decl-type var-entry) js2-VAR))\r
+ (should (js2-name-node-p (js2-symbol-ast-node var-entry)))))\r
+\r
+;;; Tokenizer\r
+\r
+(js2-deftest get-token "(1+1)"\r
+ (js2-init-scanner)\r
+ (should (eq js2-LP (js2-next-token)))\r
+ (should (eq js2-NUMBER (js2-next-token)))\r
+ (should (eq js2-ADD (js2-next-token)))\r
+ (should (eq js2-NUMBER (js2-next-token)))\r
+ (should (eq js2-RP (js2-next-token))))\r
+\r
+(js2-deftest unget-token "()"\r
+ (js2-init-scanner)\r
+ (should (eq js2-LP (js2-next-token)))\r
+ (js2-unget-token)\r
+ (should (eq js2-LP (js2-next-token)))\r
+ (should (eq js2-RP (js2-next-token))))\r
+\r
+(js2-deftest get-token-or-eol "x\n++;"\r
+ (js2-init-scanner)\r
+ (should (eq js2-NAME (js2-next-token)))\r
+ (should (eq js2-EOL (js2-peek-token-or-eol)))\r
+ (should (eq js2-INC (js2-next-token)))\r
+ (should (eq js2-SEMI (js2-peek-token-or-eol))))\r
+\r
+(js2-deftest unget-token-over-eol-and-comment "x\n//abc\ny"\r
+ (js2-init-scanner)\r
+ (should (eq js2-NAME (js2-next-token)))\r
+ (should (eq js2-NAME (js2-next-token)))\r
+ (should (equal "y" (js2-current-token-string)))\r
+ (js2-unget-token)\r
+ (should (eq js2-NAME (js2-current-token-type)))\r
+ (should (equal "x" (js2-current-token-string))))\r
+\r
+(js2-deftest ts-seek "(1+2)"\r
+ (js2-init-scanner)\r
+ (should (eq js2-LP (js2-next-token)))\r
+ (should (eq js2-NUMBER (js2-next-token)))\r
+ (js2-unget-token)\r
+ (let ((state (make-js2-ts-state)))\r
+ (should (eq js2-NUMBER (js2-next-token)))\r
+ (should (eq js2-ADD (js2-next-token)))\r
+ (js2-ts-seek state)\r
+ (should (eq 1 js2-ti-lookahead))\r
+ (should (eq js2-NUMBER (js2-next-token)))\r
+ (should (eq 1 (js2-token-number\r
+ (js2-current-token))))))\r
+\r
+;;; Error handling\r
+\r
+(js2-deftest for-node-with-error-len "for "\r
+ (js2-mode)\r
+ (let ((node (js2-node-at-point (point-min))))\r
+ (should (= (js2-node-len (js2-node-parent node)) 4))))\r
+\r
+(js2-deftest function-without-parens-error "function b {}"\r
+ ;; Should finish the parse.\r
+ (js2-mode))\r