[6a3a178] | 1 | /***********************************************************************
|
---|
| 2 |
|
---|
| 3 | A JavaScript tokenizer / parser / beautifier / compressor.
|
---|
| 4 | https://github.com/mishoo/UglifyJS2
|
---|
| 5 |
|
---|
| 6 | -------------------------------- (C) ---------------------------------
|
---|
| 7 |
|
---|
| 8 | Author: Mihai Bazon
|
---|
| 9 | <mihai.bazon@gmail.com>
|
---|
| 10 | http://mihai.bazon.net/blog
|
---|
| 11 |
|
---|
| 12 | Distributed under the BSD license:
|
---|
| 13 |
|
---|
| 14 | Copyright 2012 (c) Mihai Bazon <mihai.bazon@gmail.com>
|
---|
| 15 |
|
---|
| 16 | Redistribution and use in source and binary forms, with or without
|
---|
| 17 | modification, are permitted provided that the following conditions
|
---|
| 18 | are met:
|
---|
| 19 |
|
---|
| 20 | * Redistributions of source code must retain the above
|
---|
| 21 | copyright notice, this list of conditions and the following
|
---|
| 22 | disclaimer.
|
---|
| 23 |
|
---|
| 24 | * Redistributions in binary form must reproduce the above
|
---|
| 25 | copyright notice, this list of conditions and the following
|
---|
| 26 | disclaimer in the documentation and/or other materials
|
---|
| 27 | provided with the distribution.
|
---|
| 28 |
|
---|
| 29 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
|
---|
| 30 | EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
---|
| 31 | IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
---|
| 32 | PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
|
---|
| 33 | LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
|
---|
| 34 | OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
---|
| 35 | PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
---|
| 36 | PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
---|
| 37 | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
|
---|
| 38 | TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
|
---|
| 39 | THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
---|
| 40 | SUCH DAMAGE.
|
---|
| 41 |
|
---|
| 42 | ***********************************************************************/
|
---|
| 43 |
|
---|
| 44 | import * as ast from "./ast.js";
|
---|
| 45 | import { make_node } from "./utils/index.js";
|
---|
| 46 | import {
|
---|
| 47 | AST_Accessor,
|
---|
| 48 | AST_Array,
|
---|
| 49 | AST_Arrow,
|
---|
| 50 | AST_Assign,
|
---|
| 51 | AST_Atom,
|
---|
| 52 | AST_Await,
|
---|
| 53 | AST_BigInt,
|
---|
| 54 | AST_Binary,
|
---|
| 55 | AST_Block,
|
---|
| 56 | AST_BlockStatement,
|
---|
| 57 | AST_Boolean,
|
---|
| 58 | AST_Break,
|
---|
| 59 | AST_Call,
|
---|
| 60 | AST_Case,
|
---|
| 61 | AST_Catch,
|
---|
| 62 | AST_Chain,
|
---|
| 63 | AST_Class,
|
---|
| 64 | AST_ClassExpression,
|
---|
| 65 | AST_ClassProperty,
|
---|
| 66 | AST_ClassPrivateProperty,
|
---|
| 67 | AST_ConciseMethod,
|
---|
| 68 | AST_Conditional,
|
---|
| 69 | AST_Const,
|
---|
| 70 | AST_Constant,
|
---|
| 71 | AST_Continue,
|
---|
| 72 | AST_Debugger,
|
---|
| 73 | AST_Default,
|
---|
| 74 | AST_DefaultAssign,
|
---|
| 75 | AST_DefClass,
|
---|
| 76 | AST_Definitions,
|
---|
| 77 | AST_Defun,
|
---|
| 78 | AST_Destructuring,
|
---|
| 79 | AST_Directive,
|
---|
| 80 | AST_Do,
|
---|
| 81 | AST_Dot,
|
---|
| 82 | AST_DotHash,
|
---|
| 83 | AST_EmptyStatement,
|
---|
| 84 | AST_Expansion,
|
---|
| 85 | AST_Export,
|
---|
| 86 | AST_False,
|
---|
| 87 | AST_Finally,
|
---|
| 88 | AST_For,
|
---|
| 89 | AST_ForIn,
|
---|
| 90 | AST_ForOf,
|
---|
| 91 | AST_Function,
|
---|
| 92 | AST_Hole,
|
---|
| 93 | AST_If,
|
---|
| 94 | AST_Import,
|
---|
| 95 | AST_ImportMeta,
|
---|
| 96 | AST_Label,
|
---|
| 97 | AST_LabeledStatement,
|
---|
| 98 | AST_LabelRef,
|
---|
| 99 | AST_Lambda,
|
---|
| 100 | AST_Let,
|
---|
| 101 | AST_NameMapping,
|
---|
| 102 | AST_New,
|
---|
| 103 | AST_NewTarget,
|
---|
| 104 | AST_Node,
|
---|
| 105 | AST_Null,
|
---|
| 106 | AST_Number,
|
---|
| 107 | AST_Object,
|
---|
| 108 | AST_ObjectGetter,
|
---|
| 109 | AST_ObjectKeyVal,
|
---|
| 110 | AST_ObjectProperty,
|
---|
| 111 | AST_ObjectSetter,
|
---|
| 112 | AST_PrefixedTemplateString,
|
---|
| 113 | AST_PrivateGetter,
|
---|
| 114 | AST_PrivateMethod,
|
---|
| 115 | AST_PrivateSetter,
|
---|
| 116 | AST_PropAccess,
|
---|
| 117 | AST_RegExp,
|
---|
| 118 | AST_Return,
|
---|
| 119 | AST_Sequence,
|
---|
| 120 | AST_SimpleStatement,
|
---|
| 121 | AST_Statement,
|
---|
| 122 | AST_String,
|
---|
| 123 | AST_Sub,
|
---|
| 124 | AST_Super,
|
---|
| 125 | AST_Switch,
|
---|
| 126 | AST_SwitchBranch,
|
---|
| 127 | AST_Symbol,
|
---|
| 128 | AST_SymbolCatch,
|
---|
| 129 | AST_SymbolClass,
|
---|
| 130 | AST_SymbolClassProperty,
|
---|
| 131 | AST_SymbolConst,
|
---|
| 132 | AST_SymbolDefClass,
|
---|
| 133 | AST_SymbolDefun,
|
---|
| 134 | AST_SymbolExport,
|
---|
| 135 | AST_SymbolExportForeign,
|
---|
| 136 | AST_SymbolFunarg,
|
---|
| 137 | AST_SymbolImport,
|
---|
| 138 | AST_SymbolImportForeign,
|
---|
| 139 | AST_SymbolLambda,
|
---|
| 140 | AST_SymbolLet,
|
---|
| 141 | AST_SymbolMethod,
|
---|
| 142 | AST_SymbolRef,
|
---|
| 143 | AST_SymbolVar,
|
---|
| 144 | AST_TemplateSegment,
|
---|
| 145 | AST_TemplateString,
|
---|
| 146 | AST_This,
|
---|
| 147 | AST_Throw,
|
---|
| 148 | AST_Token,
|
---|
| 149 | AST_Toplevel,
|
---|
| 150 | AST_True,
|
---|
| 151 | AST_Try,
|
---|
| 152 | AST_Unary,
|
---|
| 153 | AST_UnaryPostfix,
|
---|
| 154 | AST_UnaryPrefix,
|
---|
| 155 | AST_Var,
|
---|
| 156 | AST_VarDef,
|
---|
| 157 | AST_While,
|
---|
| 158 | AST_With,
|
---|
| 159 | AST_Yield,
|
---|
| 160 | } from "./ast.js";
|
---|
| 161 |
|
---|
| 162 | (function() {
|
---|
| 163 |
|
---|
| 164 | var normalize_directives = function(body) {
|
---|
| 165 | var in_directive = true;
|
---|
| 166 |
|
---|
| 167 | for (var i = 0; i < body.length; i++) {
|
---|
| 168 | if (in_directive && body[i] instanceof AST_Statement && body[i].body instanceof AST_String) {
|
---|
| 169 | body[i] = new AST_Directive({
|
---|
| 170 | start: body[i].start,
|
---|
| 171 | end: body[i].end,
|
---|
| 172 | value: body[i].body.value
|
---|
| 173 | });
|
---|
| 174 | } else if (in_directive && !(body[i] instanceof AST_Statement && body[i].body instanceof AST_String)) {
|
---|
| 175 | in_directive = false;
|
---|
| 176 | }
|
---|
| 177 | }
|
---|
| 178 |
|
---|
| 179 | return body;
|
---|
| 180 | };
|
---|
| 181 |
|
---|
| 182 | var MOZ_TO_ME = {
|
---|
| 183 | Program: function(M) {
|
---|
| 184 | return new AST_Toplevel({
|
---|
| 185 | start: my_start_token(M),
|
---|
| 186 | end: my_end_token(M),
|
---|
| 187 | body: normalize_directives(M.body.map(from_moz))
|
---|
| 188 | });
|
---|
| 189 | },
|
---|
| 190 | ArrayPattern: function(M) {
|
---|
| 191 | return new AST_Destructuring({
|
---|
| 192 | start: my_start_token(M),
|
---|
| 193 | end: my_end_token(M),
|
---|
| 194 | names: M.elements.map(function(elm) {
|
---|
| 195 | if (elm === null) {
|
---|
| 196 | return new AST_Hole();
|
---|
| 197 | }
|
---|
| 198 | return from_moz(elm);
|
---|
| 199 | }),
|
---|
| 200 | is_array: true
|
---|
| 201 | });
|
---|
| 202 | },
|
---|
| 203 | ObjectPattern: function(M) {
|
---|
| 204 | return new AST_Destructuring({
|
---|
| 205 | start: my_start_token(M),
|
---|
| 206 | end: my_end_token(M),
|
---|
| 207 | names: M.properties.map(from_moz),
|
---|
| 208 | is_array: false
|
---|
| 209 | });
|
---|
| 210 | },
|
---|
| 211 | AssignmentPattern: function(M) {
|
---|
| 212 | return new AST_DefaultAssign({
|
---|
| 213 | start: my_start_token(M),
|
---|
| 214 | end: my_end_token(M),
|
---|
| 215 | left: from_moz(M.left),
|
---|
| 216 | operator: "=",
|
---|
| 217 | right: from_moz(M.right)
|
---|
| 218 | });
|
---|
| 219 | },
|
---|
| 220 | SpreadElement: function(M) {
|
---|
| 221 | return new AST_Expansion({
|
---|
| 222 | start: my_start_token(M),
|
---|
| 223 | end: my_end_token(M),
|
---|
| 224 | expression: from_moz(M.argument)
|
---|
| 225 | });
|
---|
| 226 | },
|
---|
| 227 | RestElement: function(M) {
|
---|
| 228 | return new AST_Expansion({
|
---|
| 229 | start: my_start_token(M),
|
---|
| 230 | end: my_end_token(M),
|
---|
| 231 | expression: from_moz(M.argument)
|
---|
| 232 | });
|
---|
| 233 | },
|
---|
| 234 | TemplateElement: function(M) {
|
---|
| 235 | return new AST_TemplateSegment({
|
---|
| 236 | start: my_start_token(M),
|
---|
| 237 | end: my_end_token(M),
|
---|
| 238 | value: M.value.cooked,
|
---|
| 239 | raw: M.value.raw
|
---|
| 240 | });
|
---|
| 241 | },
|
---|
| 242 | TemplateLiteral: function(M) {
|
---|
| 243 | var segments = [];
|
---|
| 244 | for (var i = 0; i < M.quasis.length; i++) {
|
---|
| 245 | segments.push(from_moz(M.quasis[i]));
|
---|
| 246 | if (M.expressions[i]) {
|
---|
| 247 | segments.push(from_moz(M.expressions[i]));
|
---|
| 248 | }
|
---|
| 249 | }
|
---|
| 250 | return new AST_TemplateString({
|
---|
| 251 | start: my_start_token(M),
|
---|
| 252 | end: my_end_token(M),
|
---|
| 253 | segments: segments
|
---|
| 254 | });
|
---|
| 255 | },
|
---|
| 256 | TaggedTemplateExpression: function(M) {
|
---|
| 257 | return new AST_PrefixedTemplateString({
|
---|
| 258 | start: my_start_token(M),
|
---|
| 259 | end: my_end_token(M),
|
---|
| 260 | template_string: from_moz(M.quasi),
|
---|
| 261 | prefix: from_moz(M.tag)
|
---|
| 262 | });
|
---|
| 263 | },
|
---|
| 264 | FunctionDeclaration: function(M) {
|
---|
| 265 | return new AST_Defun({
|
---|
| 266 | start: my_start_token(M),
|
---|
| 267 | end: my_end_token(M),
|
---|
| 268 | name: from_moz(M.id),
|
---|
| 269 | argnames: M.params.map(from_moz),
|
---|
| 270 | is_generator: M.generator,
|
---|
| 271 | async: M.async,
|
---|
| 272 | body: normalize_directives(from_moz(M.body).body)
|
---|
| 273 | });
|
---|
| 274 | },
|
---|
| 275 | FunctionExpression: function(M) {
|
---|
| 276 | return new AST_Function({
|
---|
| 277 | start: my_start_token(M),
|
---|
| 278 | end: my_end_token(M),
|
---|
| 279 | name: from_moz(M.id),
|
---|
| 280 | argnames: M.params.map(from_moz),
|
---|
| 281 | is_generator: M.generator,
|
---|
| 282 | async: M.async,
|
---|
| 283 | body: normalize_directives(from_moz(M.body).body)
|
---|
| 284 | });
|
---|
| 285 | },
|
---|
| 286 | ArrowFunctionExpression: function(M) {
|
---|
| 287 | const body = M.body.type === "BlockStatement"
|
---|
| 288 | ? from_moz(M.body).body
|
---|
| 289 | : [make_node(AST_Return, {}, { value: from_moz(M.body) })];
|
---|
| 290 | return new AST_Arrow({
|
---|
| 291 | start: my_start_token(M),
|
---|
| 292 | end: my_end_token(M),
|
---|
| 293 | argnames: M.params.map(from_moz),
|
---|
| 294 | body,
|
---|
| 295 | async: M.async,
|
---|
| 296 | });
|
---|
| 297 | },
|
---|
| 298 | ExpressionStatement: function(M) {
|
---|
| 299 | return new AST_SimpleStatement({
|
---|
| 300 | start: my_start_token(M),
|
---|
| 301 | end: my_end_token(M),
|
---|
| 302 | body: from_moz(M.expression)
|
---|
| 303 | });
|
---|
| 304 | },
|
---|
| 305 | TryStatement: function(M) {
|
---|
| 306 | var handlers = M.handlers || [M.handler];
|
---|
| 307 | if (handlers.length > 1 || M.guardedHandlers && M.guardedHandlers.length) {
|
---|
| 308 | throw new Error("Multiple catch clauses are not supported.");
|
---|
| 309 | }
|
---|
| 310 | return new AST_Try({
|
---|
| 311 | start : my_start_token(M),
|
---|
| 312 | end : my_end_token(M),
|
---|
| 313 | body : from_moz(M.block).body,
|
---|
| 314 | bcatch : from_moz(handlers[0]),
|
---|
| 315 | bfinally : M.finalizer ? new AST_Finally(from_moz(M.finalizer)) : null
|
---|
| 316 | });
|
---|
| 317 | },
|
---|
| 318 | Property: function(M) {
|
---|
| 319 | var key = M.key;
|
---|
| 320 | var args = {
|
---|
| 321 | start : my_start_token(key || M.value),
|
---|
| 322 | end : my_end_token(M.value),
|
---|
| 323 | key : key.type == "Identifier" ? key.name : key.value,
|
---|
| 324 | value : from_moz(M.value)
|
---|
| 325 | };
|
---|
| 326 | if (M.computed) {
|
---|
| 327 | args.key = from_moz(M.key);
|
---|
| 328 | }
|
---|
| 329 | if (M.method) {
|
---|
| 330 | args.is_generator = M.value.generator;
|
---|
| 331 | args.async = M.value.async;
|
---|
| 332 | if (!M.computed) {
|
---|
| 333 | args.key = new AST_SymbolMethod({ name: args.key });
|
---|
| 334 | } else {
|
---|
| 335 | args.key = from_moz(M.key);
|
---|
| 336 | }
|
---|
| 337 | return new AST_ConciseMethod(args);
|
---|
| 338 | }
|
---|
| 339 | if (M.kind == "init") {
|
---|
| 340 | if (key.type != "Identifier" && key.type != "Literal") {
|
---|
| 341 | args.key = from_moz(key);
|
---|
| 342 | }
|
---|
| 343 | return new AST_ObjectKeyVal(args);
|
---|
| 344 | }
|
---|
| 345 | if (typeof args.key === "string" || typeof args.key === "number") {
|
---|
| 346 | args.key = new AST_SymbolMethod({
|
---|
| 347 | name: args.key
|
---|
| 348 | });
|
---|
| 349 | }
|
---|
| 350 | args.value = new AST_Accessor(args.value);
|
---|
| 351 | if (M.kind == "get") return new AST_ObjectGetter(args);
|
---|
| 352 | if (M.kind == "set") return new AST_ObjectSetter(args);
|
---|
| 353 | if (M.kind == "method") {
|
---|
| 354 | args.async = M.value.async;
|
---|
| 355 | args.is_generator = M.value.generator;
|
---|
| 356 | args.quote = M.computed ? "\"" : null;
|
---|
| 357 | return new AST_ConciseMethod(args);
|
---|
| 358 | }
|
---|
| 359 | },
|
---|
| 360 | MethodDefinition: function(M) {
|
---|
| 361 | var args = {
|
---|
| 362 | start : my_start_token(M),
|
---|
| 363 | end : my_end_token(M),
|
---|
| 364 | key : M.computed ? from_moz(M.key) : new AST_SymbolMethod({ name: M.key.name || M.key.value }),
|
---|
| 365 | value : from_moz(M.value),
|
---|
| 366 | static : M.static,
|
---|
| 367 | };
|
---|
| 368 | if (M.kind == "get") {
|
---|
| 369 | return new AST_ObjectGetter(args);
|
---|
| 370 | }
|
---|
| 371 | if (M.kind == "set") {
|
---|
| 372 | return new AST_ObjectSetter(args);
|
---|
| 373 | }
|
---|
| 374 | args.is_generator = M.value.generator;
|
---|
| 375 | args.async = M.value.async;
|
---|
| 376 | return new AST_ConciseMethod(args);
|
---|
| 377 | },
|
---|
| 378 | FieldDefinition: function(M) {
|
---|
| 379 | let key;
|
---|
| 380 | if (M.computed) {
|
---|
| 381 | key = from_moz(M.key);
|
---|
| 382 | } else {
|
---|
| 383 | if (M.key.type !== "Identifier") throw new Error("Non-Identifier key in FieldDefinition");
|
---|
| 384 | key = from_moz(M.key);
|
---|
| 385 | }
|
---|
| 386 | return new AST_ClassProperty({
|
---|
| 387 | start : my_start_token(M),
|
---|
| 388 | end : my_end_token(M),
|
---|
| 389 | key,
|
---|
| 390 | value : from_moz(M.value),
|
---|
| 391 | static : M.static,
|
---|
| 392 | });
|
---|
| 393 | },
|
---|
| 394 | PropertyDefinition: function(M) {
|
---|
| 395 | let key;
|
---|
| 396 | if (M.computed) {
|
---|
| 397 | key = from_moz(M.key);
|
---|
| 398 | } else {
|
---|
| 399 | if (M.key.type !== "Identifier") throw new Error("Non-Identifier key in PropertyDefinition");
|
---|
| 400 | key = from_moz(M.key);
|
---|
| 401 | }
|
---|
| 402 |
|
---|
| 403 | return new AST_ClassProperty({
|
---|
| 404 | start : my_start_token(M),
|
---|
| 405 | end : my_end_token(M),
|
---|
| 406 | key,
|
---|
| 407 | value : from_moz(M.value),
|
---|
| 408 | static : M.static,
|
---|
| 409 | });
|
---|
| 410 | },
|
---|
| 411 | ArrayExpression: function(M) {
|
---|
| 412 | return new AST_Array({
|
---|
| 413 | start : my_start_token(M),
|
---|
| 414 | end : my_end_token(M),
|
---|
| 415 | elements : M.elements.map(function(elem) {
|
---|
| 416 | return elem === null ? new AST_Hole() : from_moz(elem);
|
---|
| 417 | })
|
---|
| 418 | });
|
---|
| 419 | },
|
---|
| 420 | ObjectExpression: function(M) {
|
---|
| 421 | return new AST_Object({
|
---|
| 422 | start : my_start_token(M),
|
---|
| 423 | end : my_end_token(M),
|
---|
| 424 | properties : M.properties.map(function(prop) {
|
---|
| 425 | if (prop.type === "SpreadElement") {
|
---|
| 426 | return from_moz(prop);
|
---|
| 427 | }
|
---|
| 428 | prop.type = "Property";
|
---|
| 429 | return from_moz(prop);
|
---|
| 430 | })
|
---|
| 431 | });
|
---|
| 432 | },
|
---|
| 433 | SequenceExpression: function(M) {
|
---|
| 434 | return new AST_Sequence({
|
---|
| 435 | start : my_start_token(M),
|
---|
| 436 | end : my_end_token(M),
|
---|
| 437 | expressions: M.expressions.map(from_moz)
|
---|
| 438 | });
|
---|
| 439 | },
|
---|
| 440 | MemberExpression: function(M) {
|
---|
| 441 | return new (M.computed ? AST_Sub : AST_Dot)({
|
---|
| 442 | start : my_start_token(M),
|
---|
| 443 | end : my_end_token(M),
|
---|
| 444 | property : M.computed ? from_moz(M.property) : M.property.name,
|
---|
| 445 | expression : from_moz(M.object),
|
---|
| 446 | optional : M.optional || false
|
---|
| 447 | });
|
---|
| 448 | },
|
---|
| 449 | ChainExpression: function(M) {
|
---|
| 450 | return new AST_Chain({
|
---|
| 451 | start : my_start_token(M),
|
---|
| 452 | end : my_end_token(M),
|
---|
| 453 | expression : from_moz(M.expression)
|
---|
| 454 | });
|
---|
| 455 | },
|
---|
| 456 | SwitchCase: function(M) {
|
---|
| 457 | return new (M.test ? AST_Case : AST_Default)({
|
---|
| 458 | start : my_start_token(M),
|
---|
| 459 | end : my_end_token(M),
|
---|
| 460 | expression : from_moz(M.test),
|
---|
| 461 | body : M.consequent.map(from_moz)
|
---|
| 462 | });
|
---|
| 463 | },
|
---|
| 464 | VariableDeclaration: function(M) {
|
---|
| 465 | return new (M.kind === "const" ? AST_Const :
|
---|
| 466 | M.kind === "let" ? AST_Let : AST_Var)({
|
---|
| 467 | start : my_start_token(M),
|
---|
| 468 | end : my_end_token(M),
|
---|
| 469 | definitions : M.declarations.map(from_moz)
|
---|
| 470 | });
|
---|
| 471 | },
|
---|
| 472 |
|
---|
| 473 | ImportDeclaration: function(M) {
|
---|
| 474 | var imported_name = null;
|
---|
| 475 | var imported_names = null;
|
---|
| 476 | M.specifiers.forEach(function (specifier) {
|
---|
| 477 | if (specifier.type === "ImportSpecifier") {
|
---|
| 478 | if (!imported_names) { imported_names = []; }
|
---|
| 479 | imported_names.push(new AST_NameMapping({
|
---|
| 480 | start: my_start_token(specifier),
|
---|
| 481 | end: my_end_token(specifier),
|
---|
| 482 | foreign_name: from_moz(specifier.imported),
|
---|
| 483 | name: from_moz(specifier.local)
|
---|
| 484 | }));
|
---|
| 485 | } else if (specifier.type === "ImportDefaultSpecifier") {
|
---|
| 486 | imported_name = from_moz(specifier.local);
|
---|
| 487 | } else if (specifier.type === "ImportNamespaceSpecifier") {
|
---|
| 488 | if (!imported_names) { imported_names = []; }
|
---|
| 489 | imported_names.push(new AST_NameMapping({
|
---|
| 490 | start: my_start_token(specifier),
|
---|
| 491 | end: my_end_token(specifier),
|
---|
| 492 | foreign_name: new AST_SymbolImportForeign({ name: "*" }),
|
---|
| 493 | name: from_moz(specifier.local)
|
---|
| 494 | }));
|
---|
| 495 | }
|
---|
| 496 | });
|
---|
| 497 | return new AST_Import({
|
---|
| 498 | start : my_start_token(M),
|
---|
| 499 | end : my_end_token(M),
|
---|
| 500 | imported_name: imported_name,
|
---|
| 501 | imported_names : imported_names,
|
---|
| 502 | module_name : from_moz(M.source)
|
---|
| 503 | });
|
---|
| 504 | },
|
---|
| 505 | ExportAllDeclaration: function(M) {
|
---|
| 506 | return new AST_Export({
|
---|
| 507 | start: my_start_token(M),
|
---|
| 508 | end: my_end_token(M),
|
---|
| 509 | exported_names: [
|
---|
| 510 | new AST_NameMapping({
|
---|
| 511 | name: new AST_SymbolExportForeign({ name: "*" }),
|
---|
| 512 | foreign_name: new AST_SymbolExportForeign({ name: "*" })
|
---|
| 513 | })
|
---|
| 514 | ],
|
---|
| 515 | module_name: from_moz(M.source)
|
---|
| 516 | });
|
---|
| 517 | },
|
---|
| 518 | ExportNamedDeclaration: function(M) {
|
---|
| 519 | return new AST_Export({
|
---|
| 520 | start: my_start_token(M),
|
---|
| 521 | end: my_end_token(M),
|
---|
| 522 | exported_definition: from_moz(M.declaration),
|
---|
| 523 | exported_names: M.specifiers && M.specifiers.length ? M.specifiers.map(function (specifier) {
|
---|
| 524 | return new AST_NameMapping({
|
---|
| 525 | foreign_name: from_moz(specifier.exported),
|
---|
| 526 | name: from_moz(specifier.local)
|
---|
| 527 | });
|
---|
| 528 | }) : null,
|
---|
| 529 | module_name: from_moz(M.source)
|
---|
| 530 | });
|
---|
| 531 | },
|
---|
| 532 | ExportDefaultDeclaration: function(M) {
|
---|
| 533 | return new AST_Export({
|
---|
| 534 | start: my_start_token(M),
|
---|
| 535 | end: my_end_token(M),
|
---|
| 536 | exported_value: from_moz(M.declaration),
|
---|
| 537 | is_default: true
|
---|
| 538 | });
|
---|
| 539 | },
|
---|
| 540 | Literal: function(M) {
|
---|
| 541 | var val = M.value, args = {
|
---|
| 542 | start : my_start_token(M),
|
---|
| 543 | end : my_end_token(M)
|
---|
| 544 | };
|
---|
| 545 | var rx = M.regex;
|
---|
| 546 | if (rx && rx.pattern) {
|
---|
| 547 | // RegExpLiteral as per ESTree AST spec
|
---|
| 548 | args.value = {
|
---|
| 549 | source: rx.pattern,
|
---|
| 550 | flags: rx.flags
|
---|
| 551 | };
|
---|
| 552 | return new AST_RegExp(args);
|
---|
| 553 | } else if (rx) {
|
---|
| 554 | // support legacy RegExp
|
---|
| 555 | const rx_source = M.raw || val;
|
---|
| 556 | const match = rx_source.match(/^\/(.*)\/(\w*)$/);
|
---|
| 557 | if (!match) throw new Error("Invalid regex source " + rx_source);
|
---|
| 558 | const [_, source, flags] = match;
|
---|
| 559 | args.value = { source, flags };
|
---|
| 560 | return new AST_RegExp(args);
|
---|
| 561 | }
|
---|
| 562 | if (val === null) return new AST_Null(args);
|
---|
| 563 | switch (typeof val) {
|
---|
| 564 | case "string":
|
---|
| 565 | args.value = val;
|
---|
| 566 | return new AST_String(args);
|
---|
| 567 | case "number":
|
---|
| 568 | args.value = val;
|
---|
| 569 | args.raw = M.raw || val.toString();
|
---|
| 570 | return new AST_Number(args);
|
---|
| 571 | case "boolean":
|
---|
| 572 | return new (val ? AST_True : AST_False)(args);
|
---|
| 573 | }
|
---|
| 574 | },
|
---|
| 575 | MetaProperty: function(M) {
|
---|
| 576 | if (M.meta.name === "new" && M.property.name === "target") {
|
---|
| 577 | return new AST_NewTarget({
|
---|
| 578 | start: my_start_token(M),
|
---|
| 579 | end: my_end_token(M)
|
---|
| 580 | });
|
---|
| 581 | } else if (M.meta.name === "import" && M.property.name === "meta") {
|
---|
| 582 | return new AST_ImportMeta({
|
---|
| 583 | start: my_start_token(M),
|
---|
| 584 | end: my_end_token(M)
|
---|
| 585 | });
|
---|
| 586 | }
|
---|
| 587 | },
|
---|
| 588 | Identifier: function(M) {
|
---|
| 589 | var p = FROM_MOZ_STACK[FROM_MOZ_STACK.length - 2];
|
---|
| 590 | return new ( p.type == "LabeledStatement" ? AST_Label
|
---|
| 591 | : p.type == "VariableDeclarator" && p.id === M ? (p.kind == "const" ? AST_SymbolConst : p.kind == "let" ? AST_SymbolLet : AST_SymbolVar)
|
---|
| 592 | : /Import.*Specifier/.test(p.type) ? (p.local === M ? AST_SymbolImport : AST_SymbolImportForeign)
|
---|
| 593 | : p.type == "ExportSpecifier" ? (p.local === M ? AST_SymbolExport : AST_SymbolExportForeign)
|
---|
| 594 | : p.type == "FunctionExpression" ? (p.id === M ? AST_SymbolLambda : AST_SymbolFunarg)
|
---|
| 595 | : p.type == "FunctionDeclaration" ? (p.id === M ? AST_SymbolDefun : AST_SymbolFunarg)
|
---|
| 596 | : p.type == "ArrowFunctionExpression" ? (p.params.includes(M)) ? AST_SymbolFunarg : AST_SymbolRef
|
---|
| 597 | : p.type == "ClassExpression" ? (p.id === M ? AST_SymbolClass : AST_SymbolRef)
|
---|
| 598 | : p.type == "Property" ? (p.key === M && p.computed || p.value === M ? AST_SymbolRef : AST_SymbolMethod)
|
---|
| 599 | : p.type == "PropertyDefinition" || p.type === "FieldDefinition" ? (p.key === M && p.computed || p.value === M ? AST_SymbolRef : AST_SymbolClassProperty)
|
---|
| 600 | : p.type == "ClassDeclaration" ? (p.id === M ? AST_SymbolDefClass : AST_SymbolRef)
|
---|
| 601 | : p.type == "MethodDefinition" ? (p.computed ? AST_SymbolRef : AST_SymbolMethod)
|
---|
| 602 | : p.type == "CatchClause" ? AST_SymbolCatch
|
---|
| 603 | : p.type == "BreakStatement" || p.type == "ContinueStatement" ? AST_LabelRef
|
---|
| 604 | : AST_SymbolRef)({
|
---|
| 605 | start : my_start_token(M),
|
---|
| 606 | end : my_end_token(M),
|
---|
| 607 | name : M.name
|
---|
| 608 | });
|
---|
| 609 | },
|
---|
| 610 | BigIntLiteral(M) {
|
---|
| 611 | return new AST_BigInt({
|
---|
| 612 | start : my_start_token(M),
|
---|
| 613 | end : my_end_token(M),
|
---|
| 614 | value : M.value
|
---|
| 615 | });
|
---|
| 616 | }
|
---|
| 617 | };
|
---|
| 618 |
|
---|
| 619 | MOZ_TO_ME.UpdateExpression =
|
---|
| 620 | MOZ_TO_ME.UnaryExpression = function To_Moz_Unary(M) {
|
---|
| 621 | var prefix = "prefix" in M ? M.prefix
|
---|
| 622 | : M.type == "UnaryExpression" ? true : false;
|
---|
| 623 | return new (prefix ? AST_UnaryPrefix : AST_UnaryPostfix)({
|
---|
| 624 | start : my_start_token(M),
|
---|
| 625 | end : my_end_token(M),
|
---|
| 626 | operator : M.operator,
|
---|
| 627 | expression : from_moz(M.argument)
|
---|
| 628 | });
|
---|
| 629 | };
|
---|
| 630 |
|
---|
| 631 | MOZ_TO_ME.ClassDeclaration =
|
---|
| 632 | MOZ_TO_ME.ClassExpression = function From_Moz_Class(M) {
|
---|
| 633 | return new (M.type === "ClassDeclaration" ? AST_DefClass : AST_ClassExpression)({
|
---|
| 634 | start : my_start_token(M),
|
---|
| 635 | end : my_end_token(M),
|
---|
| 636 | name : from_moz(M.id),
|
---|
| 637 | extends : from_moz(M.superClass),
|
---|
| 638 | properties: M.body.body.map(from_moz)
|
---|
| 639 | });
|
---|
| 640 | };
|
---|
| 641 |
|
---|
| 642 | map("EmptyStatement", AST_EmptyStatement);
|
---|
| 643 | map("BlockStatement", AST_BlockStatement, "body@body");
|
---|
| 644 | map("IfStatement", AST_If, "test>condition, consequent>body, alternate>alternative");
|
---|
| 645 | map("LabeledStatement", AST_LabeledStatement, "label>label, body>body");
|
---|
| 646 | map("BreakStatement", AST_Break, "label>label");
|
---|
| 647 | map("ContinueStatement", AST_Continue, "label>label");
|
---|
| 648 | map("WithStatement", AST_With, "object>expression, body>body");
|
---|
| 649 | map("SwitchStatement", AST_Switch, "discriminant>expression, cases@body");
|
---|
| 650 | map("ReturnStatement", AST_Return, "argument>value");
|
---|
| 651 | map("ThrowStatement", AST_Throw, "argument>value");
|
---|
| 652 | map("WhileStatement", AST_While, "test>condition, body>body");
|
---|
| 653 | map("DoWhileStatement", AST_Do, "test>condition, body>body");
|
---|
| 654 | map("ForStatement", AST_For, "init>init, test>condition, update>step, body>body");
|
---|
| 655 | map("ForInStatement", AST_ForIn, "left>init, right>object, body>body");
|
---|
| 656 | map("ForOfStatement", AST_ForOf, "left>init, right>object, body>body, await=await");
|
---|
| 657 | map("AwaitExpression", AST_Await, "argument>expression");
|
---|
| 658 | map("YieldExpression", AST_Yield, "argument>expression, delegate=is_star");
|
---|
| 659 | map("DebuggerStatement", AST_Debugger);
|
---|
| 660 | map("VariableDeclarator", AST_VarDef, "id>name, init>value");
|
---|
| 661 | map("CatchClause", AST_Catch, "param>argname, body%body");
|
---|
| 662 |
|
---|
| 663 | map("ThisExpression", AST_This);
|
---|
| 664 | map("Super", AST_Super);
|
---|
| 665 | map("BinaryExpression", AST_Binary, "operator=operator, left>left, right>right");
|
---|
| 666 | map("LogicalExpression", AST_Binary, "operator=operator, left>left, right>right");
|
---|
| 667 | map("AssignmentExpression", AST_Assign, "operator=operator, left>left, right>right");
|
---|
| 668 | map("ConditionalExpression", AST_Conditional, "test>condition, consequent>consequent, alternate>alternative");
|
---|
| 669 | map("NewExpression", AST_New, "callee>expression, arguments@args");
|
---|
| 670 | map("CallExpression", AST_Call, "callee>expression, optional=optional, arguments@args");
|
---|
| 671 |
|
---|
| 672 | def_to_moz(AST_Toplevel, function To_Moz_Program(M) {
|
---|
| 673 | return to_moz_scope("Program", M);
|
---|
| 674 | });
|
---|
| 675 |
|
---|
| 676 | def_to_moz(AST_Expansion, function To_Moz_Spread(M) {
|
---|
| 677 | return {
|
---|
| 678 | type: to_moz_in_destructuring() ? "RestElement" : "SpreadElement",
|
---|
| 679 | argument: to_moz(M.expression)
|
---|
| 680 | };
|
---|
| 681 | });
|
---|
| 682 |
|
---|
| 683 | def_to_moz(AST_PrefixedTemplateString, function To_Moz_TaggedTemplateExpression(M) {
|
---|
| 684 | return {
|
---|
| 685 | type: "TaggedTemplateExpression",
|
---|
| 686 | tag: to_moz(M.prefix),
|
---|
| 687 | quasi: to_moz(M.template_string)
|
---|
| 688 | };
|
---|
| 689 | });
|
---|
| 690 |
|
---|
| 691 | def_to_moz(AST_TemplateString, function To_Moz_TemplateLiteral(M) {
|
---|
| 692 | var quasis = [];
|
---|
| 693 | var expressions = [];
|
---|
| 694 | for (var i = 0; i < M.segments.length; i++) {
|
---|
| 695 | if (i % 2 !== 0) {
|
---|
| 696 | expressions.push(to_moz(M.segments[i]));
|
---|
| 697 | } else {
|
---|
| 698 | quasis.push({
|
---|
| 699 | type: "TemplateElement",
|
---|
| 700 | value: {
|
---|
| 701 | raw: M.segments[i].raw,
|
---|
| 702 | cooked: M.segments[i].value
|
---|
| 703 | },
|
---|
| 704 | tail: i === M.segments.length - 1
|
---|
| 705 | });
|
---|
| 706 | }
|
---|
| 707 | }
|
---|
| 708 | return {
|
---|
| 709 | type: "TemplateLiteral",
|
---|
| 710 | quasis: quasis,
|
---|
| 711 | expressions: expressions
|
---|
| 712 | };
|
---|
| 713 | });
|
---|
| 714 |
|
---|
| 715 | def_to_moz(AST_Defun, function To_Moz_FunctionDeclaration(M) {
|
---|
| 716 | return {
|
---|
| 717 | type: "FunctionDeclaration",
|
---|
| 718 | id: to_moz(M.name),
|
---|
| 719 | params: M.argnames.map(to_moz),
|
---|
| 720 | generator: M.is_generator,
|
---|
| 721 | async: M.async,
|
---|
| 722 | body: to_moz_scope("BlockStatement", M)
|
---|
| 723 | };
|
---|
| 724 | });
|
---|
| 725 |
|
---|
| 726 | def_to_moz(AST_Function, function To_Moz_FunctionExpression(M, parent) {
|
---|
| 727 | var is_generator = parent.is_generator !== undefined ?
|
---|
| 728 | parent.is_generator : M.is_generator;
|
---|
| 729 | return {
|
---|
| 730 | type: "FunctionExpression",
|
---|
| 731 | id: to_moz(M.name),
|
---|
| 732 | params: M.argnames.map(to_moz),
|
---|
| 733 | generator: is_generator,
|
---|
| 734 | async: M.async,
|
---|
| 735 | body: to_moz_scope("BlockStatement", M)
|
---|
| 736 | };
|
---|
| 737 | });
|
---|
| 738 |
|
---|
| 739 | def_to_moz(AST_Arrow, function To_Moz_ArrowFunctionExpression(M) {
|
---|
| 740 | var body = {
|
---|
| 741 | type: "BlockStatement",
|
---|
| 742 | body: M.body.map(to_moz)
|
---|
| 743 | };
|
---|
| 744 | return {
|
---|
| 745 | type: "ArrowFunctionExpression",
|
---|
| 746 | params: M.argnames.map(to_moz),
|
---|
| 747 | async: M.async,
|
---|
| 748 | body: body
|
---|
| 749 | };
|
---|
| 750 | });
|
---|
| 751 |
|
---|
| 752 | def_to_moz(AST_Destructuring, function To_Moz_ObjectPattern(M) {
|
---|
| 753 | if (M.is_array) {
|
---|
| 754 | return {
|
---|
| 755 | type: "ArrayPattern",
|
---|
| 756 | elements: M.names.map(to_moz)
|
---|
| 757 | };
|
---|
| 758 | }
|
---|
| 759 | return {
|
---|
| 760 | type: "ObjectPattern",
|
---|
| 761 | properties: M.names.map(to_moz)
|
---|
| 762 | };
|
---|
| 763 | });
|
---|
| 764 |
|
---|
| 765 | def_to_moz(AST_Directive, function To_Moz_Directive(M) {
|
---|
| 766 | return {
|
---|
| 767 | type: "ExpressionStatement",
|
---|
| 768 | expression: {
|
---|
| 769 | type: "Literal",
|
---|
| 770 | value: M.value,
|
---|
| 771 | raw: M.print_to_string()
|
---|
| 772 | },
|
---|
| 773 | directive: M.value
|
---|
| 774 | };
|
---|
| 775 | });
|
---|
| 776 |
|
---|
| 777 | def_to_moz(AST_SimpleStatement, function To_Moz_ExpressionStatement(M) {
|
---|
| 778 | return {
|
---|
| 779 | type: "ExpressionStatement",
|
---|
| 780 | expression: to_moz(M.body)
|
---|
| 781 | };
|
---|
| 782 | });
|
---|
| 783 |
|
---|
| 784 | def_to_moz(AST_SwitchBranch, function To_Moz_SwitchCase(M) {
|
---|
| 785 | return {
|
---|
| 786 | type: "SwitchCase",
|
---|
| 787 | test: to_moz(M.expression),
|
---|
| 788 | consequent: M.body.map(to_moz)
|
---|
| 789 | };
|
---|
| 790 | });
|
---|
| 791 |
|
---|
| 792 | def_to_moz(AST_Try, function To_Moz_TryStatement(M) {
|
---|
| 793 | return {
|
---|
| 794 | type: "TryStatement",
|
---|
| 795 | block: to_moz_block(M),
|
---|
| 796 | handler: to_moz(M.bcatch),
|
---|
| 797 | guardedHandlers: [],
|
---|
| 798 | finalizer: to_moz(M.bfinally)
|
---|
| 799 | };
|
---|
| 800 | });
|
---|
| 801 |
|
---|
| 802 | def_to_moz(AST_Catch, function To_Moz_CatchClause(M) {
|
---|
| 803 | return {
|
---|
| 804 | type: "CatchClause",
|
---|
| 805 | param: to_moz(M.argname),
|
---|
| 806 | guard: null,
|
---|
| 807 | body: to_moz_block(M)
|
---|
| 808 | };
|
---|
| 809 | });
|
---|
| 810 |
|
---|
| 811 | def_to_moz(AST_Definitions, function To_Moz_VariableDeclaration(M) {
|
---|
| 812 | return {
|
---|
| 813 | type: "VariableDeclaration",
|
---|
| 814 | kind:
|
---|
| 815 | M instanceof AST_Const ? "const" :
|
---|
| 816 | M instanceof AST_Let ? "let" : "var",
|
---|
| 817 | declarations: M.definitions.map(to_moz)
|
---|
| 818 | };
|
---|
| 819 | });
|
---|
| 820 |
|
---|
| 821 | def_to_moz(AST_Export, function To_Moz_ExportDeclaration(M) {
|
---|
| 822 | if (M.exported_names) {
|
---|
| 823 | if (M.exported_names[0].name.name === "*") {
|
---|
| 824 | return {
|
---|
| 825 | type: "ExportAllDeclaration",
|
---|
| 826 | source: to_moz(M.module_name)
|
---|
| 827 | };
|
---|
| 828 | }
|
---|
| 829 | return {
|
---|
| 830 | type: "ExportNamedDeclaration",
|
---|
| 831 | specifiers: M.exported_names.map(function (name_mapping) {
|
---|
| 832 | return {
|
---|
| 833 | type: "ExportSpecifier",
|
---|
| 834 | exported: to_moz(name_mapping.foreign_name),
|
---|
| 835 | local: to_moz(name_mapping.name)
|
---|
| 836 | };
|
---|
| 837 | }),
|
---|
| 838 | declaration: to_moz(M.exported_definition),
|
---|
| 839 | source: to_moz(M.module_name)
|
---|
| 840 | };
|
---|
| 841 | }
|
---|
| 842 | return {
|
---|
| 843 | type: M.is_default ? "ExportDefaultDeclaration" : "ExportNamedDeclaration",
|
---|
| 844 | declaration: to_moz(M.exported_value || M.exported_definition)
|
---|
| 845 | };
|
---|
| 846 | });
|
---|
| 847 |
|
---|
| 848 | def_to_moz(AST_Import, function To_Moz_ImportDeclaration(M) {
|
---|
| 849 | var specifiers = [];
|
---|
| 850 | if (M.imported_name) {
|
---|
| 851 | specifiers.push({
|
---|
| 852 | type: "ImportDefaultSpecifier",
|
---|
| 853 | local: to_moz(M.imported_name)
|
---|
| 854 | });
|
---|
| 855 | }
|
---|
| 856 | if (M.imported_names && M.imported_names[0].foreign_name.name === "*") {
|
---|
| 857 | specifiers.push({
|
---|
| 858 | type: "ImportNamespaceSpecifier",
|
---|
| 859 | local: to_moz(M.imported_names[0].name)
|
---|
| 860 | });
|
---|
| 861 | } else if (M.imported_names) {
|
---|
| 862 | M.imported_names.forEach(function(name_mapping) {
|
---|
| 863 | specifiers.push({
|
---|
| 864 | type: "ImportSpecifier",
|
---|
| 865 | local: to_moz(name_mapping.name),
|
---|
| 866 | imported: to_moz(name_mapping.foreign_name)
|
---|
| 867 | });
|
---|
| 868 | });
|
---|
| 869 | }
|
---|
| 870 | return {
|
---|
| 871 | type: "ImportDeclaration",
|
---|
| 872 | specifiers: specifiers,
|
---|
| 873 | source: to_moz(M.module_name)
|
---|
| 874 | };
|
---|
| 875 | });
|
---|
| 876 |
|
---|
| 877 | def_to_moz(AST_ImportMeta, function To_Moz_MetaProperty() {
|
---|
| 878 | return {
|
---|
| 879 | type: "MetaProperty",
|
---|
| 880 | meta: {
|
---|
| 881 | type: "Identifier",
|
---|
| 882 | name: "import"
|
---|
| 883 | },
|
---|
| 884 | property: {
|
---|
| 885 | type: "Identifier",
|
---|
| 886 | name: "meta"
|
---|
| 887 | }
|
---|
| 888 | };
|
---|
| 889 | });
|
---|
| 890 |
|
---|
| 891 | def_to_moz(AST_Sequence, function To_Moz_SequenceExpression(M) {
|
---|
| 892 | return {
|
---|
| 893 | type: "SequenceExpression",
|
---|
| 894 | expressions: M.expressions.map(to_moz)
|
---|
| 895 | };
|
---|
| 896 | });
|
---|
| 897 |
|
---|
| 898 | def_to_moz(AST_DotHash, function To_Moz_PrivateMemberExpression(M) {
|
---|
| 899 | return {
|
---|
| 900 | type: "MemberExpression",
|
---|
| 901 | object: to_moz(M.expression),
|
---|
| 902 | computed: false,
|
---|
| 903 | property: {
|
---|
| 904 | type: "PrivateIdentifier",
|
---|
| 905 | name: M.property
|
---|
| 906 | },
|
---|
| 907 | optional: M.optional
|
---|
| 908 | };
|
---|
| 909 | });
|
---|
| 910 |
|
---|
| 911 | def_to_moz(AST_PropAccess, function To_Moz_MemberExpression(M) {
|
---|
| 912 | var isComputed = M instanceof AST_Sub;
|
---|
| 913 | return {
|
---|
| 914 | type: "MemberExpression",
|
---|
| 915 | object: to_moz(M.expression),
|
---|
| 916 | computed: isComputed,
|
---|
| 917 | property: isComputed ? to_moz(M.property) : {type: "Identifier", name: M.property},
|
---|
| 918 | optional: M.optional
|
---|
| 919 | };
|
---|
| 920 | });
|
---|
| 921 |
|
---|
| 922 | def_to_moz(AST_Chain, function To_Moz_ChainExpression(M) {
|
---|
| 923 | return {
|
---|
| 924 | type: "ChainExpression",
|
---|
| 925 | expression: to_moz(M.expression)
|
---|
| 926 | };
|
---|
| 927 | });
|
---|
| 928 |
|
---|
| 929 | def_to_moz(AST_Unary, function To_Moz_Unary(M) {
|
---|
| 930 | return {
|
---|
| 931 | type: M.operator == "++" || M.operator == "--" ? "UpdateExpression" : "UnaryExpression",
|
---|
| 932 | operator: M.operator,
|
---|
| 933 | prefix: M instanceof AST_UnaryPrefix,
|
---|
| 934 | argument: to_moz(M.expression)
|
---|
| 935 | };
|
---|
| 936 | });
|
---|
| 937 |
|
---|
| 938 | def_to_moz(AST_Binary, function To_Moz_BinaryExpression(M) {
|
---|
| 939 | if (M.operator == "=" && to_moz_in_destructuring()) {
|
---|
| 940 | return {
|
---|
| 941 | type: "AssignmentPattern",
|
---|
| 942 | left: to_moz(M.left),
|
---|
| 943 | right: to_moz(M.right)
|
---|
| 944 | };
|
---|
| 945 | }
|
---|
| 946 |
|
---|
| 947 | const type = M.operator == "&&" || M.operator == "||" || M.operator === "??"
|
---|
| 948 | ? "LogicalExpression"
|
---|
| 949 | : "BinaryExpression";
|
---|
| 950 |
|
---|
| 951 | return {
|
---|
| 952 | type,
|
---|
| 953 | left: to_moz(M.left),
|
---|
| 954 | operator: M.operator,
|
---|
| 955 | right: to_moz(M.right)
|
---|
| 956 | };
|
---|
| 957 | });
|
---|
| 958 |
|
---|
| 959 | def_to_moz(AST_Array, function To_Moz_ArrayExpression(M) {
|
---|
| 960 | return {
|
---|
| 961 | type: "ArrayExpression",
|
---|
| 962 | elements: M.elements.map(to_moz)
|
---|
| 963 | };
|
---|
| 964 | });
|
---|
| 965 |
|
---|
| 966 | def_to_moz(AST_Object, function To_Moz_ObjectExpression(M) {
|
---|
| 967 | return {
|
---|
| 968 | type: "ObjectExpression",
|
---|
| 969 | properties: M.properties.map(to_moz)
|
---|
| 970 | };
|
---|
| 971 | });
|
---|
| 972 |
|
---|
| 973 | def_to_moz(AST_ObjectProperty, function To_Moz_Property(M, parent) {
|
---|
| 974 | var key = M.key instanceof AST_Node ? to_moz(M.key) : {
|
---|
| 975 | type: "Identifier",
|
---|
| 976 | value: M.key
|
---|
| 977 | };
|
---|
| 978 | if (typeof M.key === "number") {
|
---|
| 979 | key = {
|
---|
| 980 | type: "Literal",
|
---|
| 981 | value: Number(M.key)
|
---|
| 982 | };
|
---|
| 983 | }
|
---|
| 984 | if (typeof M.key === "string") {
|
---|
| 985 | key = {
|
---|
| 986 | type: "Identifier",
|
---|
| 987 | name: M.key
|
---|
| 988 | };
|
---|
| 989 | }
|
---|
| 990 | var kind;
|
---|
| 991 | var string_or_num = typeof M.key === "string" || typeof M.key === "number";
|
---|
| 992 | var computed = string_or_num ? false : !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef;
|
---|
| 993 | if (M instanceof AST_ObjectKeyVal) {
|
---|
| 994 | kind = "init";
|
---|
| 995 | computed = !string_or_num;
|
---|
| 996 | } else
|
---|
| 997 | if (M instanceof AST_ObjectGetter) {
|
---|
| 998 | kind = "get";
|
---|
| 999 | } else
|
---|
| 1000 | if (M instanceof AST_ObjectSetter) {
|
---|
| 1001 | kind = "set";
|
---|
| 1002 | }
|
---|
| 1003 | if (M instanceof AST_PrivateGetter || M instanceof AST_PrivateSetter) {
|
---|
| 1004 | const kind = M instanceof AST_PrivateGetter ? "get" : "set";
|
---|
| 1005 | return {
|
---|
| 1006 | type: "MethodDefinition",
|
---|
| 1007 | computed: false,
|
---|
| 1008 | kind: kind,
|
---|
| 1009 | static: M.static,
|
---|
| 1010 | key: {
|
---|
| 1011 | type: "PrivateIdentifier",
|
---|
| 1012 | name: M.key.name
|
---|
| 1013 | },
|
---|
| 1014 | value: to_moz(M.value)
|
---|
| 1015 | };
|
---|
| 1016 | }
|
---|
| 1017 | if (M instanceof AST_ClassPrivateProperty) {
|
---|
| 1018 | return {
|
---|
| 1019 | type: "PropertyDefinition",
|
---|
| 1020 | key: {
|
---|
| 1021 | type: "PrivateIdentifier",
|
---|
| 1022 | name: M.key.name
|
---|
| 1023 | },
|
---|
| 1024 | value: to_moz(M.value),
|
---|
| 1025 | computed: false,
|
---|
| 1026 | static: M.static
|
---|
| 1027 | };
|
---|
| 1028 | }
|
---|
| 1029 | if (M instanceof AST_ClassProperty) {
|
---|
| 1030 | return {
|
---|
| 1031 | type: "PropertyDefinition",
|
---|
| 1032 | key,
|
---|
| 1033 | value: to_moz(M.value),
|
---|
| 1034 | computed,
|
---|
| 1035 | static: M.static
|
---|
| 1036 | };
|
---|
| 1037 | }
|
---|
| 1038 | if (parent instanceof AST_Class) {
|
---|
| 1039 | return {
|
---|
| 1040 | type: "MethodDefinition",
|
---|
| 1041 | computed: computed,
|
---|
| 1042 | kind: kind,
|
---|
| 1043 | static: M.static,
|
---|
| 1044 | key: to_moz(M.key),
|
---|
| 1045 | value: to_moz(M.value)
|
---|
| 1046 | };
|
---|
| 1047 | }
|
---|
| 1048 | return {
|
---|
| 1049 | type: "Property",
|
---|
| 1050 | computed: computed,
|
---|
| 1051 | kind: kind,
|
---|
| 1052 | key: key,
|
---|
| 1053 | value: to_moz(M.value)
|
---|
| 1054 | };
|
---|
| 1055 | });
|
---|
| 1056 |
|
---|
| 1057 | def_to_moz(AST_ConciseMethod, function To_Moz_MethodDefinition(M, parent) {
|
---|
| 1058 | if (parent instanceof AST_Object) {
|
---|
| 1059 | return {
|
---|
| 1060 | type: "Property",
|
---|
| 1061 | computed: !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef,
|
---|
| 1062 | kind: "init",
|
---|
| 1063 | method: true,
|
---|
| 1064 | shorthand: false,
|
---|
| 1065 | key: to_moz(M.key),
|
---|
| 1066 | value: to_moz(M.value)
|
---|
| 1067 | };
|
---|
| 1068 | }
|
---|
| 1069 |
|
---|
| 1070 | const key = M instanceof AST_PrivateMethod
|
---|
| 1071 | ? {
|
---|
| 1072 | type: "PrivateIdentifier",
|
---|
| 1073 | name: M.key.name
|
---|
| 1074 | }
|
---|
| 1075 | : to_moz(M.key);
|
---|
| 1076 |
|
---|
| 1077 | return {
|
---|
| 1078 | type: "MethodDefinition",
|
---|
| 1079 | kind: M.key === "constructor" ? "constructor" : "method",
|
---|
| 1080 | key,
|
---|
| 1081 | value: to_moz(M.value),
|
---|
| 1082 | computed: !(M.key instanceof AST_Symbol) || M.key instanceof AST_SymbolRef,
|
---|
| 1083 | static: M.static,
|
---|
| 1084 | };
|
---|
| 1085 | });
|
---|
| 1086 |
|
---|
| 1087 | def_to_moz(AST_Class, function To_Moz_Class(M) {
|
---|
| 1088 | var type = M instanceof AST_ClassExpression ? "ClassExpression" : "ClassDeclaration";
|
---|
| 1089 | return {
|
---|
| 1090 | type: type,
|
---|
| 1091 | superClass: to_moz(M.extends),
|
---|
| 1092 | id: M.name ? to_moz(M.name) : null,
|
---|
| 1093 | body: {
|
---|
| 1094 | type: "ClassBody",
|
---|
| 1095 | body: M.properties.map(to_moz)
|
---|
| 1096 | }
|
---|
| 1097 | };
|
---|
| 1098 | });
|
---|
| 1099 |
|
---|
| 1100 | def_to_moz(AST_NewTarget, function To_Moz_MetaProperty() {
|
---|
| 1101 | return {
|
---|
| 1102 | type: "MetaProperty",
|
---|
| 1103 | meta: {
|
---|
| 1104 | type: "Identifier",
|
---|
| 1105 | name: "new"
|
---|
| 1106 | },
|
---|
| 1107 | property: {
|
---|
| 1108 | type: "Identifier",
|
---|
| 1109 | name: "target"
|
---|
| 1110 | }
|
---|
| 1111 | };
|
---|
| 1112 | });
|
---|
| 1113 |
|
---|
| 1114 | def_to_moz(AST_Symbol, function To_Moz_Identifier(M, parent) {
|
---|
| 1115 | if (M instanceof AST_SymbolMethod && parent.quote) {
|
---|
| 1116 | return {
|
---|
| 1117 | type: "Literal",
|
---|
| 1118 | value: M.name
|
---|
| 1119 | };
|
---|
| 1120 | }
|
---|
| 1121 | var def = M.definition();
|
---|
| 1122 | return {
|
---|
| 1123 | type: "Identifier",
|
---|
| 1124 | name: def ? def.mangled_name || def.name : M.name
|
---|
| 1125 | };
|
---|
| 1126 | });
|
---|
| 1127 |
|
---|
| 1128 | def_to_moz(AST_RegExp, function To_Moz_RegExpLiteral(M) {
|
---|
| 1129 | const pattern = M.value.source;
|
---|
| 1130 | const flags = M.value.flags;
|
---|
| 1131 | return {
|
---|
| 1132 | type: "Literal",
|
---|
| 1133 | value: null,
|
---|
| 1134 | raw: M.print_to_string(),
|
---|
| 1135 | regex: { pattern, flags }
|
---|
| 1136 | };
|
---|
| 1137 | });
|
---|
| 1138 |
|
---|
| 1139 | def_to_moz(AST_Constant, function To_Moz_Literal(M) {
|
---|
| 1140 | var value = M.value;
|
---|
| 1141 | return {
|
---|
| 1142 | type: "Literal",
|
---|
| 1143 | value: value,
|
---|
| 1144 | raw: M.raw || M.print_to_string()
|
---|
| 1145 | };
|
---|
| 1146 | });
|
---|
| 1147 |
|
---|
| 1148 | def_to_moz(AST_Atom, function To_Moz_Atom(M) {
|
---|
| 1149 | return {
|
---|
| 1150 | type: "Identifier",
|
---|
| 1151 | name: String(M.value)
|
---|
| 1152 | };
|
---|
| 1153 | });
|
---|
| 1154 |
|
---|
| 1155 | def_to_moz(AST_BigInt, M => ({
|
---|
| 1156 | type: "BigIntLiteral",
|
---|
| 1157 | value: M.value
|
---|
| 1158 | }));
|
---|
| 1159 |
|
---|
| 1160 | AST_Boolean.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
---|
| 1161 | AST_Null.DEFMETHOD("to_mozilla_ast", AST_Constant.prototype.to_mozilla_ast);
|
---|
| 1162 | AST_Hole.DEFMETHOD("to_mozilla_ast", function To_Moz_ArrayHole() { return null; });
|
---|
| 1163 |
|
---|
| 1164 | AST_Block.DEFMETHOD("to_mozilla_ast", AST_BlockStatement.prototype.to_mozilla_ast);
|
---|
| 1165 | AST_Lambda.DEFMETHOD("to_mozilla_ast", AST_Function.prototype.to_mozilla_ast);
|
---|
| 1166 |
|
---|
| 1167 | /* -----[ tools ]----- */
|
---|
| 1168 |
|
---|
| 1169 | function my_start_token(moznode) {
|
---|
| 1170 | var loc = moznode.loc, start = loc && loc.start;
|
---|
| 1171 | var range = moznode.range;
|
---|
| 1172 | return new AST_Token(
|
---|
| 1173 | "",
|
---|
| 1174 | "",
|
---|
| 1175 | start && start.line || 0,
|
---|
| 1176 | start && start.column || 0,
|
---|
| 1177 | range ? range [0] : moznode.start,
|
---|
| 1178 | false,
|
---|
| 1179 | [],
|
---|
| 1180 | [],
|
---|
| 1181 | loc && loc.source,
|
---|
| 1182 | );
|
---|
| 1183 | }
|
---|
| 1184 |
|
---|
| 1185 | function my_end_token(moznode) {
|
---|
| 1186 | var loc = moznode.loc, end = loc && loc.end;
|
---|
| 1187 | var range = moznode.range;
|
---|
| 1188 | return new AST_Token(
|
---|
| 1189 | "",
|
---|
| 1190 | "",
|
---|
| 1191 | end && end.line || 0,
|
---|
| 1192 | end && end.column || 0,
|
---|
| 1193 | range ? range [0] : moznode.end,
|
---|
| 1194 | false,
|
---|
| 1195 | [],
|
---|
| 1196 | [],
|
---|
| 1197 | loc && loc.source,
|
---|
| 1198 | );
|
---|
| 1199 | }
|
---|
| 1200 |
|
---|
| 1201 | function map(moztype, mytype, propmap) {
|
---|
| 1202 | var moz_to_me = "function From_Moz_" + moztype + "(M){\n";
|
---|
| 1203 | moz_to_me += "return new U2." + mytype.name + "({\n" +
|
---|
| 1204 | "start: my_start_token(M),\n" +
|
---|
| 1205 | "end: my_end_token(M)";
|
---|
| 1206 |
|
---|
| 1207 | var me_to_moz = "function To_Moz_" + moztype + "(M){\n";
|
---|
| 1208 | me_to_moz += "return {\n" +
|
---|
| 1209 | "type: " + JSON.stringify(moztype);
|
---|
| 1210 |
|
---|
| 1211 | if (propmap) propmap.split(/\s*,\s*/).forEach(function(prop) {
|
---|
| 1212 | var m = /([a-z0-9$_]+)([=@>%])([a-z0-9$_]+)/i.exec(prop);
|
---|
| 1213 | if (!m) throw new Error("Can't understand property map: " + prop);
|
---|
| 1214 | var moz = m[1], how = m[2], my = m[3];
|
---|
| 1215 | moz_to_me += ",\n" + my + ": ";
|
---|
| 1216 | me_to_moz += ",\n" + moz + ": ";
|
---|
| 1217 | switch (how) {
|
---|
| 1218 | case "@":
|
---|
| 1219 | moz_to_me += "M." + moz + ".map(from_moz)";
|
---|
| 1220 | me_to_moz += "M." + my + ".map(to_moz)";
|
---|
| 1221 | break;
|
---|
| 1222 | case ">":
|
---|
| 1223 | moz_to_me += "from_moz(M." + moz + ")";
|
---|
| 1224 | me_to_moz += "to_moz(M." + my + ")";
|
---|
| 1225 | break;
|
---|
| 1226 | case "=":
|
---|
| 1227 | moz_to_me += "M." + moz;
|
---|
| 1228 | me_to_moz += "M." + my;
|
---|
| 1229 | break;
|
---|
| 1230 | case "%":
|
---|
| 1231 | moz_to_me += "from_moz(M." + moz + ").body";
|
---|
| 1232 | me_to_moz += "to_moz_block(M)";
|
---|
| 1233 | break;
|
---|
| 1234 | default:
|
---|
| 1235 | throw new Error("Can't understand operator in propmap: " + prop);
|
---|
| 1236 | }
|
---|
| 1237 | });
|
---|
| 1238 |
|
---|
| 1239 | moz_to_me += "\n})\n}";
|
---|
| 1240 | me_to_moz += "\n}\n}";
|
---|
| 1241 |
|
---|
| 1242 | moz_to_me = new Function("U2", "my_start_token", "my_end_token", "from_moz", "return(" + moz_to_me + ")")(
|
---|
| 1243 | ast, my_start_token, my_end_token, from_moz
|
---|
| 1244 | );
|
---|
| 1245 | me_to_moz = new Function("to_moz", "to_moz_block", "to_moz_scope", "return(" + me_to_moz + ")")(
|
---|
| 1246 | to_moz, to_moz_block, to_moz_scope
|
---|
| 1247 | );
|
---|
| 1248 | MOZ_TO_ME[moztype] = moz_to_me;
|
---|
| 1249 | def_to_moz(mytype, me_to_moz);
|
---|
| 1250 | }
|
---|
| 1251 |
|
---|
| 1252 | var FROM_MOZ_STACK = null;
|
---|
| 1253 |
|
---|
| 1254 | function from_moz(node) {
|
---|
| 1255 | FROM_MOZ_STACK.push(node);
|
---|
| 1256 | var ret = node != null ? MOZ_TO_ME[node.type](node) : null;
|
---|
| 1257 | FROM_MOZ_STACK.pop();
|
---|
| 1258 | return ret;
|
---|
| 1259 | }
|
---|
| 1260 |
|
---|
| 1261 | AST_Node.from_mozilla_ast = function(node) {
|
---|
| 1262 | var save_stack = FROM_MOZ_STACK;
|
---|
| 1263 | FROM_MOZ_STACK = [];
|
---|
| 1264 | var ast = from_moz(node);
|
---|
| 1265 | FROM_MOZ_STACK = save_stack;
|
---|
| 1266 | return ast;
|
---|
| 1267 | };
|
---|
| 1268 |
|
---|
| 1269 | function set_moz_loc(mynode, moznode) {
|
---|
| 1270 | var start = mynode.start;
|
---|
| 1271 | var end = mynode.end;
|
---|
| 1272 | if (!(start && end)) {
|
---|
| 1273 | return moznode;
|
---|
| 1274 | }
|
---|
| 1275 | if (start.pos != null && end.endpos != null) {
|
---|
| 1276 | moznode.range = [start.pos, end.endpos];
|
---|
| 1277 | }
|
---|
| 1278 | if (start.line) {
|
---|
| 1279 | moznode.loc = {
|
---|
| 1280 | start: {line: start.line, column: start.col},
|
---|
| 1281 | end: end.endline ? {line: end.endline, column: end.endcol} : null
|
---|
| 1282 | };
|
---|
| 1283 | if (start.file) {
|
---|
| 1284 | moznode.loc.source = start.file;
|
---|
| 1285 | }
|
---|
| 1286 | }
|
---|
| 1287 | return moznode;
|
---|
| 1288 | }
|
---|
| 1289 |
|
---|
| 1290 | function def_to_moz(mytype, handler) {
|
---|
| 1291 | mytype.DEFMETHOD("to_mozilla_ast", function(parent) {
|
---|
| 1292 | return set_moz_loc(this, handler(this, parent));
|
---|
| 1293 | });
|
---|
| 1294 | }
|
---|
| 1295 |
|
---|
| 1296 | var TO_MOZ_STACK = null;
|
---|
| 1297 |
|
---|
| 1298 | function to_moz(node) {
|
---|
| 1299 | if (TO_MOZ_STACK === null) { TO_MOZ_STACK = []; }
|
---|
| 1300 | TO_MOZ_STACK.push(node);
|
---|
| 1301 | var ast = node != null ? node.to_mozilla_ast(TO_MOZ_STACK[TO_MOZ_STACK.length - 2]) : null;
|
---|
| 1302 | TO_MOZ_STACK.pop();
|
---|
| 1303 | if (TO_MOZ_STACK.length === 0) { TO_MOZ_STACK = null; }
|
---|
| 1304 | return ast;
|
---|
| 1305 | }
|
---|
| 1306 |
|
---|
| 1307 | function to_moz_in_destructuring() {
|
---|
| 1308 | var i = TO_MOZ_STACK.length;
|
---|
| 1309 | while (i--) {
|
---|
| 1310 | if (TO_MOZ_STACK[i] instanceof AST_Destructuring) {
|
---|
| 1311 | return true;
|
---|
| 1312 | }
|
---|
| 1313 | }
|
---|
| 1314 | return false;
|
---|
| 1315 | }
|
---|
| 1316 |
|
---|
| 1317 | function to_moz_block(node) {
|
---|
| 1318 | return {
|
---|
| 1319 | type: "BlockStatement",
|
---|
| 1320 | body: node.body.map(to_moz)
|
---|
| 1321 | };
|
---|
| 1322 | }
|
---|
| 1323 |
|
---|
| 1324 | function to_moz_scope(type, node) {
|
---|
| 1325 | var body = node.body.map(to_moz);
|
---|
| 1326 | if (node.body[0] instanceof AST_SimpleStatement && node.body[0].body instanceof AST_String) {
|
---|
| 1327 | body.unshift(to_moz(new AST_EmptyStatement(node.body[0])));
|
---|
| 1328 | }
|
---|
| 1329 | return {
|
---|
| 1330 | type: type,
|
---|
| 1331 | body: body
|
---|
| 1332 | };
|
---|
| 1333 | }
|
---|
| 1334 | })();
|
---|