diff --git a/lib/mozilla-ast.js b/lib/mozilla-ast.js index c1b2b683..04e9440d 100644 --- a/lib/mozilla-ast.js +++ b/lib/mozilla-ast.js @@ -110,7 +110,7 @@ MemberExpression: function(M) { return new (M.computed ? AST_Sub : AST_Dot)({ start : my_start_token(M), - end : my_end_token(M), + end : M.computed ? my_end_token(M) : my_full_token(M.property), property : M.computed ? from_moz(M.property) : M.property.name, expression : from_moz(M.object) }); @@ -170,6 +170,20 @@ end : my_end_token(M), name : M.name }); + }, + ArrayExpression: function (M) { + var start = my_start_token(M); + var end = my_end_token(M); + return new AST_Array({ + start: start, + end: end, + elements: M.elements.map(function (E) { + return E ? from_moz(E) : new AST_Hole({ + start: start, + end: end + }); + }) + }); } }; @@ -206,7 +220,6 @@ map("CatchClause", AST_Catch, "param>argname, body%body"); map("ThisExpression", AST_This); - map("ArrayExpression", AST_Array, "elements@elements"); map("FunctionExpression", AST_Function, "id>name, params@argnames, body%body"); map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right"); map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right"); @@ -215,6 +228,13 @@ map("NewExpression", AST_New, "callee>expression, arguments@args"); map("CallExpression", AST_Call, "callee>expression, arguments@args"); + def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) { + return { + type: "ArrayExpression", + elements: M.elements.map(to_moz) + } + }); + def_to_moz(AST_Directive, function To_Moz_Directive(M) { return { type: "ExpressionStatement", @@ -427,6 +447,22 @@ }); }; + function my_full_token(moznode) { + var loc = moznode.loc, + start = loc && loc.start, + end = loc && loc.end; + var range = moznode.range; + return new AST_Token({ + file : loc && loc.source, + line : start && start.line, + col : start && start.column, + pos : range ? range[0] : moznode.start, + endline : end && end.line, + endcol : end && end.column, + endpos : range ? range[1] : moznode.end + }); + }; + function map(moztype, mytype, propmap) { var moz_to_me = "function From_Moz_" + moztype + "(M){\n"; moz_to_me += "return new U2." + mytype.name + "({\n" +