[Pkg-javascript-commits] [node-acorn-jsx] 263/484: Added example for comments attachment.

Bastien Roucariès rouca at moszumanska.debian.org
Sat Aug 19 14:20:41 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 1bf8c1420fe4c976594aee6937e9e7b89129fc0a
Author: Ingvar Stepanyan <me at rreverser.com>
Date:   Thu Jul 31 13:50:56 2014 +0300

    Added example for comments attachment.
    
    * Fixed `onToken` & `tokenize` to return `startLoc` & `endLoc`
    in token object only when `options.locations` is `true`.
    * Fixed `onToken` tests.
    * Added example for generating comments with escodegen.
---
 README.md     | 41 ++++++++++++++++++++++++++++++++++++++++-
 acorn.js      | 31 +++++++++++++++++--------------
 test/tests.js | 58 +++++++++++++++++++++++++++-------------------------------
 3 files changed, 84 insertions(+), 46 deletions(-)

diff --git a/README.md b/README.md
index 4a7420d..b7d2e23 100644
--- a/README.md
+++ b/README.md
@@ -74,7 +74,7 @@ object referring to that same position.
   form. Default is `false`.
 
 - **onToken**: If a function is passed for this option, each found
-  token will be passed in format that `tokenize()` method provides.
+  token will be passed in same format as `tokenize()` returns.
 
 - **onComment**: If a function is passed for this option, whenever a
   comment is encountered the function will be called with the
@@ -132,6 +132,45 @@ can't count on it staying stable.
 **tokTypes** holds an object mapping names to the token type objects
 that end up in the `type` properties of tokens.
 
+#### Note on using with [Escodegen][escodegen]
+
+Escodegen supports generating comments from AST, attached in
+Esprima-specific format. In order to simulate same format in
+Acorn, consider following example (this may be simplified
+in future):
+
+```javascript
+var comments = [], tokens = [];
+
+var ast = acorn.parse('var x = 42; // answer', {
+	// collect ranges for each node
+	ranges: true,
+	// collect comments in Esprima's format
+	onComment: function (block, text, start, end) {
+		comments.push({
+			type: block ? 'Block' : 'Line',
+			value: text,
+			range: [start, end]
+		});
+	},
+	// collect token ranges
+	onToken: function (token) {
+		tokens.push({
+			range: [token.start, token.end]
+		});
+	}
+});
+
+// attach comments using collected information
+escodegen.attachComments(ast, comments, tokens);
+
+// generate code
+console.log(escodegen.generate(ast, {comment: true}));
+// > 'var x = 42;    // answer'
+```
+
+[escodegen]: https://github.com/Constellation/escodegen
+
 ### acorn_loose.js ###
 
 This file implements an error-tolerant parser. It exposes a single
diff --git a/acorn.js b/acorn.js
index 3a93936..5c09efb 100644
--- a/acorn.js
+++ b/acorn.js
@@ -76,7 +76,7 @@
     locations: false,
     // A function can be passed as `onToken` option, which will
     // cause Acorn to call that function with object in the same
-    // format as is used in tokenize(). Note that you are not
+    // format as tokenize() returns. Note that you are not
     // allowed to call the parser from the callback—that will
     // corrupt its internal state.
     onToken: null,
@@ -141,6 +141,20 @@
     return {line: line, column: offset - cur};
   };
 
+  var getCurrentToken = function () {
+    var token = {
+      type: tokType,
+      value: tokVal,
+      start: tokStart,
+      end: tokEnd
+    };
+    if (options.locations) {
+      token.startLoc = tokStartLoc;
+      token.endLoc = tokEndLoc;
+    }
+    return token;
+  };
+
   // Acorn is organized as a tokenizer and a recursive-descent parser.
   // The `tokenize` export provides an interface to the tokenizer.
   // Because the tokenizer is optimized for being efficiently used by
@@ -153,14 +167,10 @@
     setOptions(opts);
     initTokenState();
 
-    var t = {};
     function getToken(forceRegexp) {
       lastEnd = tokEnd;
       readToken(forceRegexp);
-      t.start = tokStart; t.end = tokEnd;
-      t.startLoc = tokStartLoc; t.endLoc = tokEndLoc;
-      t.type = tokType; t.value = tokVal;
-      return t;
+      return getCurrentToken();
     }
     getToken.jumpTo = function(pos, reAllowed) {
       tokPos = pos;
@@ -533,14 +543,7 @@
     tokVal = val;
     tokRegexpAllowed = type.beforeExpr;
     if (options.onToken) {
-      options.onToken({
-        start: tokStart,
-        end: tokEnd,
-        startLoc: tokStartLoc,
-        endLoc: tokEndLoc,
-        type: tokType,
-        value: tokVal
-      });
+      options.onToken(getCurrentToken());
     }
   }
 
diff --git a/test/tests.js b/test/tests.js
index ee9dd10..2259f75 100644
--- a/test/tests.js
+++ b/test/tests.js
@@ -28658,80 +28658,76 @@ testFail("for(const x = 0;;);", "Unexpected token (1:4)", {ecmaVersion: 6});
   var actualTokens = [],
       expectedTokens = [
         {
+          type: tokTypes._var,
+          value: "var",
           start: 0,
           end: 3,
           startLoc: {line: 1, column: 0},
-          endLoc: {line: 1, column: 3},
-          type: tokTypes._var,
-          value: "var"
+          endLoc: {line: 1, column: 3}
         },
         {
+          type: tokTypes.name,
+          value: "x",
           start: 4,
           end: 5,
           startLoc: {line: 1, column: 4},
-          endLoc: {line: 1, column: 5},
-          type: tokTypes.name,
-          value: "x"
+          endLoc: {line: 1, column: 5}
         },
         {
+          type: tokTypes.eq,
+          value: "=",
           start: 6,
           end: 7,
           startLoc: {line: 1, column: 6},
-          endLoc: {line: 1, column: 7},
-          type: tokTypes.eq,
-          value: "="
+          endLoc: {line: 1, column: 7}
         },
         {
+          type: tokTypes.parenL,
+          value: undefined,
           start: 8,
           end: 9,
           startLoc: {line: 1, column: 8},
-          endLoc: {line: 1, column: 9},
-          type: tokTypes.parenL,
-          value: undefined
+          endLoc: {line: 1, column: 9}
         },
         {
+          type: tokTypes.num,
+          value: 1,
           start: 9,
           end: 10,
           startLoc: {line: 1, column: 9},
-          endLoc: {line: 1, column: 10},
-          type: tokTypes.num,
-          value: 1
+          endLoc: {line: 1, column: 10}
         },
         {
+          type: {binop: 9, prefix: true, beforeExpr: true},
+          value: "+",
           start: 11,
           end: 12,
           startLoc: {line: 1, column: 11},
-          endLoc: {line: 1, column: 12},
-          type: {
-            binop: 9,
-            prefix: true,
-            beforeExpr: true
-          },
-          value: "+"
+          endLoc: {line: 1, column: 12}
         },
         {
+          type: tokTypes.num,
+          value: 2,
           start: 13,
           end: 14,
           startLoc: {line: 1, column: 13},
-          endLoc: {line: 1, column: 14},
-          type: tokTypes.num,
-          value: 2
+          endLoc: {line: 1, column: 14}
         },
         {
+          type: tokTypes.parenR,
+          value: undefined,
           start: 14,
           end: 15,
           startLoc: {line: 1, column: 14},
-          endLoc: {line: 1, column: 15},
-          type: tokTypes.parenR,
-          value: undefined
+          endLoc: {line: 1, column: 15}
         },
         {
+          type: tokTypes.eof,
+          value: undefined,
           start: 15,
           end: 15,
           startLoc: {line: 1, column: 15},
-          endLoc: {line: 1, column: 15},
-          type: tokTypes.eof,
-          value: undefined
+          endLoc: {line: 1, column: 15}
         }
       ];
   testAssert('var x = (1 + 2)', function assert(ast) {

-- 
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