Track ending lines/columns; fix end locations in Mozilla AST.
authorIngvar Stepanyan <me@rreverser.com>
Fri, 8 Aug 2014 11:15:43 +0000 (14:15 +0300)
committerRichard van Velzen <rvanvelzen@experty.com>
Tue, 6 Jan 2015 10:32:41 +0000 (11:32 +0100)
lib/ast.js
lib/mozilla-ast.js
lib/parse.js

index 2eb8cc8..5aa1be3 100644 (file)
@@ -84,7 +84,7 @@ function DEFNODE(type, props, methods, base) {
     return ctor;
 };
 
-var AST_Token = DEFNODE("Token", "type value line col pos endpos nlb comments_before file", {
+var AST_Token = DEFNODE("Token", "type value line col pos endline endcol endpos nlb comments_before file", {
 }, null);
 
 var AST_Node = DEFNODE("Node", "start end", {
index 602ef0e..5056ffe 100644 (file)
     /* -----[ tools ]----- */
 
     function my_start_token(moznode) {
-        var loc = moznode.loc;
+        var loc = moznode.loc, start = loc && loc.start;
         var range = moznode.range;
         return new AST_Token({
             file   : loc && loc.source,
-            line   : loc && loc.start.line,
-            col    : loc && loc.start.column,
+            line   : start && start.line,
+            col    : start && start.column,
             pos    : range ? range[0] : moznode.start,
             endpos : range ? range[0] : moznode.start
         });
     };
 
     function my_end_token(moznode) {
-        var loc = moznode.loc;
+        var loc = moznode.loc, end = loc && loc.end;
         var range = moznode.range;
         return new AST_Token({
-            file   : loc && loc.source,
-            line   : loc && loc.end.line,
-            col    : loc && loc.end.column,
-            pos    : range ? range[1] : moznode.end,
-            endpos : range ? range[1] : moznode.end
+            file    : loc && loc.source,
+            line    : end && end.line,
+            col     : end && end.column,
+            pos     : range ? range[1] : moznode.end,
+            endline : end && end.line,
+            endcol  : end && end.column,
+            endpos  : range ? range[1] : moznode.end
         });
     };
 
         return ast;
     };
 
-    function moz_sub_loc(token) {
-        return token.line ? {
-            line: token.line,
-            column: token.col
-        } : null;
-    };
-
-    function set_moz_loc(mynode, moznode) {
+    function set_moz_loc(mynode, moznode, myparent) {
         var start = mynode.start;
         var end = mynode.end;
-        if (start.pos != null && end.pos != null) {
-            moznode.range = [start.pos, end.pos];
+        if (start.pos != null && end.endpos != null) {
+            moznode.range = [start.pos, end.endpos];
         }
         if (start.line) {
             moznode.loc = {
-                start: moz_sub_loc(start),
-                end: moz_sub_loc(end)
+                start: {line: start.line, column: start.col},
+                end: end.endline ? {line: end.endline, column: end.endcol} : null
             };
             if (start.file) {
                 moznode.loc.source = start.file;
index c3f0822..f463526 100644 (file)
@@ -267,14 +267,16 @@ function tokenizer($TEXT, filename, html5_comments) {
                            (type == "punc" && PUNC_BEFORE_EXPRESSION(value)));
         prev_was_dot = (type == "punc" && value == ".");
         var ret = {
-            type   : type,
-            value  : value,
-            line   : S.tokline,
-            col    : S.tokcol,
-            pos    : S.tokpos,
-            endpos : S.pos,
-            nlb    : S.newline_before,
-            file   : filename
+            type    : type,
+            value   : value,
+            line    : S.tokline,
+            col     : S.tokcol,
+            pos     : S.tokpos,
+            endline : S.line,
+            endcol  : S.col,
+            endpos  : S.pos,
+            nlb     : S.newline_before,
+            file    : filename
         };
         if (!is_comment) {
             ret.comments_before = S.comments_before;
@@ -397,6 +399,7 @@ function tokenizer($TEXT, filename, html5_comments) {
             ret = S.text.substring(S.pos, i);
             S.pos = i;
         }
+        S.col = S.tokcol + (S.pos - S.tokpos);
         S.comments_before.push(token(type, ret, true));
         S.regex_allowed = regex_allowed;
         return next_token();