[Pkg-javascript-commits] [node-acorn-jsx] 236/484: Added `yield` support (completed generators).

Bastien Roucariès rouca at moszumanska.debian.org
Sat Aug 19 14:20:36 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 8f96965d368474ca0bc9e8b7ccab0b85d208725e
Author: Ingvar Stepanyan <me at rreverser.com>
Date:   Sat Jul 26 06:09:29 2014 +0300

    Added `yield` support (completed generators).
---
 acorn.js              | 35 +++++++++++++++++++++---------
 test/tests-harmony.js | 60 +++++++++++++++++++++++++--------------------------
 2 files changed, 55 insertions(+), 40 deletions(-)

diff --git a/acorn.js b/acorn.js
index aa61b15..4101aa7 100644
--- a/acorn.js
+++ b/acorn.js
@@ -220,11 +220,12 @@
   var lastStart, lastEnd, lastEndLoc;
 
   // This is the parser's state. `inFunction` is used to reject
-  // `return` statements outside of functions, `labels` to verify that
-  // `break` and `continue` have somewhere to jump to, and `strict`
-  // indicates whether strict mode is on.
+  // `return` statements outside of functions, `inGenerator` to
+  // reject `yield`s outside of generators, `labels` to verify
+  // that `break` and `continue` have somewhere to jump to, and
+  // `strict` indicates whether strict mode is on.
 
-  var inFunction, labels, strict;
+  var inFunction, inGenerator, labels, strict;
 
   // This counter is used for checking that arrow expressions did
   // not contain nested parentheses in argument list.
@@ -294,6 +295,7 @@
   var _this = {keyword: "this"};
   var _class = {keyword: "class"}, _extends = {keyword: "extends", beforeExpr: true}, _static = {keyword: "static"};
   var _export = {keyword: "export"}, _import = {keyword: "import"}, _from = {keyword: "from"}, _as = {keyword: "as"};
+  var _yield = {keyword: "yield", beforeExpr: true};
 
   // The keywords that denote values.
 
@@ -321,7 +323,7 @@
                       "void": {keyword: "void", prefix: true, beforeExpr: true},
                       "delete": {keyword: "delete", prefix: true, beforeExpr: true},
                       "class": _class, "extends": _extends, "static": _static, "of": _of,
-                      "export": _export, "import": _import, "from": _from, "as": _as};
+                      "export": _export, "import": _import, "from": _from, "as": _as, "yield": _yield};
 
   // Punctuation token types. Again, the `type` property is purely for debugging.
 
@@ -441,7 +443,7 @@
 
   var isEcma5AndLessKeyword = makePredicate(ecma5AndLessKeywords);
 
-  var isEcma6Keyword = makePredicate(ecma5AndLessKeywords + " let const class extends static of export import from as");
+  var isEcma6Keyword = makePredicate(ecma5AndLessKeywords + " let const class extends static of export import from as yield");
 
   var isKeyword = isEcma5AndLessKeyword;
 
@@ -1247,7 +1249,7 @@
   function parseTopLevel(program) {
     lastStart = lastEnd = tokPos;
     if (options.locations) lastEndLoc = new Position;
-    inFunction = strict = null;
+    inFunction = inGenerator = strict = null;
     labels = [];
     readToken();
 
@@ -1855,6 +1857,9 @@
     case _bquote:
       return parseTemplate();
 
+    case _yield:
+      return inGenerator ? parseYield() : parseIdent(true);
+
     default:
       unexpected();
     }
@@ -2119,11 +2124,11 @@
     } else {
       // Start a new scope with regard to labels and the `inFunction`
       // flag (restore them to their old value afterwards).
-      var oldInFunc = inFunction, oldLabels = labels;
-      inFunction = true; labels = [];
+      var oldInFunc = inFunction, oldInGen = inGenerator, oldLabels = labels;
+      inFunction = true; inGenerator = node.generator; labels = [];
       node.body = parseBlock(true);
       node.expression = false;
-      inFunction = oldInFunc; labels = oldLabels;
+      inFunction = oldInFunc; inGenerator = oldInGen; labels = oldLabels;
     }
 
     // If this is a strict mode function, verify that argument names
@@ -2410,4 +2415,14 @@
     return nodes;
   }
 
+  // Parses yield expression inside generator.
+
+  function parseYield() {
+    var node = startNode();
+    next();
+    node.delegate = parseIsGenerator();
+    node.argument = parseExpression(true);
+    return finishNode(node, "YieldExpression");
+  }
+
 });
diff --git a/test/tests-harmony.js b/test/tests-harmony.js
index ce1d941..d0ad3c7 100644
--- a/test/tests-harmony.js
+++ b/test/tests-harmony.js
@@ -5933,10 +5933,10 @@ test("(function* () { yield v })", {
               end: {line: 1, column: 23}
             }
           },
-          range: [16, 24],
+          range: [16, 23],
           loc: {
             start: {line: 1, column: 16},
-            end: {line: 1, column: 24}
+            end: {line: 1, column: 23}
           }
         }],
         range: [14, 25],
@@ -5948,10 +5948,10 @@ test("(function* () { yield v })", {
       rest: null,
       generator: true,
       expression: false,
-      range: [1, 25],
+      range: [0, 26],
       loc: {
-        start: {line: 1, column: 1},
-        end: {line: 1, column: 25}
+        start: {line: 1, column: 0},
+        end: {line: 1, column: 26}
       }
     },
     range: [0, 26],
@@ -6002,10 +6002,10 @@ test("(function* () { yield *v })", {
               end: {line: 1, column: 24}
             }
           },
-          range: [16, 25],
+          range: [16, 24],
           loc: {
             start: {line: 1, column: 16},
-            end: {line: 1, column: 25}
+            end: {line: 1, column: 24}
           }
         }],
         range: [14, 26],
@@ -6017,10 +6017,10 @@ test("(function* () { yield *v })", {
       rest: null,
       generator: true,
       expression: false,
-      range: [1, 26],
+      range: [0, 27],
       loc: {
-        start: {line: 1, column: 1},
-        end: {line: 1, column: 26}
+        start: {line: 1, column: 0},
+        end: {line: 1, column: 27}
       }
     },
     range: [0, 27],
@@ -6077,10 +6077,10 @@ test("function* test () { yield *v }", {
             end: {line: 1, column: 28}
           }
         },
-        range: [20, 29],
+        range: [20, 28],
         loc: {
           start: {line: 1, column: 20},
-          end: {line: 1, column: 29}
+          end: {line: 1, column: 28}
         }
       }],
       range: [18, 30],
@@ -6164,10 +6164,10 @@ test("var x = { *test () { yield *v } };", {
                     end: {line: 1, column: 29}
                   }
                 },
-                range: [21, 30],
+                range: [21, 29],
                 loc: {
                   start: {line: 1, column: 21},
-                  end: {line: 1, column: 30}
+                  end: {line: 1, column: 29}
                 }
               }],
               range: [19, 31],
@@ -6179,9 +6179,9 @@ test("var x = { *test () { yield *v } };", {
             rest: null,
             generator: true,
             expression: false,
-            range: [19, 31],
+            range: [16, 31],
             loc: {
-              start: {line: 1, column: 19},
+              start: {line: 1, column: 16},
               end: {line: 1, column: 31}
             }
           },
@@ -6310,10 +6310,10 @@ test("(function* () { yield yield 10 })", {
               end: {line: 1, column: 30}
             }
           },
-          range: [16, 31],
+          range: [16, 30],
           loc: {
             start: {line: 1, column: 16},
-            end: {line: 1, column: 31}
+            end: {line: 1, column: 30}
           }
         }],
         range: [14, 32],
@@ -6325,10 +6325,10 @@ test("(function* () { yield yield 10 })", {
       rest: null,
       generator: true,
       expression: false,
-      range: [1, 32],
+      range: [0, 33],
       loc: {
-        start: {line: 1, column: 1},
-        end: {line: 1, column: 32}
+        start: {line: 1, column: 0},
+        end: {line: 1, column: 33}
       }
     },
     range: [0, 33],
@@ -7619,9 +7619,9 @@ test("class A {*gen(v) { yield v; }}", {
           rest: null,
           generator: true,
           expression: false,
-          range: [17, 29],
+          range: [13, 29],
           loc: {
-            start: {line: 1, column: 17},
+            start: {line: 1, column: 13},
             end: {line: 1, column: 29}
           }
         },
@@ -7733,9 +7733,9 @@ test("class A { static *gen(v) { yield v; }}", {
           rest: null,
           generator: true,
           expression: false,
-          range: [25, 37],
+          range: [21, 37],
           loc: {
-            start: {line: 1, column: 25},
+            start: {line: 1, column: 21},
             end: {line: 1, column: 37}
           }
         },
@@ -9887,9 +9887,9 @@ test("var x = {*[test]() { yield *v; }}", {
             rest: null,
             generator: true,
             expression: false,
-            range: [19, 32],
+            range: [16, 32],
             loc: {
-              start: {line: 1, column: 19},
+              start: {line: 1, column: 16},
               end: {line: 1, column: 32}
             }
           },
@@ -14653,7 +14653,7 @@ test("e => yield* 10", {
   locations: true
 });
 
-testFail("(function () { yield 10 })", "Unexpected token (1:22)", {ecmaVersion: 6});
+testFail("(function () { yield 10 })", "Unexpected token (1:21)", {ecmaVersion: 6});
 
 test("(function () { yield* 10 })", {
   type: "Program",
@@ -14736,9 +14736,9 @@ test("(function () { yield* 10 })", {
 
 testFail("(function() { \"use strict\"; f(yield v) })", "Unexpected token (1:36)", {ecmaVersion: 6});
 
-testFail("var obj = { *test** }", "Unexpected token (1:18)", {ecmaVersion: 6});
+testFail("var obj = { *test** }", "Unexpected token (1:17)", {ecmaVersion: 6});
 
-testFail("class A extends yield B { }", "Unexpected token (1:23)", {ecmaVersion: 6});
+testFail("class A extends yield B { }", "Unexpected token (1:22)", {ecmaVersion: 6});
 
 testFail("class default", "Unexpected token (1:6)", {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