[Pkg-javascript-commits] [node-acorn-jsx] 237/484: Forbid spread element in sequence expressions.

Bastien Roucariès rouca at moszumanska.debian.org
Sat Aug 19 14:20:37 UTC 2017


This is an automated email from the git hooks/post-receive script.

rouca pushed a commit to branch master
in repository node-acorn-jsx.

commit 3ee9e288a212069457d66f81e8816873a913197e
Author: Ingvar Stepanyan <me at rreverser.com>
Date:   Sat Jul 26 06:52:21 2014 +0300

    Forbid spread element in sequence expressions.
---
 acorn.js              | 38 ++++++++++++++++++++++++--------------
 test/tests-harmony.js |  7 ++++---
 2 files changed, 28 insertions(+), 17 deletions(-)

diff --git a/acorn.js b/acorn.js
index 4101aa7..57c1d8e 100644
--- a/acorn.js
+++ b/acorn.js
@@ -32,8 +32,7 @@
   // The main exported interface (under `self.acorn` when in the
   // browser) is a `parse` function that takes a code string and
   // returns an abstract syntax tree as specified by [Mozilla parser
-  // API][api], with the caveat that the SpiderMonkey-specific syntax
-  // (`let`, `yield`, inline XML, etc) is not recognized.
+  // API][api], with the caveat that inline XML is not recognized.
   //
   // [api]: https://developer.mozilla.org/en-US/docs/SpiderMonkey/Parser_API
 
@@ -53,7 +52,7 @@
     // `ecmaVersion` indicates the ECMAScript version to parse. Must
     // be either 3, or 5, or 6. This influences support for strict
     // mode, the set of reserved words, support for getters and
-    // setters and other features. ES6 support is only partial.
+    // setters and other features.
     ecmaVersion: 5,
     // Turn on `strictSemicolons` to prevent the parser from doing
     // automatic semicolon insertion.
@@ -1784,19 +1783,28 @@
       return finishNode(node, "Literal");
 
     case _parenL:
-      var node = startNode(), tokStartLoc1 = tokStartLoc, tokStart1 = tokStart, val;
+      var node = startNode(), tokStartLoc1 = tokStartLoc, tokStart1 = tokStart, val, exprList;
       next();
       var oldParenL = ++metParenL;
       if (tokType !== _parenR) {
         val = parseExpression();
+        exprList = val.type === "SequenceExpression" ? val.expressions : [val];
+      } else {
+        exprList = [];
       }
       expect(_parenR);
       // if '=>' follows '(...)', convert contents to arguments
       if (metParenL === oldParenL && eat(_arrow)) {
-        val = parseArrowExpression(node, !val ? [] : val.type === "SequenceExpression" ? val.expressions : [val]);
+        val = parseArrowExpression(node, exprList);
       } else {
         // forbid '()' before everything but '=>'
         if (!val) unexpected(lastStart);
+        // forbid '...' in sequence expressions
+        if (options.ecmaVersion >= 6) {
+          for (var i = 0; i < exprList.length; i++) {
+            if (exprList[i].type === "SpreadElement") unexpected();
+          }
+        }
       }
       val.start = tokStart1;
       val.end = lastEnd;
@@ -2065,7 +2073,7 @@
         params[i] = param.left;
         defaults.push(param.right);
       } else {
-        toAssignable(param, i === lastI);
+        toAssignable(param, i === lastI, true);
         defaults.push(null);
         if (param.type === "SpreadElement") {
           params.length--;
@@ -2092,12 +2100,12 @@
       if (eat(_parenR)) {
         break;
       } else if (options.ecmaVersion >= 6 && eat(_ellipsis)) {
-        node.rest = toAssignable(parseExprAtom());
+        node.rest = toAssignable(parseExprAtom(), false, true);
         checkSpreadAssign(node.rest);
         expect(_parenR);
         break;
       } else {
-        node.params.push(options.ecmaVersion >= 6 ? toAssignable(parseExprAtom()) : parseIdent());
+        node.params.push(options.ecmaVersion >= 6 ? toAssignable(parseExprAtom(), false, true) : parseIdent());
         if (options.ecmaVersion >= 6 && tokVal === '=') {
           next();
           hasDefaults = true;
@@ -2249,7 +2257,7 @@
   // Convert existing expression atom to assignable pattern
   // if possible.
 
-  function toAssignable(node, allowSpread) {
+  function toAssignable(node, allowSpread, checkType) {
     if (options.ecmaVersion >= 6 && node) {
       switch (node.type) {
         case "Identifier":
@@ -2261,26 +2269,28 @@
           for (var i = 0; i < node.properties.length; i++) {
             var prop = node.properties[i];
             if (prop.kind !== "init") unexpected(prop.key.start);
-            toAssignable(prop.value);
+            toAssignable(prop.value, false, checkType);
           }
           break;
 
         case "ArrayExpression":
           node.type = "ArrayPattern";
           for (var i = 0, lastI = node.elements.length - 1; i <= lastI; i++) {
-            toAssignable(node.elements[i], i === lastI);
+            toAssignable(node.elements[i], i === lastI, checkType);
           }
           break;
 
         case "SpreadElement":
           if (allowSpread) {
-            toAssignable(node.argument);
+            toAssignable(node.argument, false, checkType);
             checkSpreadAssign(node.argument);
-            break;
+          } else {
+            unexpected(node.start);
           }
+          break;
 
         default:
-          unexpected(node.start);
+          if (checkType) unexpected(node.start);
       }
     }
     return node;
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index d0ad3c7..1c97b60 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -6,6 +6,7 @@
   Copyright (C) 2011 Ariya Hidayat <ariya.hidayat at gmail.com>
   Copyright (C) 2011 Yusuke Suzuki <utatane.tea at gmail.com>
   Copyright (C) 2011 Arpad Borsos <arpad.borsos at googlemail.com>
+  Copyright (C) 2014 Ingvar Stepanyan <me at rreverser.com>
 
   Redistribution and use in source and binary forms, with or without
   modification, are permitted provided that the following conditions are met:
@@ -14465,9 +14466,9 @@ testFail("\"\\u{FFZ}\"", "Bad character escape sequence (1:0)", {ecmaVersion: 6}
 
 testFail("[v] += ary", "Assigning to rvalue (1:0)", {ecmaVersion: 6});
 
-testFail("[2] = 42", "Unexpected token (1:1)", {ecmaVersion: 6});
+testFail("[2] = 42", "Assigning to rvalue (1:1)", {ecmaVersion: 6});
 
-testFail("({ obj:20 }) = 42", "Unexpected token (1:7)", {ecmaVersion: 6});
+testFail("({ obj:20 }) = 42", "Assigning to rvalue (1:7)", {ecmaVersion: 6});
 
 testFail("( { get x() {} } ) = 0", "Unexpected token (1:8)", {ecmaVersion: 6});
 
@@ -14860,7 +14861,7 @@ test("[...a, ] = b", {
   locations: true
 });
 
-testFail("if (b,...a, );", "Unexpected token (1:11)", {ecmaVersion: 6});
+testFail("if (b,...a, );", "Unexpected token (1:12)", {ecmaVersion: 6});
 
 testFail("(b, ...a)", "Unexpected token (1:9)", {ecmaVersion: 6});
 

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-acorn-jsx.git



More information about the Pkg-javascript-commits mailing list