esprima.js (283567B)
1 (function webpackUniversalModuleDefinition(root, factory) { 2 /* istanbul ignore next */ 3 if(typeof exports === 'object' && typeof module === 'object') 4 module.exports = factory(); 5 else if(typeof define === 'function' && define.amd) 6 define([], factory); 7 /* istanbul ignore next */ 8 else if(typeof exports === 'object') 9 exports["esprima"] = factory(); 10 else 11 root["esprima"] = factory(); 12 })(this, function() { 13 return /******/ (function(modules) { // webpackBootstrap 14 /******/ // The module cache 15 /******/ var installedModules = {}; 16 17 /******/ // The require function 18 /******/ function __webpack_require__(moduleId) { 19 20 /******/ // Check if module is in cache 21 /* istanbul ignore if */ 22 /******/ if(installedModules[moduleId]) 23 /******/ return installedModules[moduleId].exports; 24 25 /******/ // Create a new module (and put it into the cache) 26 /******/ var module = installedModules[moduleId] = { 27 /******/ exports: {}, 28 /******/ id: moduleId, 29 /******/ loaded: false 30 /******/ }; 31 32 /******/ // Execute the module function 33 /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); 34 35 /******/ // Flag the module as loaded 36 /******/ module.loaded = true; 37 38 /******/ // Return the exports of the module 39 /******/ return module.exports; 40 /******/ } 41 42 43 /******/ // expose the modules object (__webpack_modules__) 44 /******/ __webpack_require__.m = modules; 45 46 /******/ // expose the module cache 47 /******/ __webpack_require__.c = installedModules; 48 49 /******/ // __webpack_public_path__ 50 /******/ __webpack_require__.p = ""; 51 52 /******/ // Load entry module and return exports 53 /******/ return __webpack_require__(0); 54 /******/ }) 55 /************************************************************************/ 56 /******/ ([ 57 /* 0 */ 58 /***/ function(module, exports, __webpack_require__) { 59 60 "use strict"; 61 /* 62 Copyright JS Foundation and other contributors, https://js.foundation/ 63 64 Redistribution and use in source and binary forms, with or without 65 modification, are permitted provided that the following conditions are met: 66 67 * Redistributions of source code must retain the above copyright 68 notice, this list of conditions and the following disclaimer. 69 * Redistributions in binary form must reproduce the above copyright 70 notice, this list of conditions and the following disclaimer in the 71 documentation and/or other materials provided with the distribution. 72 73 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 74 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 75 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 76 ARE DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY 77 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 78 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 79 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 80 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 81 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 82 THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 83 */ 84 Object.defineProperty(exports, "__esModule", { value: true }); 85 var comment_handler_1 = __webpack_require__(1); 86 var jsx_parser_1 = __webpack_require__(3); 87 var parser_1 = __webpack_require__(8); 88 var tokenizer_1 = __webpack_require__(15); 89 function parse(code, options, delegate) { 90 var commentHandler = null; 91 var proxyDelegate = function (node, metadata) { 92 if (delegate) { 93 delegate(node, metadata); 94 } 95 if (commentHandler) { 96 commentHandler.visit(node, metadata); 97 } 98 }; 99 var parserDelegate = (typeof delegate === 'function') ? proxyDelegate : null; 100 var collectComment = false; 101 if (options) { 102 collectComment = (typeof options.comment === 'boolean' && options.comment); 103 var attachComment = (typeof options.attachComment === 'boolean' && options.attachComment); 104 if (collectComment || attachComment) { 105 commentHandler = new comment_handler_1.CommentHandler(); 106 commentHandler.attach = attachComment; 107 options.comment = true; 108 parserDelegate = proxyDelegate; 109 } 110 } 111 var isModule = false; 112 if (options && typeof options.sourceType === 'string') { 113 isModule = (options.sourceType === 'module'); 114 } 115 var parser; 116 if (options && typeof options.jsx === 'boolean' && options.jsx) { 117 parser = new jsx_parser_1.JSXParser(code, options, parserDelegate); 118 } 119 else { 120 parser = new parser_1.Parser(code, options, parserDelegate); 121 } 122 var program = isModule ? parser.parseModule() : parser.parseScript(); 123 var ast = program; 124 if (collectComment && commentHandler) { 125 ast.comments = commentHandler.comments; 126 } 127 if (parser.config.tokens) { 128 ast.tokens = parser.tokens; 129 } 130 if (parser.config.tolerant) { 131 ast.errors = parser.errorHandler.errors; 132 } 133 return ast; 134 } 135 exports.parse = parse; 136 function parseModule(code, options, delegate) { 137 var parsingOptions = options || {}; 138 parsingOptions.sourceType = 'module'; 139 return parse(code, parsingOptions, delegate); 140 } 141 exports.parseModule = parseModule; 142 function parseScript(code, options, delegate) { 143 var parsingOptions = options || {}; 144 parsingOptions.sourceType = 'script'; 145 return parse(code, parsingOptions, delegate); 146 } 147 exports.parseScript = parseScript; 148 function tokenize(code, options, delegate) { 149 var tokenizer = new tokenizer_1.Tokenizer(code, options); 150 var tokens; 151 tokens = []; 152 try { 153 while (true) { 154 var token = tokenizer.getNextToken(); 155 if (!token) { 156 break; 157 } 158 if (delegate) { 159 token = delegate(token); 160 } 161 tokens.push(token); 162 } 163 } 164 catch (e) { 165 tokenizer.errorHandler.tolerate(e); 166 } 167 if (tokenizer.errorHandler.tolerant) { 168 tokens.errors = tokenizer.errors(); 169 } 170 return tokens; 171 } 172 exports.tokenize = tokenize; 173 var syntax_1 = __webpack_require__(2); 174 exports.Syntax = syntax_1.Syntax; 175 // Sync with *.json manifests. 176 exports.version = '4.0.1'; 177 178 179 /***/ }, 180 /* 1 */ 181 /***/ function(module, exports, __webpack_require__) { 182 183 "use strict"; 184 Object.defineProperty(exports, "__esModule", { value: true }); 185 var syntax_1 = __webpack_require__(2); 186 var CommentHandler = (function () { 187 function CommentHandler() { 188 this.attach = false; 189 this.comments = []; 190 this.stack = []; 191 this.leading = []; 192 this.trailing = []; 193 } 194 CommentHandler.prototype.insertInnerComments = function (node, metadata) { 195 // innnerComments for properties empty block 196 // `function a() {/** comments **\/}` 197 if (node.type === syntax_1.Syntax.BlockStatement && node.body.length === 0) { 198 var innerComments = []; 199 for (var i = this.leading.length - 1; i >= 0; --i) { 200 var entry = this.leading[i]; 201 if (metadata.end.offset >= entry.start) { 202 innerComments.unshift(entry.comment); 203 this.leading.splice(i, 1); 204 this.trailing.splice(i, 1); 205 } 206 } 207 if (innerComments.length) { 208 node.innerComments = innerComments; 209 } 210 } 211 }; 212 CommentHandler.prototype.findTrailingComments = function (metadata) { 213 var trailingComments = []; 214 if (this.trailing.length > 0) { 215 for (var i = this.trailing.length - 1; i >= 0; --i) { 216 var entry_1 = this.trailing[i]; 217 if (entry_1.start >= metadata.end.offset) { 218 trailingComments.unshift(entry_1.comment); 219 } 220 } 221 this.trailing.length = 0; 222 return trailingComments; 223 } 224 var entry = this.stack[this.stack.length - 1]; 225 if (entry && entry.node.trailingComments) { 226 var firstComment = entry.node.trailingComments[0]; 227 if (firstComment && firstComment.range[0] >= metadata.end.offset) { 228 trailingComments = entry.node.trailingComments; 229 delete entry.node.trailingComments; 230 } 231 } 232 return trailingComments; 233 }; 234 CommentHandler.prototype.findLeadingComments = function (metadata) { 235 var leadingComments = []; 236 var target; 237 while (this.stack.length > 0) { 238 var entry = this.stack[this.stack.length - 1]; 239 if (entry && entry.start >= metadata.start.offset) { 240 target = entry.node; 241 this.stack.pop(); 242 } 243 else { 244 break; 245 } 246 } 247 if (target) { 248 var count = target.leadingComments ? target.leadingComments.length : 0; 249 for (var i = count - 1; i >= 0; --i) { 250 var comment = target.leadingComments[i]; 251 if (comment.range[1] <= metadata.start.offset) { 252 leadingComments.unshift(comment); 253 target.leadingComments.splice(i, 1); 254 } 255 } 256 if (target.leadingComments && target.leadingComments.length === 0) { 257 delete target.leadingComments; 258 } 259 return leadingComments; 260 } 261 for (var i = this.leading.length - 1; i >= 0; --i) { 262 var entry = this.leading[i]; 263 if (entry.start <= metadata.start.offset) { 264 leadingComments.unshift(entry.comment); 265 this.leading.splice(i, 1); 266 } 267 } 268 return leadingComments; 269 }; 270 CommentHandler.prototype.visitNode = function (node, metadata) { 271 if (node.type === syntax_1.Syntax.Program && node.body.length > 0) { 272 return; 273 } 274 this.insertInnerComments(node, metadata); 275 var trailingComments = this.findTrailingComments(metadata); 276 var leadingComments = this.findLeadingComments(metadata); 277 if (leadingComments.length > 0) { 278 node.leadingComments = leadingComments; 279 } 280 if (trailingComments.length > 0) { 281 node.trailingComments = trailingComments; 282 } 283 this.stack.push({ 284 node: node, 285 start: metadata.start.offset 286 }); 287 }; 288 CommentHandler.prototype.visitComment = function (node, metadata) { 289 var type = (node.type[0] === 'L') ? 'Line' : 'Block'; 290 var comment = { 291 type: type, 292 value: node.value 293 }; 294 if (node.range) { 295 comment.range = node.range; 296 } 297 if (node.loc) { 298 comment.loc = node.loc; 299 } 300 this.comments.push(comment); 301 if (this.attach) { 302 var entry = { 303 comment: { 304 type: type, 305 value: node.value, 306 range: [metadata.start.offset, metadata.end.offset] 307 }, 308 start: metadata.start.offset 309 }; 310 if (node.loc) { 311 entry.comment.loc = node.loc; 312 } 313 node.type = type; 314 this.leading.push(entry); 315 this.trailing.push(entry); 316 } 317 }; 318 CommentHandler.prototype.visit = function (node, metadata) { 319 if (node.type === 'LineComment') { 320 this.visitComment(node, metadata); 321 } 322 else if (node.type === 'BlockComment') { 323 this.visitComment(node, metadata); 324 } 325 else if (this.attach) { 326 this.visitNode(node, metadata); 327 } 328 }; 329 return CommentHandler; 330 }()); 331 exports.CommentHandler = CommentHandler; 332 333 334 /***/ }, 335 /* 2 */ 336 /***/ function(module, exports) { 337 338 "use strict"; 339 Object.defineProperty(exports, "__esModule", { value: true }); 340 exports.Syntax = { 341 AssignmentExpression: 'AssignmentExpression', 342 AssignmentPattern: 'AssignmentPattern', 343 ArrayExpression: 'ArrayExpression', 344 ArrayPattern: 'ArrayPattern', 345 ArrowFunctionExpression: 'ArrowFunctionExpression', 346 AwaitExpression: 'AwaitExpression', 347 BlockStatement: 'BlockStatement', 348 BinaryExpression: 'BinaryExpression', 349 BreakStatement: 'BreakStatement', 350 CallExpression: 'CallExpression', 351 CatchClause: 'CatchClause', 352 ClassBody: 'ClassBody', 353 ClassDeclaration: 'ClassDeclaration', 354 ClassExpression: 'ClassExpression', 355 ConditionalExpression: 'ConditionalExpression', 356 ContinueStatement: 'ContinueStatement', 357 DoWhileStatement: 'DoWhileStatement', 358 DebuggerStatement: 'DebuggerStatement', 359 EmptyStatement: 'EmptyStatement', 360 ExportAllDeclaration: 'ExportAllDeclaration', 361 ExportDefaultDeclaration: 'ExportDefaultDeclaration', 362 ExportNamedDeclaration: 'ExportNamedDeclaration', 363 ExportSpecifier: 'ExportSpecifier', 364 ExpressionStatement: 'ExpressionStatement', 365 ForStatement: 'ForStatement', 366 ForOfStatement: 'ForOfStatement', 367 ForInStatement: 'ForInStatement', 368 FunctionDeclaration: 'FunctionDeclaration', 369 FunctionExpression: 'FunctionExpression', 370 Identifier: 'Identifier', 371 IfStatement: 'IfStatement', 372 ImportDeclaration: 'ImportDeclaration', 373 ImportDefaultSpecifier: 'ImportDefaultSpecifier', 374 ImportNamespaceSpecifier: 'ImportNamespaceSpecifier', 375 ImportSpecifier: 'ImportSpecifier', 376 Literal: 'Literal', 377 LabeledStatement: 'LabeledStatement', 378 LogicalExpression: 'LogicalExpression', 379 MemberExpression: 'MemberExpression', 380 MetaProperty: 'MetaProperty', 381 MethodDefinition: 'MethodDefinition', 382 NewExpression: 'NewExpression', 383 ObjectExpression: 'ObjectExpression', 384 ObjectPattern: 'ObjectPattern', 385 Program: 'Program', 386 Property: 'Property', 387 RestElement: 'RestElement', 388 ReturnStatement: 'ReturnStatement', 389 SequenceExpression: 'SequenceExpression', 390 SpreadElement: 'SpreadElement', 391 Super: 'Super', 392 SwitchCase: 'SwitchCase', 393 SwitchStatement: 'SwitchStatement', 394 TaggedTemplateExpression: 'TaggedTemplateExpression', 395 TemplateElement: 'TemplateElement', 396 TemplateLiteral: 'TemplateLiteral', 397 ThisExpression: 'ThisExpression', 398 ThrowStatement: 'ThrowStatement', 399 TryStatement: 'TryStatement', 400 UnaryExpression: 'UnaryExpression', 401 UpdateExpression: 'UpdateExpression', 402 VariableDeclaration: 'VariableDeclaration', 403 VariableDeclarator: 'VariableDeclarator', 404 WhileStatement: 'WhileStatement', 405 WithStatement: 'WithStatement', 406 YieldExpression: 'YieldExpression' 407 }; 408 409 410 /***/ }, 411 /* 3 */ 412 /***/ function(module, exports, __webpack_require__) { 413 414 "use strict"; 415 /* istanbul ignore next */ 416 var __extends = (this && this.__extends) || (function () { 417 var extendStatics = Object.setPrototypeOf || 418 ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || 419 function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; 420 return function (d, b) { 421 extendStatics(d, b); 422 function __() { this.constructor = d; } 423 d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); 424 }; 425 })(); 426 Object.defineProperty(exports, "__esModule", { value: true }); 427 var character_1 = __webpack_require__(4); 428 var JSXNode = __webpack_require__(5); 429 var jsx_syntax_1 = __webpack_require__(6); 430 var Node = __webpack_require__(7); 431 var parser_1 = __webpack_require__(8); 432 var token_1 = __webpack_require__(13); 433 var xhtml_entities_1 = __webpack_require__(14); 434 token_1.TokenName[100 /* Identifier */] = 'JSXIdentifier'; 435 token_1.TokenName[101 /* Text */] = 'JSXText'; 436 // Fully qualified element name, e.g. <svg:path> returns "svg:path" 437 function getQualifiedElementName(elementName) { 438 var qualifiedName; 439 switch (elementName.type) { 440 case jsx_syntax_1.JSXSyntax.JSXIdentifier: 441 var id = elementName; 442 qualifiedName = id.name; 443 break; 444 case jsx_syntax_1.JSXSyntax.JSXNamespacedName: 445 var ns = elementName; 446 qualifiedName = getQualifiedElementName(ns.namespace) + ':' + 447 getQualifiedElementName(ns.name); 448 break; 449 case jsx_syntax_1.JSXSyntax.JSXMemberExpression: 450 var expr = elementName; 451 qualifiedName = getQualifiedElementName(expr.object) + '.' + 452 getQualifiedElementName(expr.property); 453 break; 454 /* istanbul ignore next */ 455 default: 456 break; 457 } 458 return qualifiedName; 459 } 460 var JSXParser = (function (_super) { 461 __extends(JSXParser, _super); 462 function JSXParser(code, options, delegate) { 463 return _super.call(this, code, options, delegate) || this; 464 } 465 JSXParser.prototype.parsePrimaryExpression = function () { 466 return this.match('<') ? this.parseJSXRoot() : _super.prototype.parsePrimaryExpression.call(this); 467 }; 468 JSXParser.prototype.startJSX = function () { 469 // Unwind the scanner before the lookahead token. 470 this.scanner.index = this.startMarker.index; 471 this.scanner.lineNumber = this.startMarker.line; 472 this.scanner.lineStart = this.startMarker.index - this.startMarker.column; 473 }; 474 JSXParser.prototype.finishJSX = function () { 475 // Prime the next lookahead. 476 this.nextToken(); 477 }; 478 JSXParser.prototype.reenterJSX = function () { 479 this.startJSX(); 480 this.expectJSX('}'); 481 // Pop the closing '}' added from the lookahead. 482 if (this.config.tokens) { 483 this.tokens.pop(); 484 } 485 }; 486 JSXParser.prototype.createJSXNode = function () { 487 this.collectComments(); 488 return { 489 index: this.scanner.index, 490 line: this.scanner.lineNumber, 491 column: this.scanner.index - this.scanner.lineStart 492 }; 493 }; 494 JSXParser.prototype.createJSXChildNode = function () { 495 return { 496 index: this.scanner.index, 497 line: this.scanner.lineNumber, 498 column: this.scanner.index - this.scanner.lineStart 499 }; 500 }; 501 JSXParser.prototype.scanXHTMLEntity = function (quote) { 502 var result = '&'; 503 var valid = true; 504 var terminated = false; 505 var numeric = false; 506 var hex = false; 507 while (!this.scanner.eof() && valid && !terminated) { 508 var ch = this.scanner.source[this.scanner.index]; 509 if (ch === quote) { 510 break; 511 } 512 terminated = (ch === ';'); 513 result += ch; 514 ++this.scanner.index; 515 if (!terminated) { 516 switch (result.length) { 517 case 2: 518 // e.g. '{' 519 numeric = (ch === '#'); 520 break; 521 case 3: 522 if (numeric) { 523 // e.g. 'A' 524 hex = (ch === 'x'); 525 valid = hex || character_1.Character.isDecimalDigit(ch.charCodeAt(0)); 526 numeric = numeric && !hex; 527 } 528 break; 529 default: 530 valid = valid && !(numeric && !character_1.Character.isDecimalDigit(ch.charCodeAt(0))); 531 valid = valid && !(hex && !character_1.Character.isHexDigit(ch.charCodeAt(0))); 532 break; 533 } 534 } 535 } 536 if (valid && terminated && result.length > 2) { 537 // e.g. 'A' becomes just '#x41' 538 var str = result.substr(1, result.length - 2); 539 if (numeric && str.length > 1) { 540 result = String.fromCharCode(parseInt(str.substr(1), 10)); 541 } 542 else if (hex && str.length > 2) { 543 result = String.fromCharCode(parseInt('0' + str.substr(1), 16)); 544 } 545 else if (!numeric && !hex && xhtml_entities_1.XHTMLEntities[str]) { 546 result = xhtml_entities_1.XHTMLEntities[str]; 547 } 548 } 549 return result; 550 }; 551 // Scan the next JSX token. This replaces Scanner#lex when in JSX mode. 552 JSXParser.prototype.lexJSX = function () { 553 var cp = this.scanner.source.charCodeAt(this.scanner.index); 554 // < > / : = { } 555 if (cp === 60 || cp === 62 || cp === 47 || cp === 58 || cp === 61 || cp === 123 || cp === 125) { 556 var value = this.scanner.source[this.scanner.index++]; 557 return { 558 type: 7 /* Punctuator */, 559 value: value, 560 lineNumber: this.scanner.lineNumber, 561 lineStart: this.scanner.lineStart, 562 start: this.scanner.index - 1, 563 end: this.scanner.index 564 }; 565 } 566 // " ' 567 if (cp === 34 || cp === 39) { 568 var start = this.scanner.index; 569 var quote = this.scanner.source[this.scanner.index++]; 570 var str = ''; 571 while (!this.scanner.eof()) { 572 var ch = this.scanner.source[this.scanner.index++]; 573 if (ch === quote) { 574 break; 575 } 576 else if (ch === '&') { 577 str += this.scanXHTMLEntity(quote); 578 } 579 else { 580 str += ch; 581 } 582 } 583 return { 584 type: 8 /* StringLiteral */, 585 value: str, 586 lineNumber: this.scanner.lineNumber, 587 lineStart: this.scanner.lineStart, 588 start: start, 589 end: this.scanner.index 590 }; 591 } 592 // ... or . 593 if (cp === 46) { 594 var n1 = this.scanner.source.charCodeAt(this.scanner.index + 1); 595 var n2 = this.scanner.source.charCodeAt(this.scanner.index + 2); 596 var value = (n1 === 46 && n2 === 46) ? '...' : '.'; 597 var start = this.scanner.index; 598 this.scanner.index += value.length; 599 return { 600 type: 7 /* Punctuator */, 601 value: value, 602 lineNumber: this.scanner.lineNumber, 603 lineStart: this.scanner.lineStart, 604 start: start, 605 end: this.scanner.index 606 }; 607 } 608 // ` 609 if (cp === 96) { 610 // Only placeholder, since it will be rescanned as a real assignment expression. 611 return { 612 type: 10 /* Template */, 613 value: '', 614 lineNumber: this.scanner.lineNumber, 615 lineStart: this.scanner.lineStart, 616 start: this.scanner.index, 617 end: this.scanner.index 618 }; 619 } 620 // Identifer can not contain backslash (char code 92). 621 if (character_1.Character.isIdentifierStart(cp) && (cp !== 92)) { 622 var start = this.scanner.index; 623 ++this.scanner.index; 624 while (!this.scanner.eof()) { 625 var ch = this.scanner.source.charCodeAt(this.scanner.index); 626 if (character_1.Character.isIdentifierPart(ch) && (ch !== 92)) { 627 ++this.scanner.index; 628 } 629 else if (ch === 45) { 630 // Hyphen (char code 45) can be part of an identifier. 631 ++this.scanner.index; 632 } 633 else { 634 break; 635 } 636 } 637 var id = this.scanner.source.slice(start, this.scanner.index); 638 return { 639 type: 100 /* Identifier */, 640 value: id, 641 lineNumber: this.scanner.lineNumber, 642 lineStart: this.scanner.lineStart, 643 start: start, 644 end: this.scanner.index 645 }; 646 } 647 return this.scanner.lex(); 648 }; 649 JSXParser.prototype.nextJSXToken = function () { 650 this.collectComments(); 651 this.startMarker.index = this.scanner.index; 652 this.startMarker.line = this.scanner.lineNumber; 653 this.startMarker.column = this.scanner.index - this.scanner.lineStart; 654 var token = this.lexJSX(); 655 this.lastMarker.index = this.scanner.index; 656 this.lastMarker.line = this.scanner.lineNumber; 657 this.lastMarker.column = this.scanner.index - this.scanner.lineStart; 658 if (this.config.tokens) { 659 this.tokens.push(this.convertToken(token)); 660 } 661 return token; 662 }; 663 JSXParser.prototype.nextJSXText = function () { 664 this.startMarker.index = this.scanner.index; 665 this.startMarker.line = this.scanner.lineNumber; 666 this.startMarker.column = this.scanner.index - this.scanner.lineStart; 667 var start = this.scanner.index; 668 var text = ''; 669 while (!this.scanner.eof()) { 670 var ch = this.scanner.source[this.scanner.index]; 671 if (ch === '{' || ch === '<') { 672 break; 673 } 674 ++this.scanner.index; 675 text += ch; 676 if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 677 ++this.scanner.lineNumber; 678 if (ch === '\r' && this.scanner.source[this.scanner.index] === '\n') { 679 ++this.scanner.index; 680 } 681 this.scanner.lineStart = this.scanner.index; 682 } 683 } 684 this.lastMarker.index = this.scanner.index; 685 this.lastMarker.line = this.scanner.lineNumber; 686 this.lastMarker.column = this.scanner.index - this.scanner.lineStart; 687 var token = { 688 type: 101 /* Text */, 689 value: text, 690 lineNumber: this.scanner.lineNumber, 691 lineStart: this.scanner.lineStart, 692 start: start, 693 end: this.scanner.index 694 }; 695 if ((text.length > 0) && this.config.tokens) { 696 this.tokens.push(this.convertToken(token)); 697 } 698 return token; 699 }; 700 JSXParser.prototype.peekJSXToken = function () { 701 var state = this.scanner.saveState(); 702 this.scanner.scanComments(); 703 var next = this.lexJSX(); 704 this.scanner.restoreState(state); 705 return next; 706 }; 707 // Expect the next JSX token to match the specified punctuator. 708 // If not, an exception will be thrown. 709 JSXParser.prototype.expectJSX = function (value) { 710 var token = this.nextJSXToken(); 711 if (token.type !== 7 /* Punctuator */ || token.value !== value) { 712 this.throwUnexpectedToken(token); 713 } 714 }; 715 // Return true if the next JSX token matches the specified punctuator. 716 JSXParser.prototype.matchJSX = function (value) { 717 var next = this.peekJSXToken(); 718 return next.type === 7 /* Punctuator */ && next.value === value; 719 }; 720 JSXParser.prototype.parseJSXIdentifier = function () { 721 var node = this.createJSXNode(); 722 var token = this.nextJSXToken(); 723 if (token.type !== 100 /* Identifier */) { 724 this.throwUnexpectedToken(token); 725 } 726 return this.finalize(node, new JSXNode.JSXIdentifier(token.value)); 727 }; 728 JSXParser.prototype.parseJSXElementName = function () { 729 var node = this.createJSXNode(); 730 var elementName = this.parseJSXIdentifier(); 731 if (this.matchJSX(':')) { 732 var namespace = elementName; 733 this.expectJSX(':'); 734 var name_1 = this.parseJSXIdentifier(); 735 elementName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_1)); 736 } 737 else if (this.matchJSX('.')) { 738 while (this.matchJSX('.')) { 739 var object = elementName; 740 this.expectJSX('.'); 741 var property = this.parseJSXIdentifier(); 742 elementName = this.finalize(node, new JSXNode.JSXMemberExpression(object, property)); 743 } 744 } 745 return elementName; 746 }; 747 JSXParser.prototype.parseJSXAttributeName = function () { 748 var node = this.createJSXNode(); 749 var attributeName; 750 var identifier = this.parseJSXIdentifier(); 751 if (this.matchJSX(':')) { 752 var namespace = identifier; 753 this.expectJSX(':'); 754 var name_2 = this.parseJSXIdentifier(); 755 attributeName = this.finalize(node, new JSXNode.JSXNamespacedName(namespace, name_2)); 756 } 757 else { 758 attributeName = identifier; 759 } 760 return attributeName; 761 }; 762 JSXParser.prototype.parseJSXStringLiteralAttribute = function () { 763 var node = this.createJSXNode(); 764 var token = this.nextJSXToken(); 765 if (token.type !== 8 /* StringLiteral */) { 766 this.throwUnexpectedToken(token); 767 } 768 var raw = this.getTokenRaw(token); 769 return this.finalize(node, new Node.Literal(token.value, raw)); 770 }; 771 JSXParser.prototype.parseJSXExpressionAttribute = function () { 772 var node = this.createJSXNode(); 773 this.expectJSX('{'); 774 this.finishJSX(); 775 if (this.match('}')) { 776 this.tolerateError('JSX attributes must only be assigned a non-empty expression'); 777 } 778 var expression = this.parseAssignmentExpression(); 779 this.reenterJSX(); 780 return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); 781 }; 782 JSXParser.prototype.parseJSXAttributeValue = function () { 783 return this.matchJSX('{') ? this.parseJSXExpressionAttribute() : 784 this.matchJSX('<') ? this.parseJSXElement() : this.parseJSXStringLiteralAttribute(); 785 }; 786 JSXParser.prototype.parseJSXNameValueAttribute = function () { 787 var node = this.createJSXNode(); 788 var name = this.parseJSXAttributeName(); 789 var value = null; 790 if (this.matchJSX('=')) { 791 this.expectJSX('='); 792 value = this.parseJSXAttributeValue(); 793 } 794 return this.finalize(node, new JSXNode.JSXAttribute(name, value)); 795 }; 796 JSXParser.prototype.parseJSXSpreadAttribute = function () { 797 var node = this.createJSXNode(); 798 this.expectJSX('{'); 799 this.expectJSX('...'); 800 this.finishJSX(); 801 var argument = this.parseAssignmentExpression(); 802 this.reenterJSX(); 803 return this.finalize(node, new JSXNode.JSXSpreadAttribute(argument)); 804 }; 805 JSXParser.prototype.parseJSXAttributes = function () { 806 var attributes = []; 807 while (!this.matchJSX('/') && !this.matchJSX('>')) { 808 var attribute = this.matchJSX('{') ? this.parseJSXSpreadAttribute() : 809 this.parseJSXNameValueAttribute(); 810 attributes.push(attribute); 811 } 812 return attributes; 813 }; 814 JSXParser.prototype.parseJSXOpeningElement = function () { 815 var node = this.createJSXNode(); 816 this.expectJSX('<'); 817 var name = this.parseJSXElementName(); 818 var attributes = this.parseJSXAttributes(); 819 var selfClosing = this.matchJSX('/'); 820 if (selfClosing) { 821 this.expectJSX('/'); 822 } 823 this.expectJSX('>'); 824 return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); 825 }; 826 JSXParser.prototype.parseJSXBoundaryElement = function () { 827 var node = this.createJSXNode(); 828 this.expectJSX('<'); 829 if (this.matchJSX('/')) { 830 this.expectJSX('/'); 831 var name_3 = this.parseJSXElementName(); 832 this.expectJSX('>'); 833 return this.finalize(node, new JSXNode.JSXClosingElement(name_3)); 834 } 835 var name = this.parseJSXElementName(); 836 var attributes = this.parseJSXAttributes(); 837 var selfClosing = this.matchJSX('/'); 838 if (selfClosing) { 839 this.expectJSX('/'); 840 } 841 this.expectJSX('>'); 842 return this.finalize(node, new JSXNode.JSXOpeningElement(name, selfClosing, attributes)); 843 }; 844 JSXParser.prototype.parseJSXEmptyExpression = function () { 845 var node = this.createJSXChildNode(); 846 this.collectComments(); 847 this.lastMarker.index = this.scanner.index; 848 this.lastMarker.line = this.scanner.lineNumber; 849 this.lastMarker.column = this.scanner.index - this.scanner.lineStart; 850 return this.finalize(node, new JSXNode.JSXEmptyExpression()); 851 }; 852 JSXParser.prototype.parseJSXExpressionContainer = function () { 853 var node = this.createJSXNode(); 854 this.expectJSX('{'); 855 var expression; 856 if (this.matchJSX('}')) { 857 expression = this.parseJSXEmptyExpression(); 858 this.expectJSX('}'); 859 } 860 else { 861 this.finishJSX(); 862 expression = this.parseAssignmentExpression(); 863 this.reenterJSX(); 864 } 865 return this.finalize(node, new JSXNode.JSXExpressionContainer(expression)); 866 }; 867 JSXParser.prototype.parseJSXChildren = function () { 868 var children = []; 869 while (!this.scanner.eof()) { 870 var node = this.createJSXChildNode(); 871 var token = this.nextJSXText(); 872 if (token.start < token.end) { 873 var raw = this.getTokenRaw(token); 874 var child = this.finalize(node, new JSXNode.JSXText(token.value, raw)); 875 children.push(child); 876 } 877 if (this.scanner.source[this.scanner.index] === '{') { 878 var container = this.parseJSXExpressionContainer(); 879 children.push(container); 880 } 881 else { 882 break; 883 } 884 } 885 return children; 886 }; 887 JSXParser.prototype.parseComplexJSXElement = function (el) { 888 var stack = []; 889 while (!this.scanner.eof()) { 890 el.children = el.children.concat(this.parseJSXChildren()); 891 var node = this.createJSXChildNode(); 892 var element = this.parseJSXBoundaryElement(); 893 if (element.type === jsx_syntax_1.JSXSyntax.JSXOpeningElement) { 894 var opening = element; 895 if (opening.selfClosing) { 896 var child = this.finalize(node, new JSXNode.JSXElement(opening, [], null)); 897 el.children.push(child); 898 } 899 else { 900 stack.push(el); 901 el = { node: node, opening: opening, closing: null, children: [] }; 902 } 903 } 904 if (element.type === jsx_syntax_1.JSXSyntax.JSXClosingElement) { 905 el.closing = element; 906 var open_1 = getQualifiedElementName(el.opening.name); 907 var close_1 = getQualifiedElementName(el.closing.name); 908 if (open_1 !== close_1) { 909 this.tolerateError('Expected corresponding JSX closing tag for %0', open_1); 910 } 911 if (stack.length > 0) { 912 var child = this.finalize(el.node, new JSXNode.JSXElement(el.opening, el.children, el.closing)); 913 el = stack[stack.length - 1]; 914 el.children.push(child); 915 stack.pop(); 916 } 917 else { 918 break; 919 } 920 } 921 } 922 return el; 923 }; 924 JSXParser.prototype.parseJSXElement = function () { 925 var node = this.createJSXNode(); 926 var opening = this.parseJSXOpeningElement(); 927 var children = []; 928 var closing = null; 929 if (!opening.selfClosing) { 930 var el = this.parseComplexJSXElement({ node: node, opening: opening, closing: closing, children: children }); 931 children = el.children; 932 closing = el.closing; 933 } 934 return this.finalize(node, new JSXNode.JSXElement(opening, children, closing)); 935 }; 936 JSXParser.prototype.parseJSXRoot = function () { 937 // Pop the opening '<' added from the lookahead. 938 if (this.config.tokens) { 939 this.tokens.pop(); 940 } 941 this.startJSX(); 942 var element = this.parseJSXElement(); 943 this.finishJSX(); 944 return element; 945 }; 946 JSXParser.prototype.isStartOfExpression = function () { 947 return _super.prototype.isStartOfExpression.call(this) || this.match('<'); 948 }; 949 return JSXParser; 950 }(parser_1.Parser)); 951 exports.JSXParser = JSXParser; 952 953 954 /***/ }, 955 /* 4 */ 956 /***/ function(module, exports) { 957 958 "use strict"; 959 Object.defineProperty(exports, "__esModule", { value: true }); 960 // See also tools/generate-unicode-regex.js. 961 var Regex = { 962 // Unicode v8.0.0 NonAsciiIdentifierStart: 963 NonAsciiIdentifierStart: /[\xAA\xB5\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0-\u08B4\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0980\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0AF9\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D\u0C58-\u0C5A\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D\u0D4E\u0D5F-\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1711\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191E\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u1A00-\u1A16\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u3005-\u3007\u3021-\u3029\u3031-\u3035\u3038-\u303C\u3041-\u3096\u309B-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B\uA640-\uA66E\uA67F-\uA69D\uA6A0-\uA6EF\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA801\uA803-\uA805\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB\uA8FD\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uA9E0-\uA9E4\uA9E6-\uA9EF\uA9FA-\uA9FE\uAA00-\uAA28\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA7E-\uAAAF\uAAB1\uAAB5\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDE80-\uDE9C\uDEA0-\uDED0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF75\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00\uDE10-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE4\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC03-\uDC37\uDC83-\uDCAF\uDCD0-\uDCE8\uDD03-\uDD26\uDD50-\uDD72\uDD76\uDD83-\uDDB2\uDDC1-\uDDC4\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE2B\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEDE\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3D\uDF50\uDF5D-\uDF61]|\uD805[\uDC80-\uDCAF\uDCC4\uDCC5\uDCC7\uDD80-\uDDAE\uDDD8-\uDDDB\uDE00-\uDE2F\uDE44\uDE80-\uDEAA\uDF00-\uDF19]|\uD806[\uDCA0-\uDCDF\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDED0-\uDEED\uDF00-\uDF2F\uDF40-\uDF43\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50\uDF93-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB]|\uD83A[\uDC00-\uDCC4]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]/, 964 // Unicode v8.0.0 NonAsciiIdentifierPart: 965 NonAsciiIdentifierPart: /[\xAA\xB5\xB7\xBA\xC0-\xD6\xD8-\xF6\xF8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0300-\u0374\u0376\u0377\u037A-\u037D\u037F\u0386-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5\u03F7-\u0481\u0483-\u0487\u048A-\u052F\u0531-\u0556\u0559\u0561-\u0587\u0591-\u05BD\u05BF\u05C1\u05C2\u05C4\u05C5\u05C7\u05D0-\u05EA\u05F0-\u05F2\u0610-\u061A\u0620-\u0669\u066E-\u06D3\u06D5-\u06DC\u06DF-\u06E8\u06EA-\u06FC\u06FF\u0710-\u074A\u074D-\u07B1\u07C0-\u07F5\u07FA\u0800-\u082D\u0840-\u085B\u08A0-\u08B4\u08E3-\u0963\u0966-\u096F\u0971-\u0983\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2\u09B6-\u09B9\u09BC-\u09C4\u09C7\u09C8\u09CB-\u09CE\u09D7\u09DC\u09DD\u09DF-\u09E3\u09E6-\u09F1\u0A01-\u0A03\u0A05-\u0A0A\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39\u0A3C\u0A3E-\u0A42\u0A47\u0A48\u0A4B-\u0A4D\u0A51\u0A59-\u0A5C\u0A5E\u0A66-\u0A75\u0A81-\u0A83\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABC-\u0AC5\u0AC7-\u0AC9\u0ACB-\u0ACD\u0AD0\u0AE0-\u0AE3\u0AE6-\u0AEF\u0AF9\u0B01-\u0B03\u0B05-\u0B0C\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3C-\u0B44\u0B47\u0B48\u0B4B-\u0B4D\u0B56\u0B57\u0B5C\u0B5D\u0B5F-\u0B63\u0B66-\u0B6F\u0B71\u0B82\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BBE-\u0BC2\u0BC6-\u0BC8\u0BCA-\u0BCD\u0BD0\u0BD7\u0BE6-\u0BEF\u0C00-\u0C03\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C39\u0C3D-\u0C44\u0C46-\u0C48\u0C4A-\u0C4D\u0C55\u0C56\u0C58-\u0C5A\u0C60-\u0C63\u0C66-\u0C6F\u0C81-\u0C83\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3\u0CB5-\u0CB9\u0CBC-\u0CC4\u0CC6-\u0CC8\u0CCA-\u0CCD\u0CD5\u0CD6\u0CDE\u0CE0-\u0CE3\u0CE6-\u0CEF\u0CF1\u0CF2\u0D01-\u0D03\u0D05-\u0D0C\u0D0E-\u0D10\u0D12-\u0D3A\u0D3D-\u0D44\u0D46-\u0D48\u0D4A-\u0D4E\u0D57\u0D5F-\u0D63\u0D66-\u0D6F\u0D7A-\u0D7F\u0D82\u0D83\u0D85-\u0D96\u0D9A-\u0DB1\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0DCA\u0DCF-\u0DD4\u0DD6\u0DD8-\u0DDF\u0DE6-\u0DEF\u0DF2\u0DF3\u0E01-\u0E3A\u0E40-\u0E4E\u0E50-\u0E59\u0E81\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB9\u0EBB-\u0EBD\u0EC0-\u0EC4\u0EC6\u0EC8-\u0ECD\u0ED0-\u0ED9\u0EDC-\u0EDF\u0F00\u0F18\u0F19\u0F20-\u0F29\u0F35\u0F37\u0F39\u0F3E-\u0F47\u0F49-\u0F6C\u0F71-\u0F84\u0F86-\u0F97\u0F99-\u0FBC\u0FC6\u1000-\u1049\u1050-\u109D\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310\u1312-\u1315\u1318-\u135A\u135D-\u135F\u1369-\u1371\u1380-\u138F\u13A0-\u13F5\u13F8-\u13FD\u1401-\u166C\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u16EE-\u16F8\u1700-\u170C\u170E-\u1714\u1720-\u1734\u1740-\u1753\u1760-\u176C\u176E-\u1770\u1772\u1773\u1780-\u17D3\u17D7\u17DC\u17DD\u17E0-\u17E9\u180B-\u180D\u1810-\u1819\u1820-\u1877\u1880-\u18AA\u18B0-\u18F5\u1900-\u191E\u1920-\u192B\u1930-\u193B\u1946-\u196D\u1970-\u1974\u1980-\u19AB\u19B0-\u19C9\u19D0-\u19DA\u1A00-\u1A1B\u1A20-\u1A5E\u1A60-\u1A7C\u1A7F-\u1A89\u1A90-\u1A99\u1AA7\u1AB0-\u1ABD\u1B00-\u1B4B\u1B50-\u1B59\u1B6B-\u1B73\u1B80-\u1BF3\u1C00-\u1C37\u1C40-\u1C49\u1C4D-\u1C7D\u1CD0-\u1CD2\u1CD4-\u1CF6\u1CF8\u1CF9\u1D00-\u1DF5\u1DFC-\u1F15\u1F18-\u1F1D\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u200C\u200D\u203F\u2040\u2054\u2071\u207F\u2090-\u209C\u20D0-\u20DC\u20E1\u20E5-\u20F0\u2102\u2107\u210A-\u2113\u2115\u2118-\u211D\u2124\u2126\u2128\u212A-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2160-\u2188\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CF3\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D7F-\u2D96\u2DA0-\u2DA6\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE\u2DD0-\u2DD6\u2DD8-\u2DDE\u2DE0-\u2DFF\u3005-\u3007\u3021-\u302F\u3031-\u3035\u3038-\u303C\u3041-\u3096\u3099-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FD5\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA62B\uA640-\uA66F\uA674-\uA67D\uA67F-\uA6F1\uA717-\uA71F\uA722-\uA788\uA78B-\uA7AD\uA7B0-\uA7B7\uA7F7-\uA827\uA840-\uA873\uA880-\uA8C4\uA8D0-\uA8D9\uA8E0-\uA8F7\uA8FB\uA8FD\uA900-\uA92D\uA930-\uA953\uA960-\uA97C\uA980-\uA9C0\uA9CF-\uA9D9\uA9E0-\uA9FE\uAA00-\uAA36\uAA40-\uAA4D\uAA50-\uAA59\uAA60-\uAA76\uAA7A-\uAAC2\uAADB-\uAADD\uAAE0-\uAAEF\uAAF2-\uAAF6\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E\uAB30-\uAB5A\uAB5C-\uAB65\uAB70-\uABEA\uABEC\uABED\uABF0-\uABF9\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D-\uFB28\uFB2A-\uFB36\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE00-\uFE0F\uFE20-\uFE2F\uFE33\uFE34\uFE4D-\uFE4F\uFE70-\uFE74\uFE76-\uFEFC\uFF10-\uFF19\uFF21-\uFF3A\uFF3F\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF\uFFD2-\uFFD7\uFFDA-\uFFDC]|\uD800[\uDC00-\uDC0B\uDC0D-\uDC26\uDC28-\uDC3A\uDC3C\uDC3D\uDC3F-\uDC4D\uDC50-\uDC5D\uDC80-\uDCFA\uDD40-\uDD74\uDDFD\uDE80-\uDE9C\uDEA0-\uDED0\uDEE0\uDF00-\uDF1F\uDF30-\uDF4A\uDF50-\uDF7A\uDF80-\uDF9D\uDFA0-\uDFC3\uDFC8-\uDFCF\uDFD1-\uDFD5]|\uD801[\uDC00-\uDC9D\uDCA0-\uDCA9\uDD00-\uDD27\uDD30-\uDD63\uDE00-\uDF36\uDF40-\uDF55\uDF60-\uDF67]|\uD802[\uDC00-\uDC05\uDC08\uDC0A-\uDC35\uDC37\uDC38\uDC3C\uDC3F-\uDC55\uDC60-\uDC76\uDC80-\uDC9E\uDCE0-\uDCF2\uDCF4\uDCF5\uDD00-\uDD15\uDD20-\uDD39\uDD80-\uDDB7\uDDBE\uDDBF\uDE00-\uDE03\uDE05\uDE06\uDE0C-\uDE13\uDE15-\uDE17\uDE19-\uDE33\uDE38-\uDE3A\uDE3F\uDE60-\uDE7C\uDE80-\uDE9C\uDEC0-\uDEC7\uDEC9-\uDEE6\uDF00-\uDF35\uDF40-\uDF55\uDF60-\uDF72\uDF80-\uDF91]|\uD803[\uDC00-\uDC48\uDC80-\uDCB2\uDCC0-\uDCF2]|\uD804[\uDC00-\uDC46\uDC66-\uDC6F\uDC7F-\uDCBA\uDCD0-\uDCE8\uDCF0-\uDCF9\uDD00-\uDD34\uDD36-\uDD3F\uDD50-\uDD73\uDD76\uDD80-\uDDC4\uDDCA-\uDDCC\uDDD0-\uDDDA\uDDDC\uDE00-\uDE11\uDE13-\uDE37\uDE80-\uDE86\uDE88\uDE8A-\uDE8D\uDE8F-\uDE9D\uDE9F-\uDEA8\uDEB0-\uDEEA\uDEF0-\uDEF9\uDF00-\uDF03\uDF05-\uDF0C\uDF0F\uDF10\uDF13-\uDF28\uDF2A-\uDF30\uDF32\uDF33\uDF35-\uDF39\uDF3C-\uDF44\uDF47\uDF48\uDF4B-\uDF4D\uDF50\uDF57\uDF5D-\uDF63\uDF66-\uDF6C\uDF70-\uDF74]|\uD805[\uDC80-\uDCC5\uDCC7\uDCD0-\uDCD9\uDD80-\uDDB5\uDDB8-\uDDC0\uDDD8-\uDDDD\uDE00-\uDE40\uDE44\uDE50-\uDE59\uDE80-\uDEB7\uDEC0-\uDEC9\uDF00-\uDF19\uDF1D-\uDF2B\uDF30-\uDF39]|\uD806[\uDCA0-\uDCE9\uDCFF\uDEC0-\uDEF8]|\uD808[\uDC00-\uDF99]|\uD809[\uDC00-\uDC6E\uDC80-\uDD43]|[\uD80C\uD840-\uD868\uD86A-\uD86C\uD86F-\uD872][\uDC00-\uDFFF]|\uD80D[\uDC00-\uDC2E]|\uD811[\uDC00-\uDE46]|\uD81A[\uDC00-\uDE38\uDE40-\uDE5E\uDE60-\uDE69\uDED0-\uDEED\uDEF0-\uDEF4\uDF00-\uDF36\uDF40-\uDF43\uDF50-\uDF59\uDF63-\uDF77\uDF7D-\uDF8F]|\uD81B[\uDF00-\uDF44\uDF50-\uDF7E\uDF8F-\uDF9F]|\uD82C[\uDC00\uDC01]|\uD82F[\uDC00-\uDC6A\uDC70-\uDC7C\uDC80-\uDC88\uDC90-\uDC99\uDC9D\uDC9E]|\uD834[\uDD65-\uDD69\uDD6D-\uDD72\uDD7B-\uDD82\uDD85-\uDD8B\uDDAA-\uDDAD\uDE42-\uDE44]|\uD835[\uDC00-\uDC54\uDC56-\uDC9C\uDC9E\uDC9F\uDCA2\uDCA5\uDCA6\uDCA9-\uDCAC\uDCAE-\uDCB9\uDCBB\uDCBD-\uDCC3\uDCC5-\uDD05\uDD07-\uDD0A\uDD0D-\uDD14\uDD16-\uDD1C\uDD1E-\uDD39\uDD3B-\uDD3E\uDD40-\uDD44\uDD46\uDD4A-\uDD50\uDD52-\uDEA5\uDEA8-\uDEC0\uDEC2-\uDEDA\uDEDC-\uDEFA\uDEFC-\uDF14\uDF16-\uDF34\uDF36-\uDF4E\uDF50-\uDF6E\uDF70-\uDF88\uDF8A-\uDFA8\uDFAA-\uDFC2\uDFC4-\uDFCB\uDFCE-\uDFFF]|\uD836[\uDE00-\uDE36\uDE3B-\uDE6C\uDE75\uDE84\uDE9B-\uDE9F\uDEA1-\uDEAF]|\uD83A[\uDC00-\uDCC4\uDCD0-\uDCD6]|\uD83B[\uDE00-\uDE03\uDE05-\uDE1F\uDE21\uDE22\uDE24\uDE27\uDE29-\uDE32\uDE34-\uDE37\uDE39\uDE3B\uDE42\uDE47\uDE49\uDE4B\uDE4D-\uDE4F\uDE51\uDE52\uDE54\uDE57\uDE59\uDE5B\uDE5D\uDE5F\uDE61\uDE62\uDE64\uDE67-\uDE6A\uDE6C-\uDE72\uDE74-\uDE77\uDE79-\uDE7C\uDE7E\uDE80-\uDE89\uDE8B-\uDE9B\uDEA1-\uDEA3\uDEA5-\uDEA9\uDEAB-\uDEBB]|\uD869[\uDC00-\uDED6\uDF00-\uDFFF]|\uD86D[\uDC00-\uDF34\uDF40-\uDFFF]|\uD86E[\uDC00-\uDC1D\uDC20-\uDFFF]|\uD873[\uDC00-\uDEA1]|\uD87E[\uDC00-\uDE1D]|\uDB40[\uDD00-\uDDEF]/ 966 }; 967 exports.Character = { 968 /* tslint:disable:no-bitwise */ 969 fromCodePoint: function (cp) { 970 return (cp < 0x10000) ? String.fromCharCode(cp) : 971 String.fromCharCode(0xD800 + ((cp - 0x10000) >> 10)) + 972 String.fromCharCode(0xDC00 + ((cp - 0x10000) & 1023)); 973 }, 974 // https://tc39.github.io/ecma262/#sec-white-space 975 isWhiteSpace: function (cp) { 976 return (cp === 0x20) || (cp === 0x09) || (cp === 0x0B) || (cp === 0x0C) || (cp === 0xA0) || 977 (cp >= 0x1680 && [0x1680, 0x2000, 0x2001, 0x2002, 0x2003, 0x2004, 0x2005, 0x2006, 0x2007, 0x2008, 0x2009, 0x200A, 0x202F, 0x205F, 0x3000, 0xFEFF].indexOf(cp) >= 0); 978 }, 979 // https://tc39.github.io/ecma262/#sec-line-terminators 980 isLineTerminator: function (cp) { 981 return (cp === 0x0A) || (cp === 0x0D) || (cp === 0x2028) || (cp === 0x2029); 982 }, 983 // https://tc39.github.io/ecma262/#sec-names-and-keywords 984 isIdentifierStart: function (cp) { 985 return (cp === 0x24) || (cp === 0x5F) || 986 (cp >= 0x41 && cp <= 0x5A) || 987 (cp >= 0x61 && cp <= 0x7A) || 988 (cp === 0x5C) || 989 ((cp >= 0x80) && Regex.NonAsciiIdentifierStart.test(exports.Character.fromCodePoint(cp))); 990 }, 991 isIdentifierPart: function (cp) { 992 return (cp === 0x24) || (cp === 0x5F) || 993 (cp >= 0x41 && cp <= 0x5A) || 994 (cp >= 0x61 && cp <= 0x7A) || 995 (cp >= 0x30 && cp <= 0x39) || 996 (cp === 0x5C) || 997 ((cp >= 0x80) && Regex.NonAsciiIdentifierPart.test(exports.Character.fromCodePoint(cp))); 998 }, 999 // https://tc39.github.io/ecma262/#sec-literals-numeric-literals 1000 isDecimalDigit: function (cp) { 1001 return (cp >= 0x30 && cp <= 0x39); // 0..9 1002 }, 1003 isHexDigit: function (cp) { 1004 return (cp >= 0x30 && cp <= 0x39) || 1005 (cp >= 0x41 && cp <= 0x46) || 1006 (cp >= 0x61 && cp <= 0x66); // a..f 1007 }, 1008 isOctalDigit: function (cp) { 1009 return (cp >= 0x30 && cp <= 0x37); // 0..7 1010 } 1011 }; 1012 1013 1014 /***/ }, 1015 /* 5 */ 1016 /***/ function(module, exports, __webpack_require__) { 1017 1018 "use strict"; 1019 Object.defineProperty(exports, "__esModule", { value: true }); 1020 var jsx_syntax_1 = __webpack_require__(6); 1021 /* tslint:disable:max-classes-per-file */ 1022 var JSXClosingElement = (function () { 1023 function JSXClosingElement(name) { 1024 this.type = jsx_syntax_1.JSXSyntax.JSXClosingElement; 1025 this.name = name; 1026 } 1027 return JSXClosingElement; 1028 }()); 1029 exports.JSXClosingElement = JSXClosingElement; 1030 var JSXElement = (function () { 1031 function JSXElement(openingElement, children, closingElement) { 1032 this.type = jsx_syntax_1.JSXSyntax.JSXElement; 1033 this.openingElement = openingElement; 1034 this.children = children; 1035 this.closingElement = closingElement; 1036 } 1037 return JSXElement; 1038 }()); 1039 exports.JSXElement = JSXElement; 1040 var JSXEmptyExpression = (function () { 1041 function JSXEmptyExpression() { 1042 this.type = jsx_syntax_1.JSXSyntax.JSXEmptyExpression; 1043 } 1044 return JSXEmptyExpression; 1045 }()); 1046 exports.JSXEmptyExpression = JSXEmptyExpression; 1047 var JSXExpressionContainer = (function () { 1048 function JSXExpressionContainer(expression) { 1049 this.type = jsx_syntax_1.JSXSyntax.JSXExpressionContainer; 1050 this.expression = expression; 1051 } 1052 return JSXExpressionContainer; 1053 }()); 1054 exports.JSXExpressionContainer = JSXExpressionContainer; 1055 var JSXIdentifier = (function () { 1056 function JSXIdentifier(name) { 1057 this.type = jsx_syntax_1.JSXSyntax.JSXIdentifier; 1058 this.name = name; 1059 } 1060 return JSXIdentifier; 1061 }()); 1062 exports.JSXIdentifier = JSXIdentifier; 1063 var JSXMemberExpression = (function () { 1064 function JSXMemberExpression(object, property) { 1065 this.type = jsx_syntax_1.JSXSyntax.JSXMemberExpression; 1066 this.object = object; 1067 this.property = property; 1068 } 1069 return JSXMemberExpression; 1070 }()); 1071 exports.JSXMemberExpression = JSXMemberExpression; 1072 var JSXAttribute = (function () { 1073 function JSXAttribute(name, value) { 1074 this.type = jsx_syntax_1.JSXSyntax.JSXAttribute; 1075 this.name = name; 1076 this.value = value; 1077 } 1078 return JSXAttribute; 1079 }()); 1080 exports.JSXAttribute = JSXAttribute; 1081 var JSXNamespacedName = (function () { 1082 function JSXNamespacedName(namespace, name) { 1083 this.type = jsx_syntax_1.JSXSyntax.JSXNamespacedName; 1084 this.namespace = namespace; 1085 this.name = name; 1086 } 1087 return JSXNamespacedName; 1088 }()); 1089 exports.JSXNamespacedName = JSXNamespacedName; 1090 var JSXOpeningElement = (function () { 1091 function JSXOpeningElement(name, selfClosing, attributes) { 1092 this.type = jsx_syntax_1.JSXSyntax.JSXOpeningElement; 1093 this.name = name; 1094 this.selfClosing = selfClosing; 1095 this.attributes = attributes; 1096 } 1097 return JSXOpeningElement; 1098 }()); 1099 exports.JSXOpeningElement = JSXOpeningElement; 1100 var JSXSpreadAttribute = (function () { 1101 function JSXSpreadAttribute(argument) { 1102 this.type = jsx_syntax_1.JSXSyntax.JSXSpreadAttribute; 1103 this.argument = argument; 1104 } 1105 return JSXSpreadAttribute; 1106 }()); 1107 exports.JSXSpreadAttribute = JSXSpreadAttribute; 1108 var JSXText = (function () { 1109 function JSXText(value, raw) { 1110 this.type = jsx_syntax_1.JSXSyntax.JSXText; 1111 this.value = value; 1112 this.raw = raw; 1113 } 1114 return JSXText; 1115 }()); 1116 exports.JSXText = JSXText; 1117 1118 1119 /***/ }, 1120 /* 6 */ 1121 /***/ function(module, exports) { 1122 1123 "use strict"; 1124 Object.defineProperty(exports, "__esModule", { value: true }); 1125 exports.JSXSyntax = { 1126 JSXAttribute: 'JSXAttribute', 1127 JSXClosingElement: 'JSXClosingElement', 1128 JSXElement: 'JSXElement', 1129 JSXEmptyExpression: 'JSXEmptyExpression', 1130 JSXExpressionContainer: 'JSXExpressionContainer', 1131 JSXIdentifier: 'JSXIdentifier', 1132 JSXMemberExpression: 'JSXMemberExpression', 1133 JSXNamespacedName: 'JSXNamespacedName', 1134 JSXOpeningElement: 'JSXOpeningElement', 1135 JSXSpreadAttribute: 'JSXSpreadAttribute', 1136 JSXText: 'JSXText' 1137 }; 1138 1139 1140 /***/ }, 1141 /* 7 */ 1142 /***/ function(module, exports, __webpack_require__) { 1143 1144 "use strict"; 1145 Object.defineProperty(exports, "__esModule", { value: true }); 1146 var syntax_1 = __webpack_require__(2); 1147 /* tslint:disable:max-classes-per-file */ 1148 var ArrayExpression = (function () { 1149 function ArrayExpression(elements) { 1150 this.type = syntax_1.Syntax.ArrayExpression; 1151 this.elements = elements; 1152 } 1153 return ArrayExpression; 1154 }()); 1155 exports.ArrayExpression = ArrayExpression; 1156 var ArrayPattern = (function () { 1157 function ArrayPattern(elements) { 1158 this.type = syntax_1.Syntax.ArrayPattern; 1159 this.elements = elements; 1160 } 1161 return ArrayPattern; 1162 }()); 1163 exports.ArrayPattern = ArrayPattern; 1164 var ArrowFunctionExpression = (function () { 1165 function ArrowFunctionExpression(params, body, expression) { 1166 this.type = syntax_1.Syntax.ArrowFunctionExpression; 1167 this.id = null; 1168 this.params = params; 1169 this.body = body; 1170 this.generator = false; 1171 this.expression = expression; 1172 this.async = false; 1173 } 1174 return ArrowFunctionExpression; 1175 }()); 1176 exports.ArrowFunctionExpression = ArrowFunctionExpression; 1177 var AssignmentExpression = (function () { 1178 function AssignmentExpression(operator, left, right) { 1179 this.type = syntax_1.Syntax.AssignmentExpression; 1180 this.operator = operator; 1181 this.left = left; 1182 this.right = right; 1183 } 1184 return AssignmentExpression; 1185 }()); 1186 exports.AssignmentExpression = AssignmentExpression; 1187 var AssignmentPattern = (function () { 1188 function AssignmentPattern(left, right) { 1189 this.type = syntax_1.Syntax.AssignmentPattern; 1190 this.left = left; 1191 this.right = right; 1192 } 1193 return AssignmentPattern; 1194 }()); 1195 exports.AssignmentPattern = AssignmentPattern; 1196 var AsyncArrowFunctionExpression = (function () { 1197 function AsyncArrowFunctionExpression(params, body, expression) { 1198 this.type = syntax_1.Syntax.ArrowFunctionExpression; 1199 this.id = null; 1200 this.params = params; 1201 this.body = body; 1202 this.generator = false; 1203 this.expression = expression; 1204 this.async = true; 1205 } 1206 return AsyncArrowFunctionExpression; 1207 }()); 1208 exports.AsyncArrowFunctionExpression = AsyncArrowFunctionExpression; 1209 var AsyncFunctionDeclaration = (function () { 1210 function AsyncFunctionDeclaration(id, params, body) { 1211 this.type = syntax_1.Syntax.FunctionDeclaration; 1212 this.id = id; 1213 this.params = params; 1214 this.body = body; 1215 this.generator = false; 1216 this.expression = false; 1217 this.async = true; 1218 } 1219 return AsyncFunctionDeclaration; 1220 }()); 1221 exports.AsyncFunctionDeclaration = AsyncFunctionDeclaration; 1222 var AsyncFunctionExpression = (function () { 1223 function AsyncFunctionExpression(id, params, body) { 1224 this.type = syntax_1.Syntax.FunctionExpression; 1225 this.id = id; 1226 this.params = params; 1227 this.body = body; 1228 this.generator = false; 1229 this.expression = false; 1230 this.async = true; 1231 } 1232 return AsyncFunctionExpression; 1233 }()); 1234 exports.AsyncFunctionExpression = AsyncFunctionExpression; 1235 var AwaitExpression = (function () { 1236 function AwaitExpression(argument) { 1237 this.type = syntax_1.Syntax.AwaitExpression; 1238 this.argument = argument; 1239 } 1240 return AwaitExpression; 1241 }()); 1242 exports.AwaitExpression = AwaitExpression; 1243 var BinaryExpression = (function () { 1244 function BinaryExpression(operator, left, right) { 1245 var logical = (operator === '||' || operator === '&&'); 1246 this.type = logical ? syntax_1.Syntax.LogicalExpression : syntax_1.Syntax.BinaryExpression; 1247 this.operator = operator; 1248 this.left = left; 1249 this.right = right; 1250 } 1251 return BinaryExpression; 1252 }()); 1253 exports.BinaryExpression = BinaryExpression; 1254 var BlockStatement = (function () { 1255 function BlockStatement(body) { 1256 this.type = syntax_1.Syntax.BlockStatement; 1257 this.body = body; 1258 } 1259 return BlockStatement; 1260 }()); 1261 exports.BlockStatement = BlockStatement; 1262 var BreakStatement = (function () { 1263 function BreakStatement(label) { 1264 this.type = syntax_1.Syntax.BreakStatement; 1265 this.label = label; 1266 } 1267 return BreakStatement; 1268 }()); 1269 exports.BreakStatement = BreakStatement; 1270 var CallExpression = (function () { 1271 function CallExpression(callee, args) { 1272 this.type = syntax_1.Syntax.CallExpression; 1273 this.callee = callee; 1274 this.arguments = args; 1275 } 1276 return CallExpression; 1277 }()); 1278 exports.CallExpression = CallExpression; 1279 var CatchClause = (function () { 1280 function CatchClause(param, body) { 1281 this.type = syntax_1.Syntax.CatchClause; 1282 this.param = param; 1283 this.body = body; 1284 } 1285 return CatchClause; 1286 }()); 1287 exports.CatchClause = CatchClause; 1288 var ClassBody = (function () { 1289 function ClassBody(body) { 1290 this.type = syntax_1.Syntax.ClassBody; 1291 this.body = body; 1292 } 1293 return ClassBody; 1294 }()); 1295 exports.ClassBody = ClassBody; 1296 var ClassDeclaration = (function () { 1297 function ClassDeclaration(id, superClass, body) { 1298 this.type = syntax_1.Syntax.ClassDeclaration; 1299 this.id = id; 1300 this.superClass = superClass; 1301 this.body = body; 1302 } 1303 return ClassDeclaration; 1304 }()); 1305 exports.ClassDeclaration = ClassDeclaration; 1306 var ClassExpression = (function () { 1307 function ClassExpression(id, superClass, body) { 1308 this.type = syntax_1.Syntax.ClassExpression; 1309 this.id = id; 1310 this.superClass = superClass; 1311 this.body = body; 1312 } 1313 return ClassExpression; 1314 }()); 1315 exports.ClassExpression = ClassExpression; 1316 var ComputedMemberExpression = (function () { 1317 function ComputedMemberExpression(object, property) { 1318 this.type = syntax_1.Syntax.MemberExpression; 1319 this.computed = true; 1320 this.object = object; 1321 this.property = property; 1322 } 1323 return ComputedMemberExpression; 1324 }()); 1325 exports.ComputedMemberExpression = ComputedMemberExpression; 1326 var ConditionalExpression = (function () { 1327 function ConditionalExpression(test, consequent, alternate) { 1328 this.type = syntax_1.Syntax.ConditionalExpression; 1329 this.test = test; 1330 this.consequent = consequent; 1331 this.alternate = alternate; 1332 } 1333 return ConditionalExpression; 1334 }()); 1335 exports.ConditionalExpression = ConditionalExpression; 1336 var ContinueStatement = (function () { 1337 function ContinueStatement(label) { 1338 this.type = syntax_1.Syntax.ContinueStatement; 1339 this.label = label; 1340 } 1341 return ContinueStatement; 1342 }()); 1343 exports.ContinueStatement = ContinueStatement; 1344 var DebuggerStatement = (function () { 1345 function DebuggerStatement() { 1346 this.type = syntax_1.Syntax.DebuggerStatement; 1347 } 1348 return DebuggerStatement; 1349 }()); 1350 exports.DebuggerStatement = DebuggerStatement; 1351 var Directive = (function () { 1352 function Directive(expression, directive) { 1353 this.type = syntax_1.Syntax.ExpressionStatement; 1354 this.expression = expression; 1355 this.directive = directive; 1356 } 1357 return Directive; 1358 }()); 1359 exports.Directive = Directive; 1360 var DoWhileStatement = (function () { 1361 function DoWhileStatement(body, test) { 1362 this.type = syntax_1.Syntax.DoWhileStatement; 1363 this.body = body; 1364 this.test = test; 1365 } 1366 return DoWhileStatement; 1367 }()); 1368 exports.DoWhileStatement = DoWhileStatement; 1369 var EmptyStatement = (function () { 1370 function EmptyStatement() { 1371 this.type = syntax_1.Syntax.EmptyStatement; 1372 } 1373 return EmptyStatement; 1374 }()); 1375 exports.EmptyStatement = EmptyStatement; 1376 var ExportAllDeclaration = (function () { 1377 function ExportAllDeclaration(source) { 1378 this.type = syntax_1.Syntax.ExportAllDeclaration; 1379 this.source = source; 1380 } 1381 return ExportAllDeclaration; 1382 }()); 1383 exports.ExportAllDeclaration = ExportAllDeclaration; 1384 var ExportDefaultDeclaration = (function () { 1385 function ExportDefaultDeclaration(declaration) { 1386 this.type = syntax_1.Syntax.ExportDefaultDeclaration; 1387 this.declaration = declaration; 1388 } 1389 return ExportDefaultDeclaration; 1390 }()); 1391 exports.ExportDefaultDeclaration = ExportDefaultDeclaration; 1392 var ExportNamedDeclaration = (function () { 1393 function ExportNamedDeclaration(declaration, specifiers, source) { 1394 this.type = syntax_1.Syntax.ExportNamedDeclaration; 1395 this.declaration = declaration; 1396 this.specifiers = specifiers; 1397 this.source = source; 1398 } 1399 return ExportNamedDeclaration; 1400 }()); 1401 exports.ExportNamedDeclaration = ExportNamedDeclaration; 1402 var ExportSpecifier = (function () { 1403 function ExportSpecifier(local, exported) { 1404 this.type = syntax_1.Syntax.ExportSpecifier; 1405 this.exported = exported; 1406 this.local = local; 1407 } 1408 return ExportSpecifier; 1409 }()); 1410 exports.ExportSpecifier = ExportSpecifier; 1411 var ExpressionStatement = (function () { 1412 function ExpressionStatement(expression) { 1413 this.type = syntax_1.Syntax.ExpressionStatement; 1414 this.expression = expression; 1415 } 1416 return ExpressionStatement; 1417 }()); 1418 exports.ExpressionStatement = ExpressionStatement; 1419 var ForInStatement = (function () { 1420 function ForInStatement(left, right, body) { 1421 this.type = syntax_1.Syntax.ForInStatement; 1422 this.left = left; 1423 this.right = right; 1424 this.body = body; 1425 this.each = false; 1426 } 1427 return ForInStatement; 1428 }()); 1429 exports.ForInStatement = ForInStatement; 1430 var ForOfStatement = (function () { 1431 function ForOfStatement(left, right, body) { 1432 this.type = syntax_1.Syntax.ForOfStatement; 1433 this.left = left; 1434 this.right = right; 1435 this.body = body; 1436 } 1437 return ForOfStatement; 1438 }()); 1439 exports.ForOfStatement = ForOfStatement; 1440 var ForStatement = (function () { 1441 function ForStatement(init, test, update, body) { 1442 this.type = syntax_1.Syntax.ForStatement; 1443 this.init = init; 1444 this.test = test; 1445 this.update = update; 1446 this.body = body; 1447 } 1448 return ForStatement; 1449 }()); 1450 exports.ForStatement = ForStatement; 1451 var FunctionDeclaration = (function () { 1452 function FunctionDeclaration(id, params, body, generator) { 1453 this.type = syntax_1.Syntax.FunctionDeclaration; 1454 this.id = id; 1455 this.params = params; 1456 this.body = body; 1457 this.generator = generator; 1458 this.expression = false; 1459 this.async = false; 1460 } 1461 return FunctionDeclaration; 1462 }()); 1463 exports.FunctionDeclaration = FunctionDeclaration; 1464 var FunctionExpression = (function () { 1465 function FunctionExpression(id, params, body, generator) { 1466 this.type = syntax_1.Syntax.FunctionExpression; 1467 this.id = id; 1468 this.params = params; 1469 this.body = body; 1470 this.generator = generator; 1471 this.expression = false; 1472 this.async = false; 1473 } 1474 return FunctionExpression; 1475 }()); 1476 exports.FunctionExpression = FunctionExpression; 1477 var Identifier = (function () { 1478 function Identifier(name) { 1479 this.type = syntax_1.Syntax.Identifier; 1480 this.name = name; 1481 } 1482 return Identifier; 1483 }()); 1484 exports.Identifier = Identifier; 1485 var IfStatement = (function () { 1486 function IfStatement(test, consequent, alternate) { 1487 this.type = syntax_1.Syntax.IfStatement; 1488 this.test = test; 1489 this.consequent = consequent; 1490 this.alternate = alternate; 1491 } 1492 return IfStatement; 1493 }()); 1494 exports.IfStatement = IfStatement; 1495 var ImportDeclaration = (function () { 1496 function ImportDeclaration(specifiers, source) { 1497 this.type = syntax_1.Syntax.ImportDeclaration; 1498 this.specifiers = specifiers; 1499 this.source = source; 1500 } 1501 return ImportDeclaration; 1502 }()); 1503 exports.ImportDeclaration = ImportDeclaration; 1504 var ImportDefaultSpecifier = (function () { 1505 function ImportDefaultSpecifier(local) { 1506 this.type = syntax_1.Syntax.ImportDefaultSpecifier; 1507 this.local = local; 1508 } 1509 return ImportDefaultSpecifier; 1510 }()); 1511 exports.ImportDefaultSpecifier = ImportDefaultSpecifier; 1512 var ImportNamespaceSpecifier = (function () { 1513 function ImportNamespaceSpecifier(local) { 1514 this.type = syntax_1.Syntax.ImportNamespaceSpecifier; 1515 this.local = local; 1516 } 1517 return ImportNamespaceSpecifier; 1518 }()); 1519 exports.ImportNamespaceSpecifier = ImportNamespaceSpecifier; 1520 var ImportSpecifier = (function () { 1521 function ImportSpecifier(local, imported) { 1522 this.type = syntax_1.Syntax.ImportSpecifier; 1523 this.local = local; 1524 this.imported = imported; 1525 } 1526 return ImportSpecifier; 1527 }()); 1528 exports.ImportSpecifier = ImportSpecifier; 1529 var LabeledStatement = (function () { 1530 function LabeledStatement(label, body) { 1531 this.type = syntax_1.Syntax.LabeledStatement; 1532 this.label = label; 1533 this.body = body; 1534 } 1535 return LabeledStatement; 1536 }()); 1537 exports.LabeledStatement = LabeledStatement; 1538 var Literal = (function () { 1539 function Literal(value, raw) { 1540 this.type = syntax_1.Syntax.Literal; 1541 this.value = value; 1542 this.raw = raw; 1543 } 1544 return Literal; 1545 }()); 1546 exports.Literal = Literal; 1547 var MetaProperty = (function () { 1548 function MetaProperty(meta, property) { 1549 this.type = syntax_1.Syntax.MetaProperty; 1550 this.meta = meta; 1551 this.property = property; 1552 } 1553 return MetaProperty; 1554 }()); 1555 exports.MetaProperty = MetaProperty; 1556 var MethodDefinition = (function () { 1557 function MethodDefinition(key, computed, value, kind, isStatic) { 1558 this.type = syntax_1.Syntax.MethodDefinition; 1559 this.key = key; 1560 this.computed = computed; 1561 this.value = value; 1562 this.kind = kind; 1563 this.static = isStatic; 1564 } 1565 return MethodDefinition; 1566 }()); 1567 exports.MethodDefinition = MethodDefinition; 1568 var Module = (function () { 1569 function Module(body) { 1570 this.type = syntax_1.Syntax.Program; 1571 this.body = body; 1572 this.sourceType = 'module'; 1573 } 1574 return Module; 1575 }()); 1576 exports.Module = Module; 1577 var NewExpression = (function () { 1578 function NewExpression(callee, args) { 1579 this.type = syntax_1.Syntax.NewExpression; 1580 this.callee = callee; 1581 this.arguments = args; 1582 } 1583 return NewExpression; 1584 }()); 1585 exports.NewExpression = NewExpression; 1586 var ObjectExpression = (function () { 1587 function ObjectExpression(properties) { 1588 this.type = syntax_1.Syntax.ObjectExpression; 1589 this.properties = properties; 1590 } 1591 return ObjectExpression; 1592 }()); 1593 exports.ObjectExpression = ObjectExpression; 1594 var ObjectPattern = (function () { 1595 function ObjectPattern(properties) { 1596 this.type = syntax_1.Syntax.ObjectPattern; 1597 this.properties = properties; 1598 } 1599 return ObjectPattern; 1600 }()); 1601 exports.ObjectPattern = ObjectPattern; 1602 var Property = (function () { 1603 function Property(kind, key, computed, value, method, shorthand) { 1604 this.type = syntax_1.Syntax.Property; 1605 this.key = key; 1606 this.computed = computed; 1607 this.value = value; 1608 this.kind = kind; 1609 this.method = method; 1610 this.shorthand = shorthand; 1611 } 1612 return Property; 1613 }()); 1614 exports.Property = Property; 1615 var RegexLiteral = (function () { 1616 function RegexLiteral(value, raw, pattern, flags) { 1617 this.type = syntax_1.Syntax.Literal; 1618 this.value = value; 1619 this.raw = raw; 1620 this.regex = { pattern: pattern, flags: flags }; 1621 } 1622 return RegexLiteral; 1623 }()); 1624 exports.RegexLiteral = RegexLiteral; 1625 var RestElement = (function () { 1626 function RestElement(argument) { 1627 this.type = syntax_1.Syntax.RestElement; 1628 this.argument = argument; 1629 } 1630 return RestElement; 1631 }()); 1632 exports.RestElement = RestElement; 1633 var ReturnStatement = (function () { 1634 function ReturnStatement(argument) { 1635 this.type = syntax_1.Syntax.ReturnStatement; 1636 this.argument = argument; 1637 } 1638 return ReturnStatement; 1639 }()); 1640 exports.ReturnStatement = ReturnStatement; 1641 var Script = (function () { 1642 function Script(body) { 1643 this.type = syntax_1.Syntax.Program; 1644 this.body = body; 1645 this.sourceType = 'script'; 1646 } 1647 return Script; 1648 }()); 1649 exports.Script = Script; 1650 var SequenceExpression = (function () { 1651 function SequenceExpression(expressions) { 1652 this.type = syntax_1.Syntax.SequenceExpression; 1653 this.expressions = expressions; 1654 } 1655 return SequenceExpression; 1656 }()); 1657 exports.SequenceExpression = SequenceExpression; 1658 var SpreadElement = (function () { 1659 function SpreadElement(argument) { 1660 this.type = syntax_1.Syntax.SpreadElement; 1661 this.argument = argument; 1662 } 1663 return SpreadElement; 1664 }()); 1665 exports.SpreadElement = SpreadElement; 1666 var StaticMemberExpression = (function () { 1667 function StaticMemberExpression(object, property) { 1668 this.type = syntax_1.Syntax.MemberExpression; 1669 this.computed = false; 1670 this.object = object; 1671 this.property = property; 1672 } 1673 return StaticMemberExpression; 1674 }()); 1675 exports.StaticMemberExpression = StaticMemberExpression; 1676 var Super = (function () { 1677 function Super() { 1678 this.type = syntax_1.Syntax.Super; 1679 } 1680 return Super; 1681 }()); 1682 exports.Super = Super; 1683 var SwitchCase = (function () { 1684 function SwitchCase(test, consequent) { 1685 this.type = syntax_1.Syntax.SwitchCase; 1686 this.test = test; 1687 this.consequent = consequent; 1688 } 1689 return SwitchCase; 1690 }()); 1691 exports.SwitchCase = SwitchCase; 1692 var SwitchStatement = (function () { 1693 function SwitchStatement(discriminant, cases) { 1694 this.type = syntax_1.Syntax.SwitchStatement; 1695 this.discriminant = discriminant; 1696 this.cases = cases; 1697 } 1698 return SwitchStatement; 1699 }()); 1700 exports.SwitchStatement = SwitchStatement; 1701 var TaggedTemplateExpression = (function () { 1702 function TaggedTemplateExpression(tag, quasi) { 1703 this.type = syntax_1.Syntax.TaggedTemplateExpression; 1704 this.tag = tag; 1705 this.quasi = quasi; 1706 } 1707 return TaggedTemplateExpression; 1708 }()); 1709 exports.TaggedTemplateExpression = TaggedTemplateExpression; 1710 var TemplateElement = (function () { 1711 function TemplateElement(value, tail) { 1712 this.type = syntax_1.Syntax.TemplateElement; 1713 this.value = value; 1714 this.tail = tail; 1715 } 1716 return TemplateElement; 1717 }()); 1718 exports.TemplateElement = TemplateElement; 1719 var TemplateLiteral = (function () { 1720 function TemplateLiteral(quasis, expressions) { 1721 this.type = syntax_1.Syntax.TemplateLiteral; 1722 this.quasis = quasis; 1723 this.expressions = expressions; 1724 } 1725 return TemplateLiteral; 1726 }()); 1727 exports.TemplateLiteral = TemplateLiteral; 1728 var ThisExpression = (function () { 1729 function ThisExpression() { 1730 this.type = syntax_1.Syntax.ThisExpression; 1731 } 1732 return ThisExpression; 1733 }()); 1734 exports.ThisExpression = ThisExpression; 1735 var ThrowStatement = (function () { 1736 function ThrowStatement(argument) { 1737 this.type = syntax_1.Syntax.ThrowStatement; 1738 this.argument = argument; 1739 } 1740 return ThrowStatement; 1741 }()); 1742 exports.ThrowStatement = ThrowStatement; 1743 var TryStatement = (function () { 1744 function TryStatement(block, handler, finalizer) { 1745 this.type = syntax_1.Syntax.TryStatement; 1746 this.block = block; 1747 this.handler = handler; 1748 this.finalizer = finalizer; 1749 } 1750 return TryStatement; 1751 }()); 1752 exports.TryStatement = TryStatement; 1753 var UnaryExpression = (function () { 1754 function UnaryExpression(operator, argument) { 1755 this.type = syntax_1.Syntax.UnaryExpression; 1756 this.operator = operator; 1757 this.argument = argument; 1758 this.prefix = true; 1759 } 1760 return UnaryExpression; 1761 }()); 1762 exports.UnaryExpression = UnaryExpression; 1763 var UpdateExpression = (function () { 1764 function UpdateExpression(operator, argument, prefix) { 1765 this.type = syntax_1.Syntax.UpdateExpression; 1766 this.operator = operator; 1767 this.argument = argument; 1768 this.prefix = prefix; 1769 } 1770 return UpdateExpression; 1771 }()); 1772 exports.UpdateExpression = UpdateExpression; 1773 var VariableDeclaration = (function () { 1774 function VariableDeclaration(declarations, kind) { 1775 this.type = syntax_1.Syntax.VariableDeclaration; 1776 this.declarations = declarations; 1777 this.kind = kind; 1778 } 1779 return VariableDeclaration; 1780 }()); 1781 exports.VariableDeclaration = VariableDeclaration; 1782 var VariableDeclarator = (function () { 1783 function VariableDeclarator(id, init) { 1784 this.type = syntax_1.Syntax.VariableDeclarator; 1785 this.id = id; 1786 this.init = init; 1787 } 1788 return VariableDeclarator; 1789 }()); 1790 exports.VariableDeclarator = VariableDeclarator; 1791 var WhileStatement = (function () { 1792 function WhileStatement(test, body) { 1793 this.type = syntax_1.Syntax.WhileStatement; 1794 this.test = test; 1795 this.body = body; 1796 } 1797 return WhileStatement; 1798 }()); 1799 exports.WhileStatement = WhileStatement; 1800 var WithStatement = (function () { 1801 function WithStatement(object, body) { 1802 this.type = syntax_1.Syntax.WithStatement; 1803 this.object = object; 1804 this.body = body; 1805 } 1806 return WithStatement; 1807 }()); 1808 exports.WithStatement = WithStatement; 1809 var YieldExpression = (function () { 1810 function YieldExpression(argument, delegate) { 1811 this.type = syntax_1.Syntax.YieldExpression; 1812 this.argument = argument; 1813 this.delegate = delegate; 1814 } 1815 return YieldExpression; 1816 }()); 1817 exports.YieldExpression = YieldExpression; 1818 1819 1820 /***/ }, 1821 /* 8 */ 1822 /***/ function(module, exports, __webpack_require__) { 1823 1824 "use strict"; 1825 Object.defineProperty(exports, "__esModule", { value: true }); 1826 var assert_1 = __webpack_require__(9); 1827 var error_handler_1 = __webpack_require__(10); 1828 var messages_1 = __webpack_require__(11); 1829 var Node = __webpack_require__(7); 1830 var scanner_1 = __webpack_require__(12); 1831 var syntax_1 = __webpack_require__(2); 1832 var token_1 = __webpack_require__(13); 1833 var ArrowParameterPlaceHolder = 'ArrowParameterPlaceHolder'; 1834 var Parser = (function () { 1835 function Parser(code, options, delegate) { 1836 if (options === void 0) { options = {}; } 1837 this.config = { 1838 range: (typeof options.range === 'boolean') && options.range, 1839 loc: (typeof options.loc === 'boolean') && options.loc, 1840 source: null, 1841 tokens: (typeof options.tokens === 'boolean') && options.tokens, 1842 comment: (typeof options.comment === 'boolean') && options.comment, 1843 tolerant: (typeof options.tolerant === 'boolean') && options.tolerant 1844 }; 1845 if (this.config.loc && options.source && options.source !== null) { 1846 this.config.source = String(options.source); 1847 } 1848 this.delegate = delegate; 1849 this.errorHandler = new error_handler_1.ErrorHandler(); 1850 this.errorHandler.tolerant = this.config.tolerant; 1851 this.scanner = new scanner_1.Scanner(code, this.errorHandler); 1852 this.scanner.trackComment = this.config.comment; 1853 this.operatorPrecedence = { 1854 ')': 0, 1855 ';': 0, 1856 ',': 0, 1857 '=': 0, 1858 ']': 0, 1859 '||': 1, 1860 '&&': 2, 1861 '|': 3, 1862 '^': 4, 1863 '&': 5, 1864 '==': 6, 1865 '!=': 6, 1866 '===': 6, 1867 '!==': 6, 1868 '<': 7, 1869 '>': 7, 1870 '<=': 7, 1871 '>=': 7, 1872 '<<': 8, 1873 '>>': 8, 1874 '>>>': 8, 1875 '+': 9, 1876 '-': 9, 1877 '*': 11, 1878 '/': 11, 1879 '%': 11 1880 }; 1881 this.lookahead = { 1882 type: 2 /* EOF */, 1883 value: '', 1884 lineNumber: this.scanner.lineNumber, 1885 lineStart: 0, 1886 start: 0, 1887 end: 0 1888 }; 1889 this.hasLineTerminator = false; 1890 this.context = { 1891 isModule: false, 1892 await: false, 1893 allowIn: true, 1894 allowStrictDirective: true, 1895 allowYield: true, 1896 firstCoverInitializedNameError: null, 1897 isAssignmentTarget: false, 1898 isBindingElement: false, 1899 inFunctionBody: false, 1900 inIteration: false, 1901 inSwitch: false, 1902 labelSet: {}, 1903 strict: false 1904 }; 1905 this.tokens = []; 1906 this.startMarker = { 1907 index: 0, 1908 line: this.scanner.lineNumber, 1909 column: 0 1910 }; 1911 this.lastMarker = { 1912 index: 0, 1913 line: this.scanner.lineNumber, 1914 column: 0 1915 }; 1916 this.nextToken(); 1917 this.lastMarker = { 1918 index: this.scanner.index, 1919 line: this.scanner.lineNumber, 1920 column: this.scanner.index - this.scanner.lineStart 1921 }; 1922 } 1923 Parser.prototype.throwError = function (messageFormat) { 1924 var values = []; 1925 for (var _i = 1; _i < arguments.length; _i++) { 1926 values[_i - 1] = arguments[_i]; 1927 } 1928 var args = Array.prototype.slice.call(arguments, 1); 1929 var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { 1930 assert_1.assert(idx < args.length, 'Message reference must be in range'); 1931 return args[idx]; 1932 }); 1933 var index = this.lastMarker.index; 1934 var line = this.lastMarker.line; 1935 var column = this.lastMarker.column + 1; 1936 throw this.errorHandler.createError(index, line, column, msg); 1937 }; 1938 Parser.prototype.tolerateError = function (messageFormat) { 1939 var values = []; 1940 for (var _i = 1; _i < arguments.length; _i++) { 1941 values[_i - 1] = arguments[_i]; 1942 } 1943 var args = Array.prototype.slice.call(arguments, 1); 1944 var msg = messageFormat.replace(/%(\d)/g, function (whole, idx) { 1945 assert_1.assert(idx < args.length, 'Message reference must be in range'); 1946 return args[idx]; 1947 }); 1948 var index = this.lastMarker.index; 1949 var line = this.scanner.lineNumber; 1950 var column = this.lastMarker.column + 1; 1951 this.errorHandler.tolerateError(index, line, column, msg); 1952 }; 1953 // Throw an exception because of the token. 1954 Parser.prototype.unexpectedTokenError = function (token, message) { 1955 var msg = message || messages_1.Messages.UnexpectedToken; 1956 var value; 1957 if (token) { 1958 if (!message) { 1959 msg = (token.type === 2 /* EOF */) ? messages_1.Messages.UnexpectedEOS : 1960 (token.type === 3 /* Identifier */) ? messages_1.Messages.UnexpectedIdentifier : 1961 (token.type === 6 /* NumericLiteral */) ? messages_1.Messages.UnexpectedNumber : 1962 (token.type === 8 /* StringLiteral */) ? messages_1.Messages.UnexpectedString : 1963 (token.type === 10 /* Template */) ? messages_1.Messages.UnexpectedTemplate : 1964 messages_1.Messages.UnexpectedToken; 1965 if (token.type === 4 /* Keyword */) { 1966 if (this.scanner.isFutureReservedWord(token.value)) { 1967 msg = messages_1.Messages.UnexpectedReserved; 1968 } 1969 else if (this.context.strict && this.scanner.isStrictModeReservedWord(token.value)) { 1970 msg = messages_1.Messages.StrictReservedWord; 1971 } 1972 } 1973 } 1974 value = token.value; 1975 } 1976 else { 1977 value = 'ILLEGAL'; 1978 } 1979 msg = msg.replace('%0', value); 1980 if (token && typeof token.lineNumber === 'number') { 1981 var index = token.start; 1982 var line = token.lineNumber; 1983 var lastMarkerLineStart = this.lastMarker.index - this.lastMarker.column; 1984 var column = token.start - lastMarkerLineStart + 1; 1985 return this.errorHandler.createError(index, line, column, msg); 1986 } 1987 else { 1988 var index = this.lastMarker.index; 1989 var line = this.lastMarker.line; 1990 var column = this.lastMarker.column + 1; 1991 return this.errorHandler.createError(index, line, column, msg); 1992 } 1993 }; 1994 Parser.prototype.throwUnexpectedToken = function (token, message) { 1995 throw this.unexpectedTokenError(token, message); 1996 }; 1997 Parser.prototype.tolerateUnexpectedToken = function (token, message) { 1998 this.errorHandler.tolerate(this.unexpectedTokenError(token, message)); 1999 }; 2000 Parser.prototype.collectComments = function () { 2001 if (!this.config.comment) { 2002 this.scanner.scanComments(); 2003 } 2004 else { 2005 var comments = this.scanner.scanComments(); 2006 if (comments.length > 0 && this.delegate) { 2007 for (var i = 0; i < comments.length; ++i) { 2008 var e = comments[i]; 2009 var node = void 0; 2010 node = { 2011 type: e.multiLine ? 'BlockComment' : 'LineComment', 2012 value: this.scanner.source.slice(e.slice[0], e.slice[1]) 2013 }; 2014 if (this.config.range) { 2015 node.range = e.range; 2016 } 2017 if (this.config.loc) { 2018 node.loc = e.loc; 2019 } 2020 var metadata = { 2021 start: { 2022 line: e.loc.start.line, 2023 column: e.loc.start.column, 2024 offset: e.range[0] 2025 }, 2026 end: { 2027 line: e.loc.end.line, 2028 column: e.loc.end.column, 2029 offset: e.range[1] 2030 } 2031 }; 2032 this.delegate(node, metadata); 2033 } 2034 } 2035 } 2036 }; 2037 // From internal representation to an external structure 2038 Parser.prototype.getTokenRaw = function (token) { 2039 return this.scanner.source.slice(token.start, token.end); 2040 }; 2041 Parser.prototype.convertToken = function (token) { 2042 var t = { 2043 type: token_1.TokenName[token.type], 2044 value: this.getTokenRaw(token) 2045 }; 2046 if (this.config.range) { 2047 t.range = [token.start, token.end]; 2048 } 2049 if (this.config.loc) { 2050 t.loc = { 2051 start: { 2052 line: this.startMarker.line, 2053 column: this.startMarker.column 2054 }, 2055 end: { 2056 line: this.scanner.lineNumber, 2057 column: this.scanner.index - this.scanner.lineStart 2058 } 2059 }; 2060 } 2061 if (token.type === 9 /* RegularExpression */) { 2062 var pattern = token.pattern; 2063 var flags = token.flags; 2064 t.regex = { pattern: pattern, flags: flags }; 2065 } 2066 return t; 2067 }; 2068 Parser.prototype.nextToken = function () { 2069 var token = this.lookahead; 2070 this.lastMarker.index = this.scanner.index; 2071 this.lastMarker.line = this.scanner.lineNumber; 2072 this.lastMarker.column = this.scanner.index - this.scanner.lineStart; 2073 this.collectComments(); 2074 if (this.scanner.index !== this.startMarker.index) { 2075 this.startMarker.index = this.scanner.index; 2076 this.startMarker.line = this.scanner.lineNumber; 2077 this.startMarker.column = this.scanner.index - this.scanner.lineStart; 2078 } 2079 var next = this.scanner.lex(); 2080 this.hasLineTerminator = (token.lineNumber !== next.lineNumber); 2081 if (next && this.context.strict && next.type === 3 /* Identifier */) { 2082 if (this.scanner.isStrictModeReservedWord(next.value)) { 2083 next.type = 4 /* Keyword */; 2084 } 2085 } 2086 this.lookahead = next; 2087 if (this.config.tokens && next.type !== 2 /* EOF */) { 2088 this.tokens.push(this.convertToken(next)); 2089 } 2090 return token; 2091 }; 2092 Parser.prototype.nextRegexToken = function () { 2093 this.collectComments(); 2094 var token = this.scanner.scanRegExp(); 2095 if (this.config.tokens) { 2096 // Pop the previous token, '/' or '/=' 2097 // This is added from the lookahead token. 2098 this.tokens.pop(); 2099 this.tokens.push(this.convertToken(token)); 2100 } 2101 // Prime the next lookahead. 2102 this.lookahead = token; 2103 this.nextToken(); 2104 return token; 2105 }; 2106 Parser.prototype.createNode = function () { 2107 return { 2108 index: this.startMarker.index, 2109 line: this.startMarker.line, 2110 column: this.startMarker.column 2111 }; 2112 }; 2113 Parser.prototype.startNode = function (token, lastLineStart) { 2114 if (lastLineStart === void 0) { lastLineStart = 0; } 2115 var column = token.start - token.lineStart; 2116 var line = token.lineNumber; 2117 if (column < 0) { 2118 column += lastLineStart; 2119 line--; 2120 } 2121 return { 2122 index: token.start, 2123 line: line, 2124 column: column 2125 }; 2126 }; 2127 Parser.prototype.finalize = function (marker, node) { 2128 if (this.config.range) { 2129 node.range = [marker.index, this.lastMarker.index]; 2130 } 2131 if (this.config.loc) { 2132 node.loc = { 2133 start: { 2134 line: marker.line, 2135 column: marker.column, 2136 }, 2137 end: { 2138 line: this.lastMarker.line, 2139 column: this.lastMarker.column 2140 } 2141 }; 2142 if (this.config.source) { 2143 node.loc.source = this.config.source; 2144 } 2145 } 2146 if (this.delegate) { 2147 var metadata = { 2148 start: { 2149 line: marker.line, 2150 column: marker.column, 2151 offset: marker.index 2152 }, 2153 end: { 2154 line: this.lastMarker.line, 2155 column: this.lastMarker.column, 2156 offset: this.lastMarker.index 2157 } 2158 }; 2159 this.delegate(node, metadata); 2160 } 2161 return node; 2162 }; 2163 // Expect the next token to match the specified punctuator. 2164 // If not, an exception will be thrown. 2165 Parser.prototype.expect = function (value) { 2166 var token = this.nextToken(); 2167 if (token.type !== 7 /* Punctuator */ || token.value !== value) { 2168 this.throwUnexpectedToken(token); 2169 } 2170 }; 2171 // Quietly expect a comma when in tolerant mode, otherwise delegates to expect(). 2172 Parser.prototype.expectCommaSeparator = function () { 2173 if (this.config.tolerant) { 2174 var token = this.lookahead; 2175 if (token.type === 7 /* Punctuator */ && token.value === ',') { 2176 this.nextToken(); 2177 } 2178 else if (token.type === 7 /* Punctuator */ && token.value === ';') { 2179 this.nextToken(); 2180 this.tolerateUnexpectedToken(token); 2181 } 2182 else { 2183 this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken); 2184 } 2185 } 2186 else { 2187 this.expect(','); 2188 } 2189 }; 2190 // Expect the next token to match the specified keyword. 2191 // If not, an exception will be thrown. 2192 Parser.prototype.expectKeyword = function (keyword) { 2193 var token = this.nextToken(); 2194 if (token.type !== 4 /* Keyword */ || token.value !== keyword) { 2195 this.throwUnexpectedToken(token); 2196 } 2197 }; 2198 // Return true if the next token matches the specified punctuator. 2199 Parser.prototype.match = function (value) { 2200 return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value; 2201 }; 2202 // Return true if the next token matches the specified keyword 2203 Parser.prototype.matchKeyword = function (keyword) { 2204 return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword; 2205 }; 2206 // Return true if the next token matches the specified contextual keyword 2207 // (where an identifier is sometimes a keyword depending on the context) 2208 Parser.prototype.matchContextualKeyword = function (keyword) { 2209 return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword; 2210 }; 2211 // Return true if the next token is an assignment operator 2212 Parser.prototype.matchAssign = function () { 2213 if (this.lookahead.type !== 7 /* Punctuator */) { 2214 return false; 2215 } 2216 var op = this.lookahead.value; 2217 return op === '=' || 2218 op === '*=' || 2219 op === '**=' || 2220 op === '/=' || 2221 op === '%=' || 2222 op === '+=' || 2223 op === '-=' || 2224 op === '<<=' || 2225 op === '>>=' || 2226 op === '>>>=' || 2227 op === '&=' || 2228 op === '^=' || 2229 op === '|='; 2230 }; 2231 // Cover grammar support. 2232 // 2233 // When an assignment expression position starts with an left parenthesis, the determination of the type 2234 // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead) 2235 // or the first comma. This situation also defers the determination of all the expressions nested in the pair. 2236 // 2237 // There are three productions that can be parsed in a parentheses pair that needs to be determined 2238 // after the outermost pair is closed. They are: 2239 // 2240 // 1. AssignmentExpression 2241 // 2. BindingElements 2242 // 3. AssignmentTargets 2243 // 2244 // In order to avoid exponential backtracking, we use two flags to denote if the production can be 2245 // binding element or assignment target. 2246 // 2247 // The three productions have the relationship: 2248 // 2249 // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression 2250 // 2251 // with a single exception that CoverInitializedName when used directly in an Expression, generates 2252 // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the 2253 // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair. 2254 // 2255 // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not 2256 // effect the current flags. This means the production the parser parses is only used as an expression. Therefore 2257 // the CoverInitializedName check is conducted. 2258 // 2259 // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates 2260 // the flags outside of the parser. This means the production the parser parses is used as a part of a potential 2261 // pattern. The CoverInitializedName check is deferred. 2262 Parser.prototype.isolateCoverGrammar = function (parseFunction) { 2263 var previousIsBindingElement = this.context.isBindingElement; 2264 var previousIsAssignmentTarget = this.context.isAssignmentTarget; 2265 var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; 2266 this.context.isBindingElement = true; 2267 this.context.isAssignmentTarget = true; 2268 this.context.firstCoverInitializedNameError = null; 2269 var result = parseFunction.call(this); 2270 if (this.context.firstCoverInitializedNameError !== null) { 2271 this.throwUnexpectedToken(this.context.firstCoverInitializedNameError); 2272 } 2273 this.context.isBindingElement = previousIsBindingElement; 2274 this.context.isAssignmentTarget = previousIsAssignmentTarget; 2275 this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError; 2276 return result; 2277 }; 2278 Parser.prototype.inheritCoverGrammar = function (parseFunction) { 2279 var previousIsBindingElement = this.context.isBindingElement; 2280 var previousIsAssignmentTarget = this.context.isAssignmentTarget; 2281 var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; 2282 this.context.isBindingElement = true; 2283 this.context.isAssignmentTarget = true; 2284 this.context.firstCoverInitializedNameError = null; 2285 var result = parseFunction.call(this); 2286 this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement; 2287 this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget; 2288 this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError; 2289 return result; 2290 }; 2291 Parser.prototype.consumeSemicolon = function () { 2292 if (this.match(';')) { 2293 this.nextToken(); 2294 } 2295 else if (!this.hasLineTerminator) { 2296 if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) { 2297 this.throwUnexpectedToken(this.lookahead); 2298 } 2299 this.lastMarker.index = this.startMarker.index; 2300 this.lastMarker.line = this.startMarker.line; 2301 this.lastMarker.column = this.startMarker.column; 2302 } 2303 }; 2304 // https://tc39.github.io/ecma262/#sec-primary-expression 2305 Parser.prototype.parsePrimaryExpression = function () { 2306 var node = this.createNode(); 2307 var expr; 2308 var token, raw; 2309 switch (this.lookahead.type) { 2310 case 3 /* Identifier */: 2311 if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') { 2312 this.tolerateUnexpectedToken(this.lookahead); 2313 } 2314 expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value)); 2315 break; 2316 case 6 /* NumericLiteral */: 2317 case 8 /* StringLiteral */: 2318 if (this.context.strict && this.lookahead.octal) { 2319 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral); 2320 } 2321 this.context.isAssignmentTarget = false; 2322 this.context.isBindingElement = false; 2323 token = this.nextToken(); 2324 raw = this.getTokenRaw(token); 2325 expr = this.finalize(node, new Node.Literal(token.value, raw)); 2326 break; 2327 case 1 /* BooleanLiteral */: 2328 this.context.isAssignmentTarget = false; 2329 this.context.isBindingElement = false; 2330 token = this.nextToken(); 2331 raw = this.getTokenRaw(token); 2332 expr = this.finalize(node, new Node.Literal(token.value === 'true', raw)); 2333 break; 2334 case 5 /* NullLiteral */: 2335 this.context.isAssignmentTarget = false; 2336 this.context.isBindingElement = false; 2337 token = this.nextToken(); 2338 raw = this.getTokenRaw(token); 2339 expr = this.finalize(node, new Node.Literal(null, raw)); 2340 break; 2341 case 10 /* Template */: 2342 expr = this.parseTemplateLiteral(); 2343 break; 2344 case 7 /* Punctuator */: 2345 switch (this.lookahead.value) { 2346 case '(': 2347 this.context.isBindingElement = false; 2348 expr = this.inheritCoverGrammar(this.parseGroupExpression); 2349 break; 2350 case '[': 2351 expr = this.inheritCoverGrammar(this.parseArrayInitializer); 2352 break; 2353 case '{': 2354 expr = this.inheritCoverGrammar(this.parseObjectInitializer); 2355 break; 2356 case '/': 2357 case '/=': 2358 this.context.isAssignmentTarget = false; 2359 this.context.isBindingElement = false; 2360 this.scanner.index = this.startMarker.index; 2361 token = this.nextRegexToken(); 2362 raw = this.getTokenRaw(token); 2363 expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags)); 2364 break; 2365 default: 2366 expr = this.throwUnexpectedToken(this.nextToken()); 2367 } 2368 break; 2369 case 4 /* Keyword */: 2370 if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) { 2371 expr = this.parseIdentifierName(); 2372 } 2373 else if (!this.context.strict && this.matchKeyword('let')) { 2374 expr = this.finalize(node, new Node.Identifier(this.nextToken().value)); 2375 } 2376 else { 2377 this.context.isAssignmentTarget = false; 2378 this.context.isBindingElement = false; 2379 if (this.matchKeyword('function')) { 2380 expr = this.parseFunctionExpression(); 2381 } 2382 else if (this.matchKeyword('this')) { 2383 this.nextToken(); 2384 expr = this.finalize(node, new Node.ThisExpression()); 2385 } 2386 else if (this.matchKeyword('class')) { 2387 expr = this.parseClassExpression(); 2388 } 2389 else { 2390 expr = this.throwUnexpectedToken(this.nextToken()); 2391 } 2392 } 2393 break; 2394 default: 2395 expr = this.throwUnexpectedToken(this.nextToken()); 2396 } 2397 return expr; 2398 }; 2399 // https://tc39.github.io/ecma262/#sec-array-initializer 2400 Parser.prototype.parseSpreadElement = function () { 2401 var node = this.createNode(); 2402 this.expect('...'); 2403 var arg = this.inheritCoverGrammar(this.parseAssignmentExpression); 2404 return this.finalize(node, new Node.SpreadElement(arg)); 2405 }; 2406 Parser.prototype.parseArrayInitializer = function () { 2407 var node = this.createNode(); 2408 var elements = []; 2409 this.expect('['); 2410 while (!this.match(']')) { 2411 if (this.match(',')) { 2412 this.nextToken(); 2413 elements.push(null); 2414 } 2415 else if (this.match('...')) { 2416 var element = this.parseSpreadElement(); 2417 if (!this.match(']')) { 2418 this.context.isAssignmentTarget = false; 2419 this.context.isBindingElement = false; 2420 this.expect(','); 2421 } 2422 elements.push(element); 2423 } 2424 else { 2425 elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); 2426 if (!this.match(']')) { 2427 this.expect(','); 2428 } 2429 } 2430 } 2431 this.expect(']'); 2432 return this.finalize(node, new Node.ArrayExpression(elements)); 2433 }; 2434 // https://tc39.github.io/ecma262/#sec-object-initializer 2435 Parser.prototype.parsePropertyMethod = function (params) { 2436 this.context.isAssignmentTarget = false; 2437 this.context.isBindingElement = false; 2438 var previousStrict = this.context.strict; 2439 var previousAllowStrictDirective = this.context.allowStrictDirective; 2440 this.context.allowStrictDirective = params.simple; 2441 var body = this.isolateCoverGrammar(this.parseFunctionSourceElements); 2442 if (this.context.strict && params.firstRestricted) { 2443 this.tolerateUnexpectedToken(params.firstRestricted, params.message); 2444 } 2445 if (this.context.strict && params.stricted) { 2446 this.tolerateUnexpectedToken(params.stricted, params.message); 2447 } 2448 this.context.strict = previousStrict; 2449 this.context.allowStrictDirective = previousAllowStrictDirective; 2450 return body; 2451 }; 2452 Parser.prototype.parsePropertyMethodFunction = function () { 2453 var isGenerator = false; 2454 var node = this.createNode(); 2455 var previousAllowYield = this.context.allowYield; 2456 this.context.allowYield = true; 2457 var params = this.parseFormalParameters(); 2458 var method = this.parsePropertyMethod(params); 2459 this.context.allowYield = previousAllowYield; 2460 return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); 2461 }; 2462 Parser.prototype.parsePropertyMethodAsyncFunction = function () { 2463 var node = this.createNode(); 2464 var previousAllowYield = this.context.allowYield; 2465 var previousAwait = this.context.await; 2466 this.context.allowYield = false; 2467 this.context.await = true; 2468 var params = this.parseFormalParameters(); 2469 var method = this.parsePropertyMethod(params); 2470 this.context.allowYield = previousAllowYield; 2471 this.context.await = previousAwait; 2472 return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method)); 2473 }; 2474 Parser.prototype.parseObjectPropertyKey = function () { 2475 var node = this.createNode(); 2476 var token = this.nextToken(); 2477 var key; 2478 switch (token.type) { 2479 case 8 /* StringLiteral */: 2480 case 6 /* NumericLiteral */: 2481 if (this.context.strict && token.octal) { 2482 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral); 2483 } 2484 var raw = this.getTokenRaw(token); 2485 key = this.finalize(node, new Node.Literal(token.value, raw)); 2486 break; 2487 case 3 /* Identifier */: 2488 case 1 /* BooleanLiteral */: 2489 case 5 /* NullLiteral */: 2490 case 4 /* Keyword */: 2491 key = this.finalize(node, new Node.Identifier(token.value)); 2492 break; 2493 case 7 /* Punctuator */: 2494 if (token.value === '[') { 2495 key = this.isolateCoverGrammar(this.parseAssignmentExpression); 2496 this.expect(']'); 2497 } 2498 else { 2499 key = this.throwUnexpectedToken(token); 2500 } 2501 break; 2502 default: 2503 key = this.throwUnexpectedToken(token); 2504 } 2505 return key; 2506 }; 2507 Parser.prototype.isPropertyKey = function (key, value) { 2508 return (key.type === syntax_1.Syntax.Identifier && key.name === value) || 2509 (key.type === syntax_1.Syntax.Literal && key.value === value); 2510 }; 2511 Parser.prototype.parseObjectProperty = function (hasProto) { 2512 var node = this.createNode(); 2513 var token = this.lookahead; 2514 var kind; 2515 var key = null; 2516 var value = null; 2517 var computed = false; 2518 var method = false; 2519 var shorthand = false; 2520 var isAsync = false; 2521 if (token.type === 3 /* Identifier */) { 2522 var id = token.value; 2523 this.nextToken(); 2524 computed = this.match('['); 2525 isAsync = !this.hasLineTerminator && (id === 'async') && 2526 !this.match(':') && !this.match('(') && !this.match('*') && !this.match(','); 2527 key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id)); 2528 } 2529 else if (this.match('*')) { 2530 this.nextToken(); 2531 } 2532 else { 2533 computed = this.match('['); 2534 key = this.parseObjectPropertyKey(); 2535 } 2536 var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); 2537 if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) { 2538 kind = 'get'; 2539 computed = this.match('['); 2540 key = this.parseObjectPropertyKey(); 2541 this.context.allowYield = false; 2542 value = this.parseGetterMethod(); 2543 } 2544 else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) { 2545 kind = 'set'; 2546 computed = this.match('['); 2547 key = this.parseObjectPropertyKey(); 2548 value = this.parseSetterMethod(); 2549 } 2550 else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { 2551 kind = 'init'; 2552 computed = this.match('['); 2553 key = this.parseObjectPropertyKey(); 2554 value = this.parseGeneratorMethod(); 2555 method = true; 2556 } 2557 else { 2558 if (!key) { 2559 this.throwUnexpectedToken(this.lookahead); 2560 } 2561 kind = 'init'; 2562 if (this.match(':') && !isAsync) { 2563 if (!computed && this.isPropertyKey(key, '__proto__')) { 2564 if (hasProto.value) { 2565 this.tolerateError(messages_1.Messages.DuplicateProtoProperty); 2566 } 2567 hasProto.value = true; 2568 } 2569 this.nextToken(); 2570 value = this.inheritCoverGrammar(this.parseAssignmentExpression); 2571 } 2572 else if (this.match('(')) { 2573 value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); 2574 method = true; 2575 } 2576 else if (token.type === 3 /* Identifier */) { 2577 var id = this.finalize(node, new Node.Identifier(token.value)); 2578 if (this.match('=')) { 2579 this.context.firstCoverInitializedNameError = this.lookahead; 2580 this.nextToken(); 2581 shorthand = true; 2582 var init = this.isolateCoverGrammar(this.parseAssignmentExpression); 2583 value = this.finalize(node, new Node.AssignmentPattern(id, init)); 2584 } 2585 else { 2586 shorthand = true; 2587 value = id; 2588 } 2589 } 2590 else { 2591 this.throwUnexpectedToken(this.nextToken()); 2592 } 2593 } 2594 return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand)); 2595 }; 2596 Parser.prototype.parseObjectInitializer = function () { 2597 var node = this.createNode(); 2598 this.expect('{'); 2599 var properties = []; 2600 var hasProto = { value: false }; 2601 while (!this.match('}')) { 2602 properties.push(this.parseObjectProperty(hasProto)); 2603 if (!this.match('}')) { 2604 this.expectCommaSeparator(); 2605 } 2606 } 2607 this.expect('}'); 2608 return this.finalize(node, new Node.ObjectExpression(properties)); 2609 }; 2610 // https://tc39.github.io/ecma262/#sec-template-literals 2611 Parser.prototype.parseTemplateHead = function () { 2612 assert_1.assert(this.lookahead.head, 'Template literal must start with a template head'); 2613 var node = this.createNode(); 2614 var token = this.nextToken(); 2615 var raw = token.value; 2616 var cooked = token.cooked; 2617 return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); 2618 }; 2619 Parser.prototype.parseTemplateElement = function () { 2620 if (this.lookahead.type !== 10 /* Template */) { 2621 this.throwUnexpectedToken(); 2622 } 2623 var node = this.createNode(); 2624 var token = this.nextToken(); 2625 var raw = token.value; 2626 var cooked = token.cooked; 2627 return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); 2628 }; 2629 Parser.prototype.parseTemplateLiteral = function () { 2630 var node = this.createNode(); 2631 var expressions = []; 2632 var quasis = []; 2633 var quasi = this.parseTemplateHead(); 2634 quasis.push(quasi); 2635 while (!quasi.tail) { 2636 expressions.push(this.parseExpression()); 2637 quasi = this.parseTemplateElement(); 2638 quasis.push(quasi); 2639 } 2640 return this.finalize(node, new Node.TemplateLiteral(quasis, expressions)); 2641 }; 2642 // https://tc39.github.io/ecma262/#sec-grouping-operator 2643 Parser.prototype.reinterpretExpressionAsPattern = function (expr) { 2644 switch (expr.type) { 2645 case syntax_1.Syntax.Identifier: 2646 case syntax_1.Syntax.MemberExpression: 2647 case syntax_1.Syntax.RestElement: 2648 case syntax_1.Syntax.AssignmentPattern: 2649 break; 2650 case syntax_1.Syntax.SpreadElement: 2651 expr.type = syntax_1.Syntax.RestElement; 2652 this.reinterpretExpressionAsPattern(expr.argument); 2653 break; 2654 case syntax_1.Syntax.ArrayExpression: 2655 expr.type = syntax_1.Syntax.ArrayPattern; 2656 for (var i = 0; i < expr.elements.length; i++) { 2657 if (expr.elements[i] !== null) { 2658 this.reinterpretExpressionAsPattern(expr.elements[i]); 2659 } 2660 } 2661 break; 2662 case syntax_1.Syntax.ObjectExpression: 2663 expr.type = syntax_1.Syntax.ObjectPattern; 2664 for (var i = 0; i < expr.properties.length; i++) { 2665 this.reinterpretExpressionAsPattern(expr.properties[i].value); 2666 } 2667 break; 2668 case syntax_1.Syntax.AssignmentExpression: 2669 expr.type = syntax_1.Syntax.AssignmentPattern; 2670 delete expr.operator; 2671 this.reinterpretExpressionAsPattern(expr.left); 2672 break; 2673 default: 2674 // Allow other node type for tolerant parsing. 2675 break; 2676 } 2677 }; 2678 Parser.prototype.parseGroupExpression = function () { 2679 var expr; 2680 this.expect('('); 2681 if (this.match(')')) { 2682 this.nextToken(); 2683 if (!this.match('=>')) { 2684 this.expect('=>'); 2685 } 2686 expr = { 2687 type: ArrowParameterPlaceHolder, 2688 params: [], 2689 async: false 2690 }; 2691 } 2692 else { 2693 var startToken = this.lookahead; 2694 var params = []; 2695 if (this.match('...')) { 2696 expr = this.parseRestElement(params); 2697 this.expect(')'); 2698 if (!this.match('=>')) { 2699 this.expect('=>'); 2700 } 2701 expr = { 2702 type: ArrowParameterPlaceHolder, 2703 params: [expr], 2704 async: false 2705 }; 2706 } 2707 else { 2708 var arrow = false; 2709 this.context.isBindingElement = true; 2710 expr = this.inheritCoverGrammar(this.parseAssignmentExpression); 2711 if (this.match(',')) { 2712 var expressions = []; 2713 this.context.isAssignmentTarget = false; 2714 expressions.push(expr); 2715 while (this.lookahead.type !== 2 /* EOF */) { 2716 if (!this.match(',')) { 2717 break; 2718 } 2719 this.nextToken(); 2720 if (this.match(')')) { 2721 this.nextToken(); 2722 for (var i = 0; i < expressions.length; i++) { 2723 this.reinterpretExpressionAsPattern(expressions[i]); 2724 } 2725 arrow = true; 2726 expr = { 2727 type: ArrowParameterPlaceHolder, 2728 params: expressions, 2729 async: false 2730 }; 2731 } 2732 else if (this.match('...')) { 2733 if (!this.context.isBindingElement) { 2734 this.throwUnexpectedToken(this.lookahead); 2735 } 2736 expressions.push(this.parseRestElement(params)); 2737 this.expect(')'); 2738 if (!this.match('=>')) { 2739 this.expect('=>'); 2740 } 2741 this.context.isBindingElement = false; 2742 for (var i = 0; i < expressions.length; i++) { 2743 this.reinterpretExpressionAsPattern(expressions[i]); 2744 } 2745 arrow = true; 2746 expr = { 2747 type: ArrowParameterPlaceHolder, 2748 params: expressions, 2749 async: false 2750 }; 2751 } 2752 else { 2753 expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); 2754 } 2755 if (arrow) { 2756 break; 2757 } 2758 } 2759 if (!arrow) { 2760 expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); 2761 } 2762 } 2763 if (!arrow) { 2764 this.expect(')'); 2765 if (this.match('=>')) { 2766 if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') { 2767 arrow = true; 2768 expr = { 2769 type: ArrowParameterPlaceHolder, 2770 params: [expr], 2771 async: false 2772 }; 2773 } 2774 if (!arrow) { 2775 if (!this.context.isBindingElement) { 2776 this.throwUnexpectedToken(this.lookahead); 2777 } 2778 if (expr.type === syntax_1.Syntax.SequenceExpression) { 2779 for (var i = 0; i < expr.expressions.length; i++) { 2780 this.reinterpretExpressionAsPattern(expr.expressions[i]); 2781 } 2782 } 2783 else { 2784 this.reinterpretExpressionAsPattern(expr); 2785 } 2786 var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]); 2787 expr = { 2788 type: ArrowParameterPlaceHolder, 2789 params: parameters, 2790 async: false 2791 }; 2792 } 2793 } 2794 this.context.isBindingElement = false; 2795 } 2796 } 2797 } 2798 return expr; 2799 }; 2800 // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions 2801 Parser.prototype.parseArguments = function () { 2802 this.expect('('); 2803 var args = []; 2804 if (!this.match(')')) { 2805 while (true) { 2806 var expr = this.match('...') ? this.parseSpreadElement() : 2807 this.isolateCoverGrammar(this.parseAssignmentExpression); 2808 args.push(expr); 2809 if (this.match(')')) { 2810 break; 2811 } 2812 this.expectCommaSeparator(); 2813 if (this.match(')')) { 2814 break; 2815 } 2816 } 2817 } 2818 this.expect(')'); 2819 return args; 2820 }; 2821 Parser.prototype.isIdentifierName = function (token) { 2822 return token.type === 3 /* Identifier */ || 2823 token.type === 4 /* Keyword */ || 2824 token.type === 1 /* BooleanLiteral */ || 2825 token.type === 5 /* NullLiteral */; 2826 }; 2827 Parser.prototype.parseIdentifierName = function () { 2828 var node = this.createNode(); 2829 var token = this.nextToken(); 2830 if (!this.isIdentifierName(token)) { 2831 this.throwUnexpectedToken(token); 2832 } 2833 return this.finalize(node, new Node.Identifier(token.value)); 2834 }; 2835 Parser.prototype.parseNewExpression = function () { 2836 var node = this.createNode(); 2837 var id = this.parseIdentifierName(); 2838 assert_1.assert(id.name === 'new', 'New expression must start with `new`'); 2839 var expr; 2840 if (this.match('.')) { 2841 this.nextToken(); 2842 if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') { 2843 var property = this.parseIdentifierName(); 2844 expr = new Node.MetaProperty(id, property); 2845 } 2846 else { 2847 this.throwUnexpectedToken(this.lookahead); 2848 } 2849 } 2850 else { 2851 var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression); 2852 var args = this.match('(') ? this.parseArguments() : []; 2853 expr = new Node.NewExpression(callee, args); 2854 this.context.isAssignmentTarget = false; 2855 this.context.isBindingElement = false; 2856 } 2857 return this.finalize(node, expr); 2858 }; 2859 Parser.prototype.parseAsyncArgument = function () { 2860 var arg = this.parseAssignmentExpression(); 2861 this.context.firstCoverInitializedNameError = null; 2862 return arg; 2863 }; 2864 Parser.prototype.parseAsyncArguments = function () { 2865 this.expect('('); 2866 var args = []; 2867 if (!this.match(')')) { 2868 while (true) { 2869 var expr = this.match('...') ? this.parseSpreadElement() : 2870 this.isolateCoverGrammar(this.parseAsyncArgument); 2871 args.push(expr); 2872 if (this.match(')')) { 2873 break; 2874 } 2875 this.expectCommaSeparator(); 2876 if (this.match(')')) { 2877 break; 2878 } 2879 } 2880 } 2881 this.expect(')'); 2882 return args; 2883 }; 2884 Parser.prototype.parseLeftHandSideExpressionAllowCall = function () { 2885 var startToken = this.lookahead; 2886 var maybeAsync = this.matchContextualKeyword('async'); 2887 var previousAllowIn = this.context.allowIn; 2888 this.context.allowIn = true; 2889 var expr; 2890 if (this.matchKeyword('super') && this.context.inFunctionBody) { 2891 expr = this.createNode(); 2892 this.nextToken(); 2893 expr = this.finalize(expr, new Node.Super()); 2894 if (!this.match('(') && !this.match('.') && !this.match('[')) { 2895 this.throwUnexpectedToken(this.lookahead); 2896 } 2897 } 2898 else { 2899 expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); 2900 } 2901 while (true) { 2902 if (this.match('.')) { 2903 this.context.isBindingElement = false; 2904 this.context.isAssignmentTarget = true; 2905 this.expect('.'); 2906 var property = this.parseIdentifierName(); 2907 expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property)); 2908 } 2909 else if (this.match('(')) { 2910 var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber); 2911 this.context.isBindingElement = false; 2912 this.context.isAssignmentTarget = false; 2913 var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments(); 2914 expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args)); 2915 if (asyncArrow && this.match('=>')) { 2916 for (var i = 0; i < args.length; ++i) { 2917 this.reinterpretExpressionAsPattern(args[i]); 2918 } 2919 expr = { 2920 type: ArrowParameterPlaceHolder, 2921 params: args, 2922 async: true 2923 }; 2924 } 2925 } 2926 else if (this.match('[')) { 2927 this.context.isBindingElement = false; 2928 this.context.isAssignmentTarget = true; 2929 this.expect('['); 2930 var property = this.isolateCoverGrammar(this.parseExpression); 2931 this.expect(']'); 2932 expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property)); 2933 } 2934 else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { 2935 var quasi = this.parseTemplateLiteral(); 2936 expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi)); 2937 } 2938 else { 2939 break; 2940 } 2941 } 2942 this.context.allowIn = previousAllowIn; 2943 return expr; 2944 }; 2945 Parser.prototype.parseSuper = function () { 2946 var node = this.createNode(); 2947 this.expectKeyword('super'); 2948 if (!this.match('[') && !this.match('.')) { 2949 this.throwUnexpectedToken(this.lookahead); 2950 } 2951 return this.finalize(node, new Node.Super()); 2952 }; 2953 Parser.prototype.parseLeftHandSideExpression = function () { 2954 assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.'); 2955 var node = this.startNode(this.lookahead); 2956 var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() : 2957 this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); 2958 while (true) { 2959 if (this.match('[')) { 2960 this.context.isBindingElement = false; 2961 this.context.isAssignmentTarget = true; 2962 this.expect('['); 2963 var property = this.isolateCoverGrammar(this.parseExpression); 2964 this.expect(']'); 2965 expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property)); 2966 } 2967 else if (this.match('.')) { 2968 this.context.isBindingElement = false; 2969 this.context.isAssignmentTarget = true; 2970 this.expect('.'); 2971 var property = this.parseIdentifierName(); 2972 expr = this.finalize(node, new Node.StaticMemberExpression(expr, property)); 2973 } 2974 else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { 2975 var quasi = this.parseTemplateLiteral(); 2976 expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi)); 2977 } 2978 else { 2979 break; 2980 } 2981 } 2982 return expr; 2983 }; 2984 // https://tc39.github.io/ecma262/#sec-update-expressions 2985 Parser.prototype.parseUpdateExpression = function () { 2986 var expr; 2987 var startToken = this.lookahead; 2988 if (this.match('++') || this.match('--')) { 2989 var node = this.startNode(startToken); 2990 var token = this.nextToken(); 2991 expr = this.inheritCoverGrammar(this.parseUnaryExpression); 2992 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { 2993 this.tolerateError(messages_1.Messages.StrictLHSPrefix); 2994 } 2995 if (!this.context.isAssignmentTarget) { 2996 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); 2997 } 2998 var prefix = true; 2999 expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix)); 3000 this.context.isAssignmentTarget = false; 3001 this.context.isBindingElement = false; 3002 } 3003 else { 3004 expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall); 3005 if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) { 3006 if (this.match('++') || this.match('--')) { 3007 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { 3008 this.tolerateError(messages_1.Messages.StrictLHSPostfix); 3009 } 3010 if (!this.context.isAssignmentTarget) { 3011 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); 3012 } 3013 this.context.isAssignmentTarget = false; 3014 this.context.isBindingElement = false; 3015 var operator = this.nextToken().value; 3016 var prefix = false; 3017 expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix)); 3018 } 3019 } 3020 } 3021 return expr; 3022 }; 3023 // https://tc39.github.io/ecma262/#sec-unary-operators 3024 Parser.prototype.parseAwaitExpression = function () { 3025 var node = this.createNode(); 3026 this.nextToken(); 3027 var argument = this.parseUnaryExpression(); 3028 return this.finalize(node, new Node.AwaitExpression(argument)); 3029 }; 3030 Parser.prototype.parseUnaryExpression = function () { 3031 var expr; 3032 if (this.match('+') || this.match('-') || this.match('~') || this.match('!') || 3033 this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) { 3034 var node = this.startNode(this.lookahead); 3035 var token = this.nextToken(); 3036 expr = this.inheritCoverGrammar(this.parseUnaryExpression); 3037 expr = this.finalize(node, new Node.UnaryExpression(token.value, expr)); 3038 if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) { 3039 this.tolerateError(messages_1.Messages.StrictDelete); 3040 } 3041 this.context.isAssignmentTarget = false; 3042 this.context.isBindingElement = false; 3043 } 3044 else if (this.context.await && this.matchContextualKeyword('await')) { 3045 expr = this.parseAwaitExpression(); 3046 } 3047 else { 3048 expr = this.parseUpdateExpression(); 3049 } 3050 return expr; 3051 }; 3052 Parser.prototype.parseExponentiationExpression = function () { 3053 var startToken = this.lookahead; 3054 var expr = this.inheritCoverGrammar(this.parseUnaryExpression); 3055 if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) { 3056 this.nextToken(); 3057 this.context.isAssignmentTarget = false; 3058 this.context.isBindingElement = false; 3059 var left = expr; 3060 var right = this.isolateCoverGrammar(this.parseExponentiationExpression); 3061 expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right)); 3062 } 3063 return expr; 3064 }; 3065 // https://tc39.github.io/ecma262/#sec-exp-operator 3066 // https://tc39.github.io/ecma262/#sec-multiplicative-operators 3067 // https://tc39.github.io/ecma262/#sec-additive-operators 3068 // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators 3069 // https://tc39.github.io/ecma262/#sec-relational-operators 3070 // https://tc39.github.io/ecma262/#sec-equality-operators 3071 // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators 3072 // https://tc39.github.io/ecma262/#sec-binary-logical-operators 3073 Parser.prototype.binaryPrecedence = function (token) { 3074 var op = token.value; 3075 var precedence; 3076 if (token.type === 7 /* Punctuator */) { 3077 precedence = this.operatorPrecedence[op] || 0; 3078 } 3079 else if (token.type === 4 /* Keyword */) { 3080 precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0; 3081 } 3082 else { 3083 precedence = 0; 3084 } 3085 return precedence; 3086 }; 3087 Parser.prototype.parseBinaryExpression = function () { 3088 var startToken = this.lookahead; 3089 var expr = this.inheritCoverGrammar(this.parseExponentiationExpression); 3090 var token = this.lookahead; 3091 var prec = this.binaryPrecedence(token); 3092 if (prec > 0) { 3093 this.nextToken(); 3094 this.context.isAssignmentTarget = false; 3095 this.context.isBindingElement = false; 3096 var markers = [startToken, this.lookahead]; 3097 var left = expr; 3098 var right = this.isolateCoverGrammar(this.parseExponentiationExpression); 3099 var stack = [left, token.value, right]; 3100 var precedences = [prec]; 3101 while (true) { 3102 prec = this.binaryPrecedence(this.lookahead); 3103 if (prec <= 0) { 3104 break; 3105 } 3106 // Reduce: make a binary expression from the three topmost entries. 3107 while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) { 3108 right = stack.pop(); 3109 var operator = stack.pop(); 3110 precedences.pop(); 3111 left = stack.pop(); 3112 markers.pop(); 3113 var node = this.startNode(markers[markers.length - 1]); 3114 stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right))); 3115 } 3116 // Shift. 3117 stack.push(this.nextToken().value); 3118 precedences.push(prec); 3119 markers.push(this.lookahead); 3120 stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression)); 3121 } 3122 // Final reduce to clean-up the stack. 3123 var i = stack.length - 1; 3124 expr = stack[i]; 3125 var lastMarker = markers.pop(); 3126 while (i > 1) { 3127 var marker = markers.pop(); 3128 var lastLineStart = lastMarker && lastMarker.lineStart; 3129 var node = this.startNode(marker, lastLineStart); 3130 var operator = stack[i - 1]; 3131 expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr)); 3132 i -= 2; 3133 lastMarker = marker; 3134 } 3135 } 3136 return expr; 3137 }; 3138 // https://tc39.github.io/ecma262/#sec-conditional-operator 3139 Parser.prototype.parseConditionalExpression = function () { 3140 var startToken = this.lookahead; 3141 var expr = this.inheritCoverGrammar(this.parseBinaryExpression); 3142 if (this.match('?')) { 3143 this.nextToken(); 3144 var previousAllowIn = this.context.allowIn; 3145 this.context.allowIn = true; 3146 var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression); 3147 this.context.allowIn = previousAllowIn; 3148 this.expect(':'); 3149 var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression); 3150 expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate)); 3151 this.context.isAssignmentTarget = false; 3152 this.context.isBindingElement = false; 3153 } 3154 return expr; 3155 }; 3156 // https://tc39.github.io/ecma262/#sec-assignment-operators 3157 Parser.prototype.checkPatternParam = function (options, param) { 3158 switch (param.type) { 3159 case syntax_1.Syntax.Identifier: 3160 this.validateParam(options, param, param.name); 3161 break; 3162 case syntax_1.Syntax.RestElement: 3163 this.checkPatternParam(options, param.argument); 3164 break; 3165 case syntax_1.Syntax.AssignmentPattern: 3166 this.checkPatternParam(options, param.left); 3167 break; 3168 case syntax_1.Syntax.ArrayPattern: 3169 for (var i = 0; i < param.elements.length; i++) { 3170 if (param.elements[i] !== null) { 3171 this.checkPatternParam(options, param.elements[i]); 3172 } 3173 } 3174 break; 3175 case syntax_1.Syntax.ObjectPattern: 3176 for (var i = 0; i < param.properties.length; i++) { 3177 this.checkPatternParam(options, param.properties[i].value); 3178 } 3179 break; 3180 default: 3181 break; 3182 } 3183 options.simple = options.simple && (param instanceof Node.Identifier); 3184 }; 3185 Parser.prototype.reinterpretAsCoverFormalsList = function (expr) { 3186 var params = [expr]; 3187 var options; 3188 var asyncArrow = false; 3189 switch (expr.type) { 3190 case syntax_1.Syntax.Identifier: 3191 break; 3192 case ArrowParameterPlaceHolder: 3193 params = expr.params; 3194 asyncArrow = expr.async; 3195 break; 3196 default: 3197 return null; 3198 } 3199 options = { 3200 simple: true, 3201 paramSet: {} 3202 }; 3203 for (var i = 0; i < params.length; ++i) { 3204 var param = params[i]; 3205 if (param.type === syntax_1.Syntax.AssignmentPattern) { 3206 if (param.right.type === syntax_1.Syntax.YieldExpression) { 3207 if (param.right.argument) { 3208 this.throwUnexpectedToken(this.lookahead); 3209 } 3210 param.right.type = syntax_1.Syntax.Identifier; 3211 param.right.name = 'yield'; 3212 delete param.right.argument; 3213 delete param.right.delegate; 3214 } 3215 } 3216 else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') { 3217 this.throwUnexpectedToken(this.lookahead); 3218 } 3219 this.checkPatternParam(options, param); 3220 params[i] = param; 3221 } 3222 if (this.context.strict || !this.context.allowYield) { 3223 for (var i = 0; i < params.length; ++i) { 3224 var param = params[i]; 3225 if (param.type === syntax_1.Syntax.YieldExpression) { 3226 this.throwUnexpectedToken(this.lookahead); 3227 } 3228 } 3229 } 3230 if (options.message === messages_1.Messages.StrictParamDupe) { 3231 var token = this.context.strict ? options.stricted : options.firstRestricted; 3232 this.throwUnexpectedToken(token, options.message); 3233 } 3234 return { 3235 simple: options.simple, 3236 params: params, 3237 stricted: options.stricted, 3238 firstRestricted: options.firstRestricted, 3239 message: options.message 3240 }; 3241 }; 3242 Parser.prototype.parseAssignmentExpression = function () { 3243 var expr; 3244 if (!this.context.allowYield && this.matchKeyword('yield')) { 3245 expr = this.parseYieldExpression(); 3246 } 3247 else { 3248 var startToken = this.lookahead; 3249 var token = startToken; 3250 expr = this.parseConditionalExpression(); 3251 if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') { 3252 if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) { 3253 var arg = this.parsePrimaryExpression(); 3254 this.reinterpretExpressionAsPattern(arg); 3255 expr = { 3256 type: ArrowParameterPlaceHolder, 3257 params: [arg], 3258 async: true 3259 }; 3260 } 3261 } 3262 if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) { 3263 // https://tc39.github.io/ecma262/#sec-arrow-function-definitions 3264 this.context.isAssignmentTarget = false; 3265 this.context.isBindingElement = false; 3266 var isAsync = expr.async; 3267 var list = this.reinterpretAsCoverFormalsList(expr); 3268 if (list) { 3269 if (this.hasLineTerminator) { 3270 this.tolerateUnexpectedToken(this.lookahead); 3271 } 3272 this.context.firstCoverInitializedNameError = null; 3273 var previousStrict = this.context.strict; 3274 var previousAllowStrictDirective = this.context.allowStrictDirective; 3275 this.context.allowStrictDirective = list.simple; 3276 var previousAllowYield = this.context.allowYield; 3277 var previousAwait = this.context.await; 3278 this.context.allowYield = true; 3279 this.context.await = isAsync; 3280 var node = this.startNode(startToken); 3281 this.expect('=>'); 3282 var body = void 0; 3283 if (this.match('{')) { 3284 var previousAllowIn = this.context.allowIn; 3285 this.context.allowIn = true; 3286 body = this.parseFunctionSourceElements(); 3287 this.context.allowIn = previousAllowIn; 3288 } 3289 else { 3290 body = this.isolateCoverGrammar(this.parseAssignmentExpression); 3291 } 3292 var expression = body.type !== syntax_1.Syntax.BlockStatement; 3293 if (this.context.strict && list.firstRestricted) { 3294 this.throwUnexpectedToken(list.firstRestricted, list.message); 3295 } 3296 if (this.context.strict && list.stricted) { 3297 this.tolerateUnexpectedToken(list.stricted, list.message); 3298 } 3299 expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) : 3300 this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression)); 3301 this.context.strict = previousStrict; 3302 this.context.allowStrictDirective = previousAllowStrictDirective; 3303 this.context.allowYield = previousAllowYield; 3304 this.context.await = previousAwait; 3305 } 3306 } 3307 else { 3308 if (this.matchAssign()) { 3309 if (!this.context.isAssignmentTarget) { 3310 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); 3311 } 3312 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) { 3313 var id = expr; 3314 if (this.scanner.isRestrictedWord(id.name)) { 3315 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment); 3316 } 3317 if (this.scanner.isStrictModeReservedWord(id.name)) { 3318 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); 3319 } 3320 } 3321 if (!this.match('=')) { 3322 this.context.isAssignmentTarget = false; 3323 this.context.isBindingElement = false; 3324 } 3325 else { 3326 this.reinterpretExpressionAsPattern(expr); 3327 } 3328 token = this.nextToken(); 3329 var operator = token.value; 3330 var right = this.isolateCoverGrammar(this.parseAssignmentExpression); 3331 expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right)); 3332 this.context.firstCoverInitializedNameError = null; 3333 } 3334 } 3335 } 3336 return expr; 3337 }; 3338 // https://tc39.github.io/ecma262/#sec-comma-operator 3339 Parser.prototype.parseExpression = function () { 3340 var startToken = this.lookahead; 3341 var expr = this.isolateCoverGrammar(this.parseAssignmentExpression); 3342 if (this.match(',')) { 3343 var expressions = []; 3344 expressions.push(expr); 3345 while (this.lookahead.type !== 2 /* EOF */) { 3346 if (!this.match(',')) { 3347 break; 3348 } 3349 this.nextToken(); 3350 expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); 3351 } 3352 expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); 3353 } 3354 return expr; 3355 }; 3356 // https://tc39.github.io/ecma262/#sec-block 3357 Parser.prototype.parseStatementListItem = function () { 3358 var statement; 3359 this.context.isAssignmentTarget = true; 3360 this.context.isBindingElement = true; 3361 if (this.lookahead.type === 4 /* Keyword */) { 3362 switch (this.lookahead.value) { 3363 case 'export': 3364 if (!this.context.isModule) { 3365 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration); 3366 } 3367 statement = this.parseExportDeclaration(); 3368 break; 3369 case 'import': 3370 if (!this.context.isModule) { 3371 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration); 3372 } 3373 statement = this.parseImportDeclaration(); 3374 break; 3375 case 'const': 3376 statement = this.parseLexicalDeclaration({ inFor: false }); 3377 break; 3378 case 'function': 3379 statement = this.parseFunctionDeclaration(); 3380 break; 3381 case 'class': 3382 statement = this.parseClassDeclaration(); 3383 break; 3384 case 'let': 3385 statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement(); 3386 break; 3387 default: 3388 statement = this.parseStatement(); 3389 break; 3390 } 3391 } 3392 else { 3393 statement = this.parseStatement(); 3394 } 3395 return statement; 3396 }; 3397 Parser.prototype.parseBlock = function () { 3398 var node = this.createNode(); 3399 this.expect('{'); 3400 var block = []; 3401 while (true) { 3402 if (this.match('}')) { 3403 break; 3404 } 3405 block.push(this.parseStatementListItem()); 3406 } 3407 this.expect('}'); 3408 return this.finalize(node, new Node.BlockStatement(block)); 3409 }; 3410 // https://tc39.github.io/ecma262/#sec-let-and-const-declarations 3411 Parser.prototype.parseLexicalBinding = function (kind, options) { 3412 var node = this.createNode(); 3413 var params = []; 3414 var id = this.parsePattern(params, kind); 3415 if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { 3416 if (this.scanner.isRestrictedWord(id.name)) { 3417 this.tolerateError(messages_1.Messages.StrictVarName); 3418 } 3419 } 3420 var init = null; 3421 if (kind === 'const') { 3422 if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) { 3423 if (this.match('=')) { 3424 this.nextToken(); 3425 init = this.isolateCoverGrammar(this.parseAssignmentExpression); 3426 } 3427 else { 3428 this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const'); 3429 } 3430 } 3431 } 3432 else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) { 3433 this.expect('='); 3434 init = this.isolateCoverGrammar(this.parseAssignmentExpression); 3435 } 3436 return this.finalize(node, new Node.VariableDeclarator(id, init)); 3437 }; 3438 Parser.prototype.parseBindingList = function (kind, options) { 3439 var list = [this.parseLexicalBinding(kind, options)]; 3440 while (this.match(',')) { 3441 this.nextToken(); 3442 list.push(this.parseLexicalBinding(kind, options)); 3443 } 3444 return list; 3445 }; 3446 Parser.prototype.isLexicalDeclaration = function () { 3447 var state = this.scanner.saveState(); 3448 this.scanner.scanComments(); 3449 var next = this.scanner.lex(); 3450 this.scanner.restoreState(state); 3451 return (next.type === 3 /* Identifier */) || 3452 (next.type === 7 /* Punctuator */ && next.value === '[') || 3453 (next.type === 7 /* Punctuator */ && next.value === '{') || 3454 (next.type === 4 /* Keyword */ && next.value === 'let') || 3455 (next.type === 4 /* Keyword */ && next.value === 'yield'); 3456 }; 3457 Parser.prototype.parseLexicalDeclaration = function (options) { 3458 var node = this.createNode(); 3459 var kind = this.nextToken().value; 3460 assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const'); 3461 var declarations = this.parseBindingList(kind, options); 3462 this.consumeSemicolon(); 3463 return this.finalize(node, new Node.VariableDeclaration(declarations, kind)); 3464 }; 3465 // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns 3466 Parser.prototype.parseBindingRestElement = function (params, kind) { 3467 var node = this.createNode(); 3468 this.expect('...'); 3469 var arg = this.parsePattern(params, kind); 3470 return this.finalize(node, new Node.RestElement(arg)); 3471 }; 3472 Parser.prototype.parseArrayPattern = function (params, kind) { 3473 var node = this.createNode(); 3474 this.expect('['); 3475 var elements = []; 3476 while (!this.match(']')) { 3477 if (this.match(',')) { 3478 this.nextToken(); 3479 elements.push(null); 3480 } 3481 else { 3482 if (this.match('...')) { 3483 elements.push(this.parseBindingRestElement(params, kind)); 3484 break; 3485 } 3486 else { 3487 elements.push(this.parsePatternWithDefault(params, kind)); 3488 } 3489 if (!this.match(']')) { 3490 this.expect(','); 3491 } 3492 } 3493 } 3494 this.expect(']'); 3495 return this.finalize(node, new Node.ArrayPattern(elements)); 3496 }; 3497 Parser.prototype.parsePropertyPattern = function (params, kind) { 3498 var node = this.createNode(); 3499 var computed = false; 3500 var shorthand = false; 3501 var method = false; 3502 var key; 3503 var value; 3504 if (this.lookahead.type === 3 /* Identifier */) { 3505 var keyToken = this.lookahead; 3506 key = this.parseVariableIdentifier(); 3507 var init = this.finalize(node, new Node.Identifier(keyToken.value)); 3508 if (this.match('=')) { 3509 params.push(keyToken); 3510 shorthand = true; 3511 this.nextToken(); 3512 var expr = this.parseAssignmentExpression(); 3513 value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr)); 3514 } 3515 else if (!this.match(':')) { 3516 params.push(keyToken); 3517 shorthand = true; 3518 value = init; 3519 } 3520 else { 3521 this.expect(':'); 3522 value = this.parsePatternWithDefault(params, kind); 3523 } 3524 } 3525 else { 3526 computed = this.match('['); 3527 key = this.parseObjectPropertyKey(); 3528 this.expect(':'); 3529 value = this.parsePatternWithDefault(params, kind); 3530 } 3531 return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand)); 3532 }; 3533 Parser.prototype.parseObjectPattern = function (params, kind) { 3534 var node = this.createNode(); 3535 var properties = []; 3536 this.expect('{'); 3537 while (!this.match('}')) { 3538 properties.push(this.parsePropertyPattern(params, kind)); 3539 if (!this.match('}')) { 3540 this.expect(','); 3541 } 3542 } 3543 this.expect('}'); 3544 return this.finalize(node, new Node.ObjectPattern(properties)); 3545 }; 3546 Parser.prototype.parsePattern = function (params, kind) { 3547 var pattern; 3548 if (this.match('[')) { 3549 pattern = this.parseArrayPattern(params, kind); 3550 } 3551 else if (this.match('{')) { 3552 pattern = this.parseObjectPattern(params, kind); 3553 } 3554 else { 3555 if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) { 3556 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding); 3557 } 3558 params.push(this.lookahead); 3559 pattern = this.parseVariableIdentifier(kind); 3560 } 3561 return pattern; 3562 }; 3563 Parser.prototype.parsePatternWithDefault = function (params, kind) { 3564 var startToken = this.lookahead; 3565 var pattern = this.parsePattern(params, kind); 3566 if (this.match('=')) { 3567 this.nextToken(); 3568 var previousAllowYield = this.context.allowYield; 3569 this.context.allowYield = true; 3570 var right = this.isolateCoverGrammar(this.parseAssignmentExpression); 3571 this.context.allowYield = previousAllowYield; 3572 pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right)); 3573 } 3574 return pattern; 3575 }; 3576 // https://tc39.github.io/ecma262/#sec-variable-statement 3577 Parser.prototype.parseVariableIdentifier = function (kind) { 3578 var node = this.createNode(); 3579 var token = this.nextToken(); 3580 if (token.type === 4 /* Keyword */ && token.value === 'yield') { 3581 if (this.context.strict) { 3582 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); 3583 } 3584 else if (!this.context.allowYield) { 3585 this.throwUnexpectedToken(token); 3586 } 3587 } 3588 else if (token.type !== 3 /* Identifier */) { 3589 if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) { 3590 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); 3591 } 3592 else { 3593 if (this.context.strict || token.value !== 'let' || kind !== 'var') { 3594 this.throwUnexpectedToken(token); 3595 } 3596 } 3597 } 3598 else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') { 3599 this.tolerateUnexpectedToken(token); 3600 } 3601 return this.finalize(node, new Node.Identifier(token.value)); 3602 }; 3603 Parser.prototype.parseVariableDeclaration = function (options) { 3604 var node = this.createNode(); 3605 var params = []; 3606 var id = this.parsePattern(params, 'var'); 3607 if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { 3608 if (this.scanner.isRestrictedWord(id.name)) { 3609 this.tolerateError(messages_1.Messages.StrictVarName); 3610 } 3611 } 3612 var init = null; 3613 if (this.match('=')) { 3614 this.nextToken(); 3615 init = this.isolateCoverGrammar(this.parseAssignmentExpression); 3616 } 3617 else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) { 3618 this.expect('='); 3619 } 3620 return this.finalize(node, new Node.VariableDeclarator(id, init)); 3621 }; 3622 Parser.prototype.parseVariableDeclarationList = function (options) { 3623 var opt = { inFor: options.inFor }; 3624 var list = []; 3625 list.push(this.parseVariableDeclaration(opt)); 3626 while (this.match(',')) { 3627 this.nextToken(); 3628 list.push(this.parseVariableDeclaration(opt)); 3629 } 3630 return list; 3631 }; 3632 Parser.prototype.parseVariableStatement = function () { 3633 var node = this.createNode(); 3634 this.expectKeyword('var'); 3635 var declarations = this.parseVariableDeclarationList({ inFor: false }); 3636 this.consumeSemicolon(); 3637 return this.finalize(node, new Node.VariableDeclaration(declarations, 'var')); 3638 }; 3639 // https://tc39.github.io/ecma262/#sec-empty-statement 3640 Parser.prototype.parseEmptyStatement = function () { 3641 var node = this.createNode(); 3642 this.expect(';'); 3643 return this.finalize(node, new Node.EmptyStatement()); 3644 }; 3645 // https://tc39.github.io/ecma262/#sec-expression-statement 3646 Parser.prototype.parseExpressionStatement = function () { 3647 var node = this.createNode(); 3648 var expr = this.parseExpression(); 3649 this.consumeSemicolon(); 3650 return this.finalize(node, new Node.ExpressionStatement(expr)); 3651 }; 3652 // https://tc39.github.io/ecma262/#sec-if-statement 3653 Parser.prototype.parseIfClause = function () { 3654 if (this.context.strict && this.matchKeyword('function')) { 3655 this.tolerateError(messages_1.Messages.StrictFunction); 3656 } 3657 return this.parseStatement(); 3658 }; 3659 Parser.prototype.parseIfStatement = function () { 3660 var node = this.createNode(); 3661 var consequent; 3662 var alternate = null; 3663 this.expectKeyword('if'); 3664 this.expect('('); 3665 var test = this.parseExpression(); 3666 if (!this.match(')') && this.config.tolerant) { 3667 this.tolerateUnexpectedToken(this.nextToken()); 3668 consequent = this.finalize(this.createNode(), new Node.EmptyStatement()); 3669 } 3670 else { 3671 this.expect(')'); 3672 consequent = this.parseIfClause(); 3673 if (this.matchKeyword('else')) { 3674 this.nextToken(); 3675 alternate = this.parseIfClause(); 3676 } 3677 } 3678 return this.finalize(node, new Node.IfStatement(test, consequent, alternate)); 3679 }; 3680 // https://tc39.github.io/ecma262/#sec-do-while-statement 3681 Parser.prototype.parseDoWhileStatement = function () { 3682 var node = this.createNode(); 3683 this.expectKeyword('do'); 3684 var previousInIteration = this.context.inIteration; 3685 this.context.inIteration = true; 3686 var body = this.parseStatement(); 3687 this.context.inIteration = previousInIteration; 3688 this.expectKeyword('while'); 3689 this.expect('('); 3690 var test = this.parseExpression(); 3691 if (!this.match(')') && this.config.tolerant) { 3692 this.tolerateUnexpectedToken(this.nextToken()); 3693 } 3694 else { 3695 this.expect(')'); 3696 if (this.match(';')) { 3697 this.nextToken(); 3698 } 3699 } 3700 return this.finalize(node, new Node.DoWhileStatement(body, test)); 3701 }; 3702 // https://tc39.github.io/ecma262/#sec-while-statement 3703 Parser.prototype.parseWhileStatement = function () { 3704 var node = this.createNode(); 3705 var body; 3706 this.expectKeyword('while'); 3707 this.expect('('); 3708 var test = this.parseExpression(); 3709 if (!this.match(')') && this.config.tolerant) { 3710 this.tolerateUnexpectedToken(this.nextToken()); 3711 body = this.finalize(this.createNode(), new Node.EmptyStatement()); 3712 } 3713 else { 3714 this.expect(')'); 3715 var previousInIteration = this.context.inIteration; 3716 this.context.inIteration = true; 3717 body = this.parseStatement(); 3718 this.context.inIteration = previousInIteration; 3719 } 3720 return this.finalize(node, new Node.WhileStatement(test, body)); 3721 }; 3722 // https://tc39.github.io/ecma262/#sec-for-statement 3723 // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements 3724 Parser.prototype.parseForStatement = function () { 3725 var init = null; 3726 var test = null; 3727 var update = null; 3728 var forIn = true; 3729 var left, right; 3730 var node = this.createNode(); 3731 this.expectKeyword('for'); 3732 this.expect('('); 3733 if (this.match(';')) { 3734 this.nextToken(); 3735 } 3736 else { 3737 if (this.matchKeyword('var')) { 3738 init = this.createNode(); 3739 this.nextToken(); 3740 var previousAllowIn = this.context.allowIn; 3741 this.context.allowIn = false; 3742 var declarations = this.parseVariableDeclarationList({ inFor: true }); 3743 this.context.allowIn = previousAllowIn; 3744 if (declarations.length === 1 && this.matchKeyword('in')) { 3745 var decl = declarations[0]; 3746 if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) { 3747 this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in'); 3748 } 3749 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); 3750 this.nextToken(); 3751 left = init; 3752 right = this.parseExpression(); 3753 init = null; 3754 } 3755 else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { 3756 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); 3757 this.nextToken(); 3758 left = init; 3759 right = this.parseAssignmentExpression(); 3760 init = null; 3761 forIn = false; 3762 } 3763 else { 3764 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); 3765 this.expect(';'); 3766 } 3767 } 3768 else if (this.matchKeyword('const') || this.matchKeyword('let')) { 3769 init = this.createNode(); 3770 var kind = this.nextToken().value; 3771 if (!this.context.strict && this.lookahead.value === 'in') { 3772 init = this.finalize(init, new Node.Identifier(kind)); 3773 this.nextToken(); 3774 left = init; 3775 right = this.parseExpression(); 3776 init = null; 3777 } 3778 else { 3779 var previousAllowIn = this.context.allowIn; 3780 this.context.allowIn = false; 3781 var declarations = this.parseBindingList(kind, { inFor: true }); 3782 this.context.allowIn = previousAllowIn; 3783 if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) { 3784 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); 3785 this.nextToken(); 3786 left = init; 3787 right = this.parseExpression(); 3788 init = null; 3789 } 3790 else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { 3791 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); 3792 this.nextToken(); 3793 left = init; 3794 right = this.parseAssignmentExpression(); 3795 init = null; 3796 forIn = false; 3797 } 3798 else { 3799 this.consumeSemicolon(); 3800 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); 3801 } 3802 } 3803 } 3804 else { 3805 var initStartToken = this.lookahead; 3806 var previousAllowIn = this.context.allowIn; 3807 this.context.allowIn = false; 3808 init = this.inheritCoverGrammar(this.parseAssignmentExpression); 3809 this.context.allowIn = previousAllowIn; 3810 if (this.matchKeyword('in')) { 3811 if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { 3812 this.tolerateError(messages_1.Messages.InvalidLHSInForIn); 3813 } 3814 this.nextToken(); 3815 this.reinterpretExpressionAsPattern(init); 3816 left = init; 3817 right = this.parseExpression(); 3818 init = null; 3819 } 3820 else if (this.matchContextualKeyword('of')) { 3821 if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { 3822 this.tolerateError(messages_1.Messages.InvalidLHSInForLoop); 3823 } 3824 this.nextToken(); 3825 this.reinterpretExpressionAsPattern(init); 3826 left = init; 3827 right = this.parseAssignmentExpression(); 3828 init = null; 3829 forIn = false; 3830 } 3831 else { 3832 if (this.match(',')) { 3833 var initSeq = [init]; 3834 while (this.match(',')) { 3835 this.nextToken(); 3836 initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); 3837 } 3838 init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq)); 3839 } 3840 this.expect(';'); 3841 } 3842 } 3843 } 3844 if (typeof left === 'undefined') { 3845 if (!this.match(';')) { 3846 test = this.parseExpression(); 3847 } 3848 this.expect(';'); 3849 if (!this.match(')')) { 3850 update = this.parseExpression(); 3851 } 3852 } 3853 var body; 3854 if (!this.match(')') && this.config.tolerant) { 3855 this.tolerateUnexpectedToken(this.nextToken()); 3856 body = this.finalize(this.createNode(), new Node.EmptyStatement()); 3857 } 3858 else { 3859 this.expect(')'); 3860 var previousInIteration = this.context.inIteration; 3861 this.context.inIteration = true; 3862 body = this.isolateCoverGrammar(this.parseStatement); 3863 this.context.inIteration = previousInIteration; 3864 } 3865 return (typeof left === 'undefined') ? 3866 this.finalize(node, new Node.ForStatement(init, test, update, body)) : 3867 forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) : 3868 this.finalize(node, new Node.ForOfStatement(left, right, body)); 3869 }; 3870 // https://tc39.github.io/ecma262/#sec-continue-statement 3871 Parser.prototype.parseContinueStatement = function () { 3872 var node = this.createNode(); 3873 this.expectKeyword('continue'); 3874 var label = null; 3875 if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { 3876 var id = this.parseVariableIdentifier(); 3877 label = id; 3878 var key = '$' + id.name; 3879 if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { 3880 this.throwError(messages_1.Messages.UnknownLabel, id.name); 3881 } 3882 } 3883 this.consumeSemicolon(); 3884 if (label === null && !this.context.inIteration) { 3885 this.throwError(messages_1.Messages.IllegalContinue); 3886 } 3887 return this.finalize(node, new Node.ContinueStatement(label)); 3888 }; 3889 // https://tc39.github.io/ecma262/#sec-break-statement 3890 Parser.prototype.parseBreakStatement = function () { 3891 var node = this.createNode(); 3892 this.expectKeyword('break'); 3893 var label = null; 3894 if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { 3895 var id = this.parseVariableIdentifier(); 3896 var key = '$' + id.name; 3897 if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { 3898 this.throwError(messages_1.Messages.UnknownLabel, id.name); 3899 } 3900 label = id; 3901 } 3902 this.consumeSemicolon(); 3903 if (label === null && !this.context.inIteration && !this.context.inSwitch) { 3904 this.throwError(messages_1.Messages.IllegalBreak); 3905 } 3906 return this.finalize(node, new Node.BreakStatement(label)); 3907 }; 3908 // https://tc39.github.io/ecma262/#sec-return-statement 3909 Parser.prototype.parseReturnStatement = function () { 3910 if (!this.context.inFunctionBody) { 3911 this.tolerateError(messages_1.Messages.IllegalReturn); 3912 } 3913 var node = this.createNode(); 3914 this.expectKeyword('return'); 3915 var hasArgument = (!this.match(';') && !this.match('}') && 3916 !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */) || 3917 this.lookahead.type === 8 /* StringLiteral */ || 3918 this.lookahead.type === 10 /* Template */; 3919 var argument = hasArgument ? this.parseExpression() : null; 3920 this.consumeSemicolon(); 3921 return this.finalize(node, new Node.ReturnStatement(argument)); 3922 }; 3923 // https://tc39.github.io/ecma262/#sec-with-statement 3924 Parser.prototype.parseWithStatement = function () { 3925 if (this.context.strict) { 3926 this.tolerateError(messages_1.Messages.StrictModeWith); 3927 } 3928 var node = this.createNode(); 3929 var body; 3930 this.expectKeyword('with'); 3931 this.expect('('); 3932 var object = this.parseExpression(); 3933 if (!this.match(')') && this.config.tolerant) { 3934 this.tolerateUnexpectedToken(this.nextToken()); 3935 body = this.finalize(this.createNode(), new Node.EmptyStatement()); 3936 } 3937 else { 3938 this.expect(')'); 3939 body = this.parseStatement(); 3940 } 3941 return this.finalize(node, new Node.WithStatement(object, body)); 3942 }; 3943 // https://tc39.github.io/ecma262/#sec-switch-statement 3944 Parser.prototype.parseSwitchCase = function () { 3945 var node = this.createNode(); 3946 var test; 3947 if (this.matchKeyword('default')) { 3948 this.nextToken(); 3949 test = null; 3950 } 3951 else { 3952 this.expectKeyword('case'); 3953 test = this.parseExpression(); 3954 } 3955 this.expect(':'); 3956 var consequent = []; 3957 while (true) { 3958 if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) { 3959 break; 3960 } 3961 consequent.push(this.parseStatementListItem()); 3962 } 3963 return this.finalize(node, new Node.SwitchCase(test, consequent)); 3964 }; 3965 Parser.prototype.parseSwitchStatement = function () { 3966 var node = this.createNode(); 3967 this.expectKeyword('switch'); 3968 this.expect('('); 3969 var discriminant = this.parseExpression(); 3970 this.expect(')'); 3971 var previousInSwitch = this.context.inSwitch; 3972 this.context.inSwitch = true; 3973 var cases = []; 3974 var defaultFound = false; 3975 this.expect('{'); 3976 while (true) { 3977 if (this.match('}')) { 3978 break; 3979 } 3980 var clause = this.parseSwitchCase(); 3981 if (clause.test === null) { 3982 if (defaultFound) { 3983 this.throwError(messages_1.Messages.MultipleDefaultsInSwitch); 3984 } 3985 defaultFound = true; 3986 } 3987 cases.push(clause); 3988 } 3989 this.expect('}'); 3990 this.context.inSwitch = previousInSwitch; 3991 return this.finalize(node, new Node.SwitchStatement(discriminant, cases)); 3992 }; 3993 // https://tc39.github.io/ecma262/#sec-labelled-statements 3994 Parser.prototype.parseLabelledStatement = function () { 3995 var node = this.createNode(); 3996 var expr = this.parseExpression(); 3997 var statement; 3998 if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) { 3999 this.nextToken(); 4000 var id = expr; 4001 var key = '$' + id.name; 4002 if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { 4003 this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name); 4004 } 4005 this.context.labelSet[key] = true; 4006 var body = void 0; 4007 if (this.matchKeyword('class')) { 4008 this.tolerateUnexpectedToken(this.lookahead); 4009 body = this.parseClassDeclaration(); 4010 } 4011 else if (this.matchKeyword('function')) { 4012 var token = this.lookahead; 4013 var declaration = this.parseFunctionDeclaration(); 4014 if (this.context.strict) { 4015 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction); 4016 } 4017 else if (declaration.generator) { 4018 this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext); 4019 } 4020 body = declaration; 4021 } 4022 else { 4023 body = this.parseStatement(); 4024 } 4025 delete this.context.labelSet[key]; 4026 statement = new Node.LabeledStatement(id, body); 4027 } 4028 else { 4029 this.consumeSemicolon(); 4030 statement = new Node.ExpressionStatement(expr); 4031 } 4032 return this.finalize(node, statement); 4033 }; 4034 // https://tc39.github.io/ecma262/#sec-throw-statement 4035 Parser.prototype.parseThrowStatement = function () { 4036 var node = this.createNode(); 4037 this.expectKeyword('throw'); 4038 if (this.hasLineTerminator) { 4039 this.throwError(messages_1.Messages.NewlineAfterThrow); 4040 } 4041 var argument = this.parseExpression(); 4042 this.consumeSemicolon(); 4043 return this.finalize(node, new Node.ThrowStatement(argument)); 4044 }; 4045 // https://tc39.github.io/ecma262/#sec-try-statement 4046 Parser.prototype.parseCatchClause = function () { 4047 var node = this.createNode(); 4048 this.expectKeyword('catch'); 4049 this.expect('('); 4050 if (this.match(')')) { 4051 this.throwUnexpectedToken(this.lookahead); 4052 } 4053 var params = []; 4054 var param = this.parsePattern(params); 4055 var paramMap = {}; 4056 for (var i = 0; i < params.length; i++) { 4057 var key = '$' + params[i].value; 4058 if (Object.prototype.hasOwnProperty.call(paramMap, key)) { 4059 this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value); 4060 } 4061 paramMap[key] = true; 4062 } 4063 if (this.context.strict && param.type === syntax_1.Syntax.Identifier) { 4064 if (this.scanner.isRestrictedWord(param.name)) { 4065 this.tolerateError(messages_1.Messages.StrictCatchVariable); 4066 } 4067 } 4068 this.expect(')'); 4069 var body = this.parseBlock(); 4070 return this.finalize(node, new Node.CatchClause(param, body)); 4071 }; 4072 Parser.prototype.parseFinallyClause = function () { 4073 this.expectKeyword('finally'); 4074 return this.parseBlock(); 4075 }; 4076 Parser.prototype.parseTryStatement = function () { 4077 var node = this.createNode(); 4078 this.expectKeyword('try'); 4079 var block = this.parseBlock(); 4080 var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null; 4081 var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null; 4082 if (!handler && !finalizer) { 4083 this.throwError(messages_1.Messages.NoCatchOrFinally); 4084 } 4085 return this.finalize(node, new Node.TryStatement(block, handler, finalizer)); 4086 }; 4087 // https://tc39.github.io/ecma262/#sec-debugger-statement 4088 Parser.prototype.parseDebuggerStatement = function () { 4089 var node = this.createNode(); 4090 this.expectKeyword('debugger'); 4091 this.consumeSemicolon(); 4092 return this.finalize(node, new Node.DebuggerStatement()); 4093 }; 4094 // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations 4095 Parser.prototype.parseStatement = function () { 4096 var statement; 4097 switch (this.lookahead.type) { 4098 case 1 /* BooleanLiteral */: 4099 case 5 /* NullLiteral */: 4100 case 6 /* NumericLiteral */: 4101 case 8 /* StringLiteral */: 4102 case 10 /* Template */: 4103 case 9 /* RegularExpression */: 4104 statement = this.parseExpressionStatement(); 4105 break; 4106 case 7 /* Punctuator */: 4107 var value = this.lookahead.value; 4108 if (value === '{') { 4109 statement = this.parseBlock(); 4110 } 4111 else if (value === '(') { 4112 statement = this.parseExpressionStatement(); 4113 } 4114 else if (value === ';') { 4115 statement = this.parseEmptyStatement(); 4116 } 4117 else { 4118 statement = this.parseExpressionStatement(); 4119 } 4120 break; 4121 case 3 /* Identifier */: 4122 statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement(); 4123 break; 4124 case 4 /* Keyword */: 4125 switch (this.lookahead.value) { 4126 case 'break': 4127 statement = this.parseBreakStatement(); 4128 break; 4129 case 'continue': 4130 statement = this.parseContinueStatement(); 4131 break; 4132 case 'debugger': 4133 statement = this.parseDebuggerStatement(); 4134 break; 4135 case 'do': 4136 statement = this.parseDoWhileStatement(); 4137 break; 4138 case 'for': 4139 statement = this.parseForStatement(); 4140 break; 4141 case 'function': 4142 statement = this.parseFunctionDeclaration(); 4143 break; 4144 case 'if': 4145 statement = this.parseIfStatement(); 4146 break; 4147 case 'return': 4148 statement = this.parseReturnStatement(); 4149 break; 4150 case 'switch': 4151 statement = this.parseSwitchStatement(); 4152 break; 4153 case 'throw': 4154 statement = this.parseThrowStatement(); 4155 break; 4156 case 'try': 4157 statement = this.parseTryStatement(); 4158 break; 4159 case 'var': 4160 statement = this.parseVariableStatement(); 4161 break; 4162 case 'while': 4163 statement = this.parseWhileStatement(); 4164 break; 4165 case 'with': 4166 statement = this.parseWithStatement(); 4167 break; 4168 default: 4169 statement = this.parseExpressionStatement(); 4170 break; 4171 } 4172 break; 4173 default: 4174 statement = this.throwUnexpectedToken(this.lookahead); 4175 } 4176 return statement; 4177 }; 4178 // https://tc39.github.io/ecma262/#sec-function-definitions 4179 Parser.prototype.parseFunctionSourceElements = function () { 4180 var node = this.createNode(); 4181 this.expect('{'); 4182 var body = this.parseDirectivePrologues(); 4183 var previousLabelSet = this.context.labelSet; 4184 var previousInIteration = this.context.inIteration; 4185 var previousInSwitch = this.context.inSwitch; 4186 var previousInFunctionBody = this.context.inFunctionBody; 4187 this.context.labelSet = {}; 4188 this.context.inIteration = false; 4189 this.context.inSwitch = false; 4190 this.context.inFunctionBody = true; 4191 while (this.lookahead.type !== 2 /* EOF */) { 4192 if (this.match('}')) { 4193 break; 4194 } 4195 body.push(this.parseStatementListItem()); 4196 } 4197 this.expect('}'); 4198 this.context.labelSet = previousLabelSet; 4199 this.context.inIteration = previousInIteration; 4200 this.context.inSwitch = previousInSwitch; 4201 this.context.inFunctionBody = previousInFunctionBody; 4202 return this.finalize(node, new Node.BlockStatement(body)); 4203 }; 4204 Parser.prototype.validateParam = function (options, param, name) { 4205 var key = '$' + name; 4206 if (this.context.strict) { 4207 if (this.scanner.isRestrictedWord(name)) { 4208 options.stricted = param; 4209 options.message = messages_1.Messages.StrictParamName; 4210 } 4211 if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { 4212 options.stricted = param; 4213 options.message = messages_1.Messages.StrictParamDupe; 4214 } 4215 } 4216 else if (!options.firstRestricted) { 4217 if (this.scanner.isRestrictedWord(name)) { 4218 options.firstRestricted = param; 4219 options.message = messages_1.Messages.StrictParamName; 4220 } 4221 else if (this.scanner.isStrictModeReservedWord(name)) { 4222 options.firstRestricted = param; 4223 options.message = messages_1.Messages.StrictReservedWord; 4224 } 4225 else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { 4226 options.stricted = param; 4227 options.message = messages_1.Messages.StrictParamDupe; 4228 } 4229 } 4230 /* istanbul ignore next */ 4231 if (typeof Object.defineProperty === 'function') { 4232 Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true }); 4233 } 4234 else { 4235 options.paramSet[key] = true; 4236 } 4237 }; 4238 Parser.prototype.parseRestElement = function (params) { 4239 var node = this.createNode(); 4240 this.expect('...'); 4241 var arg = this.parsePattern(params); 4242 if (this.match('=')) { 4243 this.throwError(messages_1.Messages.DefaultRestParameter); 4244 } 4245 if (!this.match(')')) { 4246 this.throwError(messages_1.Messages.ParameterAfterRestParameter); 4247 } 4248 return this.finalize(node, new Node.RestElement(arg)); 4249 }; 4250 Parser.prototype.parseFormalParameter = function (options) { 4251 var params = []; 4252 var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params); 4253 for (var i = 0; i < params.length; i++) { 4254 this.validateParam(options, params[i], params[i].value); 4255 } 4256 options.simple = options.simple && (param instanceof Node.Identifier); 4257 options.params.push(param); 4258 }; 4259 Parser.prototype.parseFormalParameters = function (firstRestricted) { 4260 var options; 4261 options = { 4262 simple: true, 4263 params: [], 4264 firstRestricted: firstRestricted 4265 }; 4266 this.expect('('); 4267 if (!this.match(')')) { 4268 options.paramSet = {}; 4269 while (this.lookahead.type !== 2 /* EOF */) { 4270 this.parseFormalParameter(options); 4271 if (this.match(')')) { 4272 break; 4273 } 4274 this.expect(','); 4275 if (this.match(')')) { 4276 break; 4277 } 4278 } 4279 } 4280 this.expect(')'); 4281 return { 4282 simple: options.simple, 4283 params: options.params, 4284 stricted: options.stricted, 4285 firstRestricted: options.firstRestricted, 4286 message: options.message 4287 }; 4288 }; 4289 Parser.prototype.matchAsyncFunction = function () { 4290 var match = this.matchContextualKeyword('async'); 4291 if (match) { 4292 var state = this.scanner.saveState(); 4293 this.scanner.scanComments(); 4294 var next = this.scanner.lex(); 4295 this.scanner.restoreState(state); 4296 match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function'); 4297 } 4298 return match; 4299 }; 4300 Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) { 4301 var node = this.createNode(); 4302 var isAsync = this.matchContextualKeyword('async'); 4303 if (isAsync) { 4304 this.nextToken(); 4305 } 4306 this.expectKeyword('function'); 4307 var isGenerator = isAsync ? false : this.match('*'); 4308 if (isGenerator) { 4309 this.nextToken(); 4310 } 4311 var message; 4312 var id = null; 4313 var firstRestricted = null; 4314 if (!identifierIsOptional || !this.match('(')) { 4315 var token = this.lookahead; 4316 id = this.parseVariableIdentifier(); 4317 if (this.context.strict) { 4318 if (this.scanner.isRestrictedWord(token.value)) { 4319 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); 4320 } 4321 } 4322 else { 4323 if (this.scanner.isRestrictedWord(token.value)) { 4324 firstRestricted = token; 4325 message = messages_1.Messages.StrictFunctionName; 4326 } 4327 else if (this.scanner.isStrictModeReservedWord(token.value)) { 4328 firstRestricted = token; 4329 message = messages_1.Messages.StrictReservedWord; 4330 } 4331 } 4332 } 4333 var previousAllowAwait = this.context.await; 4334 var previousAllowYield = this.context.allowYield; 4335 this.context.await = isAsync; 4336 this.context.allowYield = !isGenerator; 4337 var formalParameters = this.parseFormalParameters(firstRestricted); 4338 var params = formalParameters.params; 4339 var stricted = formalParameters.stricted; 4340 firstRestricted = formalParameters.firstRestricted; 4341 if (formalParameters.message) { 4342 message = formalParameters.message; 4343 } 4344 var previousStrict = this.context.strict; 4345 var previousAllowStrictDirective = this.context.allowStrictDirective; 4346 this.context.allowStrictDirective = formalParameters.simple; 4347 var body = this.parseFunctionSourceElements(); 4348 if (this.context.strict && firstRestricted) { 4349 this.throwUnexpectedToken(firstRestricted, message); 4350 } 4351 if (this.context.strict && stricted) { 4352 this.tolerateUnexpectedToken(stricted, message); 4353 } 4354 this.context.strict = previousStrict; 4355 this.context.allowStrictDirective = previousAllowStrictDirective; 4356 this.context.await = previousAllowAwait; 4357 this.context.allowYield = previousAllowYield; 4358 return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) : 4359 this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator)); 4360 }; 4361 Parser.prototype.parseFunctionExpression = function () { 4362 var node = this.createNode(); 4363 var isAsync = this.matchContextualKeyword('async'); 4364 if (isAsync) { 4365 this.nextToken(); 4366 } 4367 this.expectKeyword('function'); 4368 var isGenerator = isAsync ? false : this.match('*'); 4369 if (isGenerator) { 4370 this.nextToken(); 4371 } 4372 var message; 4373 var id = null; 4374 var firstRestricted; 4375 var previousAllowAwait = this.context.await; 4376 var previousAllowYield = this.context.allowYield; 4377 this.context.await = isAsync; 4378 this.context.allowYield = !isGenerator; 4379 if (!this.match('(')) { 4380 var token = this.lookahead; 4381 id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier(); 4382 if (this.context.strict) { 4383 if (this.scanner.isRestrictedWord(token.value)) { 4384 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); 4385 } 4386 } 4387 else { 4388 if (this.scanner.isRestrictedWord(token.value)) { 4389 firstRestricted = token; 4390 message = messages_1.Messages.StrictFunctionName; 4391 } 4392 else if (this.scanner.isStrictModeReservedWord(token.value)) { 4393 firstRestricted = token; 4394 message = messages_1.Messages.StrictReservedWord; 4395 } 4396 } 4397 } 4398 var formalParameters = this.parseFormalParameters(firstRestricted); 4399 var params = formalParameters.params; 4400 var stricted = formalParameters.stricted; 4401 firstRestricted = formalParameters.firstRestricted; 4402 if (formalParameters.message) { 4403 message = formalParameters.message; 4404 } 4405 var previousStrict = this.context.strict; 4406 var previousAllowStrictDirective = this.context.allowStrictDirective; 4407 this.context.allowStrictDirective = formalParameters.simple; 4408 var body = this.parseFunctionSourceElements(); 4409 if (this.context.strict && firstRestricted) { 4410 this.throwUnexpectedToken(firstRestricted, message); 4411 } 4412 if (this.context.strict && stricted) { 4413 this.tolerateUnexpectedToken(stricted, message); 4414 } 4415 this.context.strict = previousStrict; 4416 this.context.allowStrictDirective = previousAllowStrictDirective; 4417 this.context.await = previousAllowAwait; 4418 this.context.allowYield = previousAllowYield; 4419 return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) : 4420 this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator)); 4421 }; 4422 // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive 4423 Parser.prototype.parseDirective = function () { 4424 var token = this.lookahead; 4425 var node = this.createNode(); 4426 var expr = this.parseExpression(); 4427 var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null; 4428 this.consumeSemicolon(); 4429 return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr)); 4430 }; 4431 Parser.prototype.parseDirectivePrologues = function () { 4432 var firstRestricted = null; 4433 var body = []; 4434 while (true) { 4435 var token = this.lookahead; 4436 if (token.type !== 8 /* StringLiteral */) { 4437 break; 4438 } 4439 var statement = this.parseDirective(); 4440 body.push(statement); 4441 var directive = statement.directive; 4442 if (typeof directive !== 'string') { 4443 break; 4444 } 4445 if (directive === 'use strict') { 4446 this.context.strict = true; 4447 if (firstRestricted) { 4448 this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral); 4449 } 4450 if (!this.context.allowStrictDirective) { 4451 this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective); 4452 } 4453 } 4454 else { 4455 if (!firstRestricted && token.octal) { 4456 firstRestricted = token; 4457 } 4458 } 4459 } 4460 return body; 4461 }; 4462 // https://tc39.github.io/ecma262/#sec-method-definitions 4463 Parser.prototype.qualifiedPropertyName = function (token) { 4464 switch (token.type) { 4465 case 3 /* Identifier */: 4466 case 8 /* StringLiteral */: 4467 case 1 /* BooleanLiteral */: 4468 case 5 /* NullLiteral */: 4469 case 6 /* NumericLiteral */: 4470 case 4 /* Keyword */: 4471 return true; 4472 case 7 /* Punctuator */: 4473 return token.value === '['; 4474 default: 4475 break; 4476 } 4477 return false; 4478 }; 4479 Parser.prototype.parseGetterMethod = function () { 4480 var node = this.createNode(); 4481 var isGenerator = false; 4482 var previousAllowYield = this.context.allowYield; 4483 this.context.allowYield = !isGenerator; 4484 var formalParameters = this.parseFormalParameters(); 4485 if (formalParameters.params.length > 0) { 4486 this.tolerateError(messages_1.Messages.BadGetterArity); 4487 } 4488 var method = this.parsePropertyMethod(formalParameters); 4489 this.context.allowYield = previousAllowYield; 4490 return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); 4491 }; 4492 Parser.prototype.parseSetterMethod = function () { 4493 var node = this.createNode(); 4494 var isGenerator = false; 4495 var previousAllowYield = this.context.allowYield; 4496 this.context.allowYield = !isGenerator; 4497 var formalParameters = this.parseFormalParameters(); 4498 if (formalParameters.params.length !== 1) { 4499 this.tolerateError(messages_1.Messages.BadSetterArity); 4500 } 4501 else if (formalParameters.params[0] instanceof Node.RestElement) { 4502 this.tolerateError(messages_1.Messages.BadSetterRestParameter); 4503 } 4504 var method = this.parsePropertyMethod(formalParameters); 4505 this.context.allowYield = previousAllowYield; 4506 return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); 4507 }; 4508 Parser.prototype.parseGeneratorMethod = function () { 4509 var node = this.createNode(); 4510 var isGenerator = true; 4511 var previousAllowYield = this.context.allowYield; 4512 this.context.allowYield = true; 4513 var params = this.parseFormalParameters(); 4514 this.context.allowYield = false; 4515 var method = this.parsePropertyMethod(params); 4516 this.context.allowYield = previousAllowYield; 4517 return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); 4518 }; 4519 // https://tc39.github.io/ecma262/#sec-generator-function-definitions 4520 Parser.prototype.isStartOfExpression = function () { 4521 var start = true; 4522 var value = this.lookahead.value; 4523 switch (this.lookahead.type) { 4524 case 7 /* Punctuator */: 4525 start = (value === '[') || (value === '(') || (value === '{') || 4526 (value === '+') || (value === '-') || 4527 (value === '!') || (value === '~') || 4528 (value === '++') || (value === '--') || 4529 (value === '/') || (value === '/='); // regular expression literal 4530 break; 4531 case 4 /* Keyword */: 4532 start = (value === 'class') || (value === 'delete') || 4533 (value === 'function') || (value === 'let') || (value === 'new') || 4534 (value === 'super') || (value === 'this') || (value === 'typeof') || 4535 (value === 'void') || (value === 'yield'); 4536 break; 4537 default: 4538 break; 4539 } 4540 return start; 4541 }; 4542 Parser.prototype.parseYieldExpression = function () { 4543 var node = this.createNode(); 4544 this.expectKeyword('yield'); 4545 var argument = null; 4546 var delegate = false; 4547 if (!this.hasLineTerminator) { 4548 var previousAllowYield = this.context.allowYield; 4549 this.context.allowYield = false; 4550 delegate = this.match('*'); 4551 if (delegate) { 4552 this.nextToken(); 4553 argument = this.parseAssignmentExpression(); 4554 } 4555 else if (this.isStartOfExpression()) { 4556 argument = this.parseAssignmentExpression(); 4557 } 4558 this.context.allowYield = previousAllowYield; 4559 } 4560 return this.finalize(node, new Node.YieldExpression(argument, delegate)); 4561 }; 4562 // https://tc39.github.io/ecma262/#sec-class-definitions 4563 Parser.prototype.parseClassElement = function (hasConstructor) { 4564 var token = this.lookahead; 4565 var node = this.createNode(); 4566 var kind = ''; 4567 var key = null; 4568 var value = null; 4569 var computed = false; 4570 var method = false; 4571 var isStatic = false; 4572 var isAsync = false; 4573 if (this.match('*')) { 4574 this.nextToken(); 4575 } 4576 else { 4577 computed = this.match('['); 4578 key = this.parseObjectPropertyKey(); 4579 var id = key; 4580 if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) { 4581 token = this.lookahead; 4582 isStatic = true; 4583 computed = this.match('['); 4584 if (this.match('*')) { 4585 this.nextToken(); 4586 } 4587 else { 4588 key = this.parseObjectPropertyKey(); 4589 } 4590 } 4591 if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) { 4592 var punctuator = this.lookahead.value; 4593 if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') { 4594 isAsync = true; 4595 token = this.lookahead; 4596 key = this.parseObjectPropertyKey(); 4597 if (token.type === 3 /* Identifier */ && token.value === 'constructor') { 4598 this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync); 4599 } 4600 } 4601 } 4602 } 4603 var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); 4604 if (token.type === 3 /* Identifier */) { 4605 if (token.value === 'get' && lookaheadPropertyKey) { 4606 kind = 'get'; 4607 computed = this.match('['); 4608 key = this.parseObjectPropertyKey(); 4609 this.context.allowYield = false; 4610 value = this.parseGetterMethod(); 4611 } 4612 else if (token.value === 'set' && lookaheadPropertyKey) { 4613 kind = 'set'; 4614 computed = this.match('['); 4615 key = this.parseObjectPropertyKey(); 4616 value = this.parseSetterMethod(); 4617 } 4618 } 4619 else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { 4620 kind = 'init'; 4621 computed = this.match('['); 4622 key = this.parseObjectPropertyKey(); 4623 value = this.parseGeneratorMethod(); 4624 method = true; 4625 } 4626 if (!kind && key && this.match('(')) { 4627 kind = 'init'; 4628 value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); 4629 method = true; 4630 } 4631 if (!kind) { 4632 this.throwUnexpectedToken(this.lookahead); 4633 } 4634 if (kind === 'init') { 4635 kind = 'method'; 4636 } 4637 if (!computed) { 4638 if (isStatic && this.isPropertyKey(key, 'prototype')) { 4639 this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype); 4640 } 4641 if (!isStatic && this.isPropertyKey(key, 'constructor')) { 4642 if (kind !== 'method' || !method || (value && value.generator)) { 4643 this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod); 4644 } 4645 if (hasConstructor.value) { 4646 this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor); 4647 } 4648 else { 4649 hasConstructor.value = true; 4650 } 4651 kind = 'constructor'; 4652 } 4653 } 4654 return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic)); 4655 }; 4656 Parser.prototype.parseClassElementList = function () { 4657 var body = []; 4658 var hasConstructor = { value: false }; 4659 this.expect('{'); 4660 while (!this.match('}')) { 4661 if (this.match(';')) { 4662 this.nextToken(); 4663 } 4664 else { 4665 body.push(this.parseClassElement(hasConstructor)); 4666 } 4667 } 4668 this.expect('}'); 4669 return body; 4670 }; 4671 Parser.prototype.parseClassBody = function () { 4672 var node = this.createNode(); 4673 var elementList = this.parseClassElementList(); 4674 return this.finalize(node, new Node.ClassBody(elementList)); 4675 }; 4676 Parser.prototype.parseClassDeclaration = function (identifierIsOptional) { 4677 var node = this.createNode(); 4678 var previousStrict = this.context.strict; 4679 this.context.strict = true; 4680 this.expectKeyword('class'); 4681 var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier(); 4682 var superClass = null; 4683 if (this.matchKeyword('extends')) { 4684 this.nextToken(); 4685 superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); 4686 } 4687 var classBody = this.parseClassBody(); 4688 this.context.strict = previousStrict; 4689 return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody)); 4690 }; 4691 Parser.prototype.parseClassExpression = function () { 4692 var node = this.createNode(); 4693 var previousStrict = this.context.strict; 4694 this.context.strict = true; 4695 this.expectKeyword('class'); 4696 var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null; 4697 var superClass = null; 4698 if (this.matchKeyword('extends')) { 4699 this.nextToken(); 4700 superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); 4701 } 4702 var classBody = this.parseClassBody(); 4703 this.context.strict = previousStrict; 4704 return this.finalize(node, new Node.ClassExpression(id, superClass, classBody)); 4705 }; 4706 // https://tc39.github.io/ecma262/#sec-scripts 4707 // https://tc39.github.io/ecma262/#sec-modules 4708 Parser.prototype.parseModule = function () { 4709 this.context.strict = true; 4710 this.context.isModule = true; 4711 this.scanner.isModule = true; 4712 var node = this.createNode(); 4713 var body = this.parseDirectivePrologues(); 4714 while (this.lookahead.type !== 2 /* EOF */) { 4715 body.push(this.parseStatementListItem()); 4716 } 4717 return this.finalize(node, new Node.Module(body)); 4718 }; 4719 Parser.prototype.parseScript = function () { 4720 var node = this.createNode(); 4721 var body = this.parseDirectivePrologues(); 4722 while (this.lookahead.type !== 2 /* EOF */) { 4723 body.push(this.parseStatementListItem()); 4724 } 4725 return this.finalize(node, new Node.Script(body)); 4726 }; 4727 // https://tc39.github.io/ecma262/#sec-imports 4728 Parser.prototype.parseModuleSpecifier = function () { 4729 var node = this.createNode(); 4730 if (this.lookahead.type !== 8 /* StringLiteral */) { 4731 this.throwError(messages_1.Messages.InvalidModuleSpecifier); 4732 } 4733 var token = this.nextToken(); 4734 var raw = this.getTokenRaw(token); 4735 return this.finalize(node, new Node.Literal(token.value, raw)); 4736 }; 4737 // import {<foo as bar>} ...; 4738 Parser.prototype.parseImportSpecifier = function () { 4739 var node = this.createNode(); 4740 var imported; 4741 var local; 4742 if (this.lookahead.type === 3 /* Identifier */) { 4743 imported = this.parseVariableIdentifier(); 4744 local = imported; 4745 if (this.matchContextualKeyword('as')) { 4746 this.nextToken(); 4747 local = this.parseVariableIdentifier(); 4748 } 4749 } 4750 else { 4751 imported = this.parseIdentifierName(); 4752 local = imported; 4753 if (this.matchContextualKeyword('as')) { 4754 this.nextToken(); 4755 local = this.parseVariableIdentifier(); 4756 } 4757 else { 4758 this.throwUnexpectedToken(this.nextToken()); 4759 } 4760 } 4761 return this.finalize(node, new Node.ImportSpecifier(local, imported)); 4762 }; 4763 // {foo, bar as bas} 4764 Parser.prototype.parseNamedImports = function () { 4765 this.expect('{'); 4766 var specifiers = []; 4767 while (!this.match('}')) { 4768 specifiers.push(this.parseImportSpecifier()); 4769 if (!this.match('}')) { 4770 this.expect(','); 4771 } 4772 } 4773 this.expect('}'); 4774 return specifiers; 4775 }; 4776 // import <foo> ...; 4777 Parser.prototype.parseImportDefaultSpecifier = function () { 4778 var node = this.createNode(); 4779 var local = this.parseIdentifierName(); 4780 return this.finalize(node, new Node.ImportDefaultSpecifier(local)); 4781 }; 4782 // import <* as foo> ...; 4783 Parser.prototype.parseImportNamespaceSpecifier = function () { 4784 var node = this.createNode(); 4785 this.expect('*'); 4786 if (!this.matchContextualKeyword('as')) { 4787 this.throwError(messages_1.Messages.NoAsAfterImportNamespace); 4788 } 4789 this.nextToken(); 4790 var local = this.parseIdentifierName(); 4791 return this.finalize(node, new Node.ImportNamespaceSpecifier(local)); 4792 }; 4793 Parser.prototype.parseImportDeclaration = function () { 4794 if (this.context.inFunctionBody) { 4795 this.throwError(messages_1.Messages.IllegalImportDeclaration); 4796 } 4797 var node = this.createNode(); 4798 this.expectKeyword('import'); 4799 var src; 4800 var specifiers = []; 4801 if (this.lookahead.type === 8 /* StringLiteral */) { 4802 // import 'foo'; 4803 src = this.parseModuleSpecifier(); 4804 } 4805 else { 4806 if (this.match('{')) { 4807 // import {bar} 4808 specifiers = specifiers.concat(this.parseNamedImports()); 4809 } 4810 else if (this.match('*')) { 4811 // import * as foo 4812 specifiers.push(this.parseImportNamespaceSpecifier()); 4813 } 4814 else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) { 4815 // import foo 4816 specifiers.push(this.parseImportDefaultSpecifier()); 4817 if (this.match(',')) { 4818 this.nextToken(); 4819 if (this.match('*')) { 4820 // import foo, * as foo 4821 specifiers.push(this.parseImportNamespaceSpecifier()); 4822 } 4823 else if (this.match('{')) { 4824 // import foo, {bar} 4825 specifiers = specifiers.concat(this.parseNamedImports()); 4826 } 4827 else { 4828 this.throwUnexpectedToken(this.lookahead); 4829 } 4830 } 4831 } 4832 else { 4833 this.throwUnexpectedToken(this.nextToken()); 4834 } 4835 if (!this.matchContextualKeyword('from')) { 4836 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; 4837 this.throwError(message, this.lookahead.value); 4838 } 4839 this.nextToken(); 4840 src = this.parseModuleSpecifier(); 4841 } 4842 this.consumeSemicolon(); 4843 return this.finalize(node, new Node.ImportDeclaration(specifiers, src)); 4844 }; 4845 // https://tc39.github.io/ecma262/#sec-exports 4846 Parser.prototype.parseExportSpecifier = function () { 4847 var node = this.createNode(); 4848 var local = this.parseIdentifierName(); 4849 var exported = local; 4850 if (this.matchContextualKeyword('as')) { 4851 this.nextToken(); 4852 exported = this.parseIdentifierName(); 4853 } 4854 return this.finalize(node, new Node.ExportSpecifier(local, exported)); 4855 }; 4856 Parser.prototype.parseExportDeclaration = function () { 4857 if (this.context.inFunctionBody) { 4858 this.throwError(messages_1.Messages.IllegalExportDeclaration); 4859 } 4860 var node = this.createNode(); 4861 this.expectKeyword('export'); 4862 var exportDeclaration; 4863 if (this.matchKeyword('default')) { 4864 // export default ... 4865 this.nextToken(); 4866 if (this.matchKeyword('function')) { 4867 // export default function foo () {} 4868 // export default function () {} 4869 var declaration = this.parseFunctionDeclaration(true); 4870 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); 4871 } 4872 else if (this.matchKeyword('class')) { 4873 // export default class foo {} 4874 var declaration = this.parseClassDeclaration(true); 4875 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); 4876 } 4877 else if (this.matchContextualKeyword('async')) { 4878 // export default async function f () {} 4879 // export default async function () {} 4880 // export default async x => x 4881 var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression(); 4882 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); 4883 } 4884 else { 4885 if (this.matchContextualKeyword('from')) { 4886 this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value); 4887 } 4888 // export default {}; 4889 // export default []; 4890 // export default (1 + 2); 4891 var declaration = this.match('{') ? this.parseObjectInitializer() : 4892 this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression(); 4893 this.consumeSemicolon(); 4894 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); 4895 } 4896 } 4897 else if (this.match('*')) { 4898 // export * from 'foo'; 4899 this.nextToken(); 4900 if (!this.matchContextualKeyword('from')) { 4901 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; 4902 this.throwError(message, this.lookahead.value); 4903 } 4904 this.nextToken(); 4905 var src = this.parseModuleSpecifier(); 4906 this.consumeSemicolon(); 4907 exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src)); 4908 } 4909 else if (this.lookahead.type === 4 /* Keyword */) { 4910 // export var f = 1; 4911 var declaration = void 0; 4912 switch (this.lookahead.value) { 4913 case 'let': 4914 case 'const': 4915 declaration = this.parseLexicalDeclaration({ inFor: false }); 4916 break; 4917 case 'var': 4918 case 'class': 4919 case 'function': 4920 declaration = this.parseStatementListItem(); 4921 break; 4922 default: 4923 this.throwUnexpectedToken(this.lookahead); 4924 } 4925 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); 4926 } 4927 else if (this.matchAsyncFunction()) { 4928 var declaration = this.parseFunctionDeclaration(); 4929 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); 4930 } 4931 else { 4932 var specifiers = []; 4933 var source = null; 4934 var isExportFromIdentifier = false; 4935 this.expect('{'); 4936 while (!this.match('}')) { 4937 isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default'); 4938 specifiers.push(this.parseExportSpecifier()); 4939 if (!this.match('}')) { 4940 this.expect(','); 4941 } 4942 } 4943 this.expect('}'); 4944 if (this.matchContextualKeyword('from')) { 4945 // export {default} from 'foo'; 4946 // export {foo} from 'foo'; 4947 this.nextToken(); 4948 source = this.parseModuleSpecifier(); 4949 this.consumeSemicolon(); 4950 } 4951 else if (isExportFromIdentifier) { 4952 // export {default}; // missing fromClause 4953 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; 4954 this.throwError(message, this.lookahead.value); 4955 } 4956 else { 4957 // export {foo}; 4958 this.consumeSemicolon(); 4959 } 4960 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source)); 4961 } 4962 return exportDeclaration; 4963 }; 4964 return Parser; 4965 }()); 4966 exports.Parser = Parser; 4967 4968 4969 /***/ }, 4970 /* 9 */ 4971 /***/ function(module, exports) { 4972 4973 "use strict"; 4974 // Ensure the condition is true, otherwise throw an error. 4975 // This is only to have a better contract semantic, i.e. another safety net 4976 // to catch a logic error. The condition shall be fulfilled in normal case. 4977 // Do NOT use this to enforce a certain condition on any user input. 4978 Object.defineProperty(exports, "__esModule", { value: true }); 4979 function assert(condition, message) { 4980 /* istanbul ignore if */ 4981 if (!condition) { 4982 throw new Error('ASSERT: ' + message); 4983 } 4984 } 4985 exports.assert = assert; 4986 4987 4988 /***/ }, 4989 /* 10 */ 4990 /***/ function(module, exports) { 4991 4992 "use strict"; 4993 /* tslint:disable:max-classes-per-file */ 4994 Object.defineProperty(exports, "__esModule", { value: true }); 4995 var ErrorHandler = (function () { 4996 function ErrorHandler() { 4997 this.errors = []; 4998 this.tolerant = false; 4999 } 5000 ErrorHandler.prototype.recordError = function (error) { 5001 this.errors.push(error); 5002 }; 5003 ErrorHandler.prototype.tolerate = function (error) { 5004 if (this.tolerant) { 5005 this.recordError(error); 5006 } 5007 else { 5008 throw error; 5009 } 5010 }; 5011 ErrorHandler.prototype.constructError = function (msg, column) { 5012 var error = new Error(msg); 5013 try { 5014 throw error; 5015 } 5016 catch (base) { 5017 /* istanbul ignore else */ 5018 if (Object.create && Object.defineProperty) { 5019 error = Object.create(base); 5020 Object.defineProperty(error, 'column', { value: column }); 5021 } 5022 } 5023 /* istanbul ignore next */ 5024 return error; 5025 }; 5026 ErrorHandler.prototype.createError = function (index, line, col, description) { 5027 var msg = 'Line ' + line + ': ' + description; 5028 var error = this.constructError(msg, col); 5029 error.index = index; 5030 error.lineNumber = line; 5031 error.description = description; 5032 return error; 5033 }; 5034 ErrorHandler.prototype.throwError = function (index, line, col, description) { 5035 throw this.createError(index, line, col, description); 5036 }; 5037 ErrorHandler.prototype.tolerateError = function (index, line, col, description) { 5038 var error = this.createError(index, line, col, description); 5039 if (this.tolerant) { 5040 this.recordError(error); 5041 } 5042 else { 5043 throw error; 5044 } 5045 }; 5046 return ErrorHandler; 5047 }()); 5048 exports.ErrorHandler = ErrorHandler; 5049 5050 5051 /***/ }, 5052 /* 11 */ 5053 /***/ function(module, exports) { 5054 5055 "use strict"; 5056 Object.defineProperty(exports, "__esModule", { value: true }); 5057 // Error messages should be identical to V8. 5058 exports.Messages = { 5059 BadGetterArity: 'Getter must not have any formal parameters', 5060 BadSetterArity: 'Setter must have exactly one formal parameter', 5061 BadSetterRestParameter: 'Setter function argument must not be a rest parameter', 5062 ConstructorIsAsync: 'Class constructor may not be an async method', 5063 ConstructorSpecialMethod: 'Class constructor may not be an accessor', 5064 DeclarationMissingInitializer: 'Missing initializer in %0 declaration', 5065 DefaultRestParameter: 'Unexpected token =', 5066 DuplicateBinding: 'Duplicate binding %0', 5067 DuplicateConstructor: 'A class may only have one constructor', 5068 DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals', 5069 ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer', 5070 GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts', 5071 IllegalBreak: 'Illegal break statement', 5072 IllegalContinue: 'Illegal continue statement', 5073 IllegalExportDeclaration: 'Unexpected token', 5074 IllegalImportDeclaration: 'Unexpected token', 5075 IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list', 5076 IllegalReturn: 'Illegal return statement', 5077 InvalidEscapedReservedWord: 'Keyword must not contain escaped characters', 5078 InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence', 5079 InvalidLHSInAssignment: 'Invalid left-hand side in assignment', 5080 InvalidLHSInForIn: 'Invalid left-hand side in for-in', 5081 InvalidLHSInForLoop: 'Invalid left-hand side in for-loop', 5082 InvalidModuleSpecifier: 'Unexpected token', 5083 InvalidRegExp: 'Invalid regular expression', 5084 LetInLexicalBinding: 'let is disallowed as a lexically bound name', 5085 MissingFromClause: 'Unexpected token', 5086 MultipleDefaultsInSwitch: 'More than one default clause in switch statement', 5087 NewlineAfterThrow: 'Illegal newline after throw', 5088 NoAsAfterImportNamespace: 'Unexpected token', 5089 NoCatchOrFinally: 'Missing catch or finally after try', 5090 ParameterAfterRestParameter: 'Rest parameter must be last formal parameter', 5091 Redeclaration: '%0 \'%1\' has already been declared', 5092 StaticPrototype: 'Classes may not have static property named prototype', 5093 StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', 5094 StrictDelete: 'Delete of an unqualified identifier in strict mode.', 5095 StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block', 5096 StrictFunctionName: 'Function name may not be eval or arguments in strict mode', 5097 StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', 5098 StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', 5099 StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', 5100 StrictModeWith: 'Strict mode code may not include a with statement', 5101 StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', 5102 StrictParamDupe: 'Strict mode function may not have duplicate parameter names', 5103 StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', 5104 StrictReservedWord: 'Use of future reserved word in strict mode', 5105 StrictVarName: 'Variable name may not be eval or arguments in strict mode', 5106 TemplateOctalLiteral: 'Octal literals are not allowed in template strings.', 5107 UnexpectedEOS: 'Unexpected end of input', 5108 UnexpectedIdentifier: 'Unexpected identifier', 5109 UnexpectedNumber: 'Unexpected number', 5110 UnexpectedReserved: 'Unexpected reserved word', 5111 UnexpectedString: 'Unexpected string', 5112 UnexpectedTemplate: 'Unexpected quasi %0', 5113 UnexpectedToken: 'Unexpected token %0', 5114 UnexpectedTokenIllegal: 'Unexpected token ILLEGAL', 5115 UnknownLabel: 'Undefined label \'%0\'', 5116 UnterminatedRegExp: 'Invalid regular expression: missing /' 5117 }; 5118 5119 5120 /***/ }, 5121 /* 12 */ 5122 /***/ function(module, exports, __webpack_require__) { 5123 5124 "use strict"; 5125 Object.defineProperty(exports, "__esModule", { value: true }); 5126 var assert_1 = __webpack_require__(9); 5127 var character_1 = __webpack_require__(4); 5128 var messages_1 = __webpack_require__(11); 5129 function hexValue(ch) { 5130 return '0123456789abcdef'.indexOf(ch.toLowerCase()); 5131 } 5132 function octalValue(ch) { 5133 return '01234567'.indexOf(ch); 5134 } 5135 var Scanner = (function () { 5136 function Scanner(code, handler) { 5137 this.source = code; 5138 this.errorHandler = handler; 5139 this.trackComment = false; 5140 this.isModule = false; 5141 this.length = code.length; 5142 this.index = 0; 5143 this.lineNumber = (code.length > 0) ? 1 : 0; 5144 this.lineStart = 0; 5145 this.curlyStack = []; 5146 } 5147 Scanner.prototype.saveState = function () { 5148 return { 5149 index: this.index, 5150 lineNumber: this.lineNumber, 5151 lineStart: this.lineStart 5152 }; 5153 }; 5154 Scanner.prototype.restoreState = function (state) { 5155 this.index = state.index; 5156 this.lineNumber = state.lineNumber; 5157 this.lineStart = state.lineStart; 5158 }; 5159 Scanner.prototype.eof = function () { 5160 return this.index >= this.length; 5161 }; 5162 Scanner.prototype.throwUnexpectedToken = function (message) { 5163 if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } 5164 return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); 5165 }; 5166 Scanner.prototype.tolerateUnexpectedToken = function (message) { 5167 if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } 5168 this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); 5169 }; 5170 // https://tc39.github.io/ecma262/#sec-comments 5171 Scanner.prototype.skipSingleLineComment = function (offset) { 5172 var comments = []; 5173 var start, loc; 5174 if (this.trackComment) { 5175 comments = []; 5176 start = this.index - offset; 5177 loc = { 5178 start: { 5179 line: this.lineNumber, 5180 column: this.index - this.lineStart - offset 5181 }, 5182 end: {} 5183 }; 5184 } 5185 while (!this.eof()) { 5186 var ch = this.source.charCodeAt(this.index); 5187 ++this.index; 5188 if (character_1.Character.isLineTerminator(ch)) { 5189 if (this.trackComment) { 5190 loc.end = { 5191 line: this.lineNumber, 5192 column: this.index - this.lineStart - 1 5193 }; 5194 var entry = { 5195 multiLine: false, 5196 slice: [start + offset, this.index - 1], 5197 range: [start, this.index - 1], 5198 loc: loc 5199 }; 5200 comments.push(entry); 5201 } 5202 if (ch === 13 && this.source.charCodeAt(this.index) === 10) { 5203 ++this.index; 5204 } 5205 ++this.lineNumber; 5206 this.lineStart = this.index; 5207 return comments; 5208 } 5209 } 5210 if (this.trackComment) { 5211 loc.end = { 5212 line: this.lineNumber, 5213 column: this.index - this.lineStart 5214 }; 5215 var entry = { 5216 multiLine: false, 5217 slice: [start + offset, this.index], 5218 range: [start, this.index], 5219 loc: loc 5220 }; 5221 comments.push(entry); 5222 } 5223 return comments; 5224 }; 5225 Scanner.prototype.skipMultiLineComment = function () { 5226 var comments = []; 5227 var start, loc; 5228 if (this.trackComment) { 5229 comments = []; 5230 start = this.index - 2; 5231 loc = { 5232 start: { 5233 line: this.lineNumber, 5234 column: this.index - this.lineStart - 2 5235 }, 5236 end: {} 5237 }; 5238 } 5239 while (!this.eof()) { 5240 var ch = this.source.charCodeAt(this.index); 5241 if (character_1.Character.isLineTerminator(ch)) { 5242 if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) { 5243 ++this.index; 5244 } 5245 ++this.lineNumber; 5246 ++this.index; 5247 this.lineStart = this.index; 5248 } 5249 else if (ch === 0x2A) { 5250 // Block comment ends with '*/'. 5251 if (this.source.charCodeAt(this.index + 1) === 0x2F) { 5252 this.index += 2; 5253 if (this.trackComment) { 5254 loc.end = { 5255 line: this.lineNumber, 5256 column: this.index - this.lineStart 5257 }; 5258 var entry = { 5259 multiLine: true, 5260 slice: [start + 2, this.index - 2], 5261 range: [start, this.index], 5262 loc: loc 5263 }; 5264 comments.push(entry); 5265 } 5266 return comments; 5267 } 5268 ++this.index; 5269 } 5270 else { 5271 ++this.index; 5272 } 5273 } 5274 // Ran off the end of the file - the whole thing is a comment 5275 if (this.trackComment) { 5276 loc.end = { 5277 line: this.lineNumber, 5278 column: this.index - this.lineStart 5279 }; 5280 var entry = { 5281 multiLine: true, 5282 slice: [start + 2, this.index], 5283 range: [start, this.index], 5284 loc: loc 5285 }; 5286 comments.push(entry); 5287 } 5288 this.tolerateUnexpectedToken(); 5289 return comments; 5290 }; 5291 Scanner.prototype.scanComments = function () { 5292 var comments; 5293 if (this.trackComment) { 5294 comments = []; 5295 } 5296 var start = (this.index === 0); 5297 while (!this.eof()) { 5298 var ch = this.source.charCodeAt(this.index); 5299 if (character_1.Character.isWhiteSpace(ch)) { 5300 ++this.index; 5301 } 5302 else if (character_1.Character.isLineTerminator(ch)) { 5303 ++this.index; 5304 if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) { 5305 ++this.index; 5306 } 5307 ++this.lineNumber; 5308 this.lineStart = this.index; 5309 start = true; 5310 } 5311 else if (ch === 0x2F) { 5312 ch = this.source.charCodeAt(this.index + 1); 5313 if (ch === 0x2F) { 5314 this.index += 2; 5315 var comment = this.skipSingleLineComment(2); 5316 if (this.trackComment) { 5317 comments = comments.concat(comment); 5318 } 5319 start = true; 5320 } 5321 else if (ch === 0x2A) { 5322 this.index += 2; 5323 var comment = this.skipMultiLineComment(); 5324 if (this.trackComment) { 5325 comments = comments.concat(comment); 5326 } 5327 } 5328 else { 5329 break; 5330 } 5331 } 5332 else if (start && ch === 0x2D) { 5333 // U+003E is '>' 5334 if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) { 5335 // '-->' is a single-line comment 5336 this.index += 3; 5337 var comment = this.skipSingleLineComment(3); 5338 if (this.trackComment) { 5339 comments = comments.concat(comment); 5340 } 5341 } 5342 else { 5343 break; 5344 } 5345 } 5346 else if (ch === 0x3C && !this.isModule) { 5347 if (this.source.slice(this.index + 1, this.index + 4) === '!--') { 5348 this.index += 4; // `<!--` 5349 var comment = this.skipSingleLineComment(4); 5350 if (this.trackComment) { 5351 comments = comments.concat(comment); 5352 } 5353 } 5354 else { 5355 break; 5356 } 5357 } 5358 else { 5359 break; 5360 } 5361 } 5362 return comments; 5363 }; 5364 // https://tc39.github.io/ecma262/#sec-future-reserved-words 5365 Scanner.prototype.isFutureReservedWord = function (id) { 5366 switch (id) { 5367 case 'enum': 5368 case 'export': 5369 case 'import': 5370 case 'super': 5371 return true; 5372 default: 5373 return false; 5374 } 5375 }; 5376 Scanner.prototype.isStrictModeReservedWord = function (id) { 5377 switch (id) { 5378 case 'implements': 5379 case 'interface': 5380 case 'package': 5381 case 'private': 5382 case 'protected': 5383 case 'public': 5384 case 'static': 5385 case 'yield': 5386 case 'let': 5387 return true; 5388 default: 5389 return false; 5390 } 5391 }; 5392 Scanner.prototype.isRestrictedWord = function (id) { 5393 return id === 'eval' || id === 'arguments'; 5394 }; 5395 // https://tc39.github.io/ecma262/#sec-keywords 5396 Scanner.prototype.isKeyword = function (id) { 5397 switch (id.length) { 5398 case 2: 5399 return (id === 'if') || (id === 'in') || (id === 'do'); 5400 case 3: 5401 return (id === 'var') || (id === 'for') || (id === 'new') || 5402 (id === 'try') || (id === 'let'); 5403 case 4: 5404 return (id === 'this') || (id === 'else') || (id === 'case') || 5405 (id === 'void') || (id === 'with') || (id === 'enum'); 5406 case 5: 5407 return (id === 'while') || (id === 'break') || (id === 'catch') || 5408 (id === 'throw') || (id === 'const') || (id === 'yield') || 5409 (id === 'class') || (id === 'super'); 5410 case 6: 5411 return (id === 'return') || (id === 'typeof') || (id === 'delete') || 5412 (id === 'switch') || (id === 'export') || (id === 'import'); 5413 case 7: 5414 return (id === 'default') || (id === 'finally') || (id === 'extends'); 5415 case 8: 5416 return (id === 'function') || (id === 'continue') || (id === 'debugger'); 5417 case 10: 5418 return (id === 'instanceof'); 5419 default: 5420 return false; 5421 } 5422 }; 5423 Scanner.prototype.codePointAt = function (i) { 5424 var cp = this.source.charCodeAt(i); 5425 if (cp >= 0xD800 && cp <= 0xDBFF) { 5426 var second = this.source.charCodeAt(i + 1); 5427 if (second >= 0xDC00 && second <= 0xDFFF) { 5428 var first = cp; 5429 cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; 5430 } 5431 } 5432 return cp; 5433 }; 5434 Scanner.prototype.scanHexEscape = function (prefix) { 5435 var len = (prefix === 'u') ? 4 : 2; 5436 var code = 0; 5437 for (var i = 0; i < len; ++i) { 5438 if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) { 5439 code = code * 16 + hexValue(this.source[this.index++]); 5440 } 5441 else { 5442 return null; 5443 } 5444 } 5445 return String.fromCharCode(code); 5446 }; 5447 Scanner.prototype.scanUnicodeCodePointEscape = function () { 5448 var ch = this.source[this.index]; 5449 var code = 0; 5450 // At least, one hex digit is required. 5451 if (ch === '}') { 5452 this.throwUnexpectedToken(); 5453 } 5454 while (!this.eof()) { 5455 ch = this.source[this.index++]; 5456 if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) { 5457 break; 5458 } 5459 code = code * 16 + hexValue(ch); 5460 } 5461 if (code > 0x10FFFF || ch !== '}') { 5462 this.throwUnexpectedToken(); 5463 } 5464 return character_1.Character.fromCodePoint(code); 5465 }; 5466 Scanner.prototype.getIdentifier = function () { 5467 var start = this.index++; 5468 while (!this.eof()) { 5469 var ch = this.source.charCodeAt(this.index); 5470 if (ch === 0x5C) { 5471 // Blackslash (U+005C) marks Unicode escape sequence. 5472 this.index = start; 5473 return this.getComplexIdentifier(); 5474 } 5475 else if (ch >= 0xD800 && ch < 0xDFFF) { 5476 // Need to handle surrogate pairs. 5477 this.index = start; 5478 return this.getComplexIdentifier(); 5479 } 5480 if (character_1.Character.isIdentifierPart(ch)) { 5481 ++this.index; 5482 } 5483 else { 5484 break; 5485 } 5486 } 5487 return this.source.slice(start, this.index); 5488 }; 5489 Scanner.prototype.getComplexIdentifier = function () { 5490 var cp = this.codePointAt(this.index); 5491 var id = character_1.Character.fromCodePoint(cp); 5492 this.index += id.length; 5493 // '\u' (U+005C, U+0075) denotes an escaped character. 5494 var ch; 5495 if (cp === 0x5C) { 5496 if (this.source.charCodeAt(this.index) !== 0x75) { 5497 this.throwUnexpectedToken(); 5498 } 5499 ++this.index; 5500 if (this.source[this.index] === '{') { 5501 ++this.index; 5502 ch = this.scanUnicodeCodePointEscape(); 5503 } 5504 else { 5505 ch = this.scanHexEscape('u'); 5506 if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) { 5507 this.throwUnexpectedToken(); 5508 } 5509 } 5510 id = ch; 5511 } 5512 while (!this.eof()) { 5513 cp = this.codePointAt(this.index); 5514 if (!character_1.Character.isIdentifierPart(cp)) { 5515 break; 5516 } 5517 ch = character_1.Character.fromCodePoint(cp); 5518 id += ch; 5519 this.index += ch.length; 5520 // '\u' (U+005C, U+0075) denotes an escaped character. 5521 if (cp === 0x5C) { 5522 id = id.substr(0, id.length - 1); 5523 if (this.source.charCodeAt(this.index) !== 0x75) { 5524 this.throwUnexpectedToken(); 5525 } 5526 ++this.index; 5527 if (this.source[this.index] === '{') { 5528 ++this.index; 5529 ch = this.scanUnicodeCodePointEscape(); 5530 } 5531 else { 5532 ch = this.scanHexEscape('u'); 5533 if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) { 5534 this.throwUnexpectedToken(); 5535 } 5536 } 5537 id += ch; 5538 } 5539 } 5540 return id; 5541 }; 5542 Scanner.prototype.octalToDecimal = function (ch) { 5543 // \0 is not octal escape sequence 5544 var octal = (ch !== '0'); 5545 var code = octalValue(ch); 5546 if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { 5547 octal = true; 5548 code = code * 8 + octalValue(this.source[this.index++]); 5549 // 3 digits are only allowed when string starts 5550 // with 0, 1, 2, 3 5551 if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { 5552 code = code * 8 + octalValue(this.source[this.index++]); 5553 } 5554 } 5555 return { 5556 code: code, 5557 octal: octal 5558 }; 5559 }; 5560 // https://tc39.github.io/ecma262/#sec-names-and-keywords 5561 Scanner.prototype.scanIdentifier = function () { 5562 var type; 5563 var start = this.index; 5564 // Backslash (U+005C) starts an escaped character. 5565 var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier(); 5566 // There is no keyword or literal with only one character. 5567 // Thus, it must be an identifier. 5568 if (id.length === 1) { 5569 type = 3 /* Identifier */; 5570 } 5571 else if (this.isKeyword(id)) { 5572 type = 4 /* Keyword */; 5573 } 5574 else if (id === 'null') { 5575 type = 5 /* NullLiteral */; 5576 } 5577 else if (id === 'true' || id === 'false') { 5578 type = 1 /* BooleanLiteral */; 5579 } 5580 else { 5581 type = 3 /* Identifier */; 5582 } 5583 if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) { 5584 var restore = this.index; 5585 this.index = start; 5586 this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord); 5587 this.index = restore; 5588 } 5589 return { 5590 type: type, 5591 value: id, 5592 lineNumber: this.lineNumber, 5593 lineStart: this.lineStart, 5594 start: start, 5595 end: this.index 5596 }; 5597 }; 5598 // https://tc39.github.io/ecma262/#sec-punctuators 5599 Scanner.prototype.scanPunctuator = function () { 5600 var start = this.index; 5601 // Check for most common single-character punctuators. 5602 var str = this.source[this.index]; 5603 switch (str) { 5604 case '(': 5605 case '{': 5606 if (str === '{') { 5607 this.curlyStack.push('{'); 5608 } 5609 ++this.index; 5610 break; 5611 case '.': 5612 ++this.index; 5613 if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') { 5614 // Spread operator: ... 5615 this.index += 2; 5616 str = '...'; 5617 } 5618 break; 5619 case '}': 5620 ++this.index; 5621 this.curlyStack.pop(); 5622 break; 5623 case ')': 5624 case ';': 5625 case ',': 5626 case '[': 5627 case ']': 5628 case ':': 5629 case '?': 5630 case '~': 5631 ++this.index; 5632 break; 5633 default: 5634 // 4-character punctuator. 5635 str = this.source.substr(this.index, 4); 5636 if (str === '>>>=') { 5637 this.index += 4; 5638 } 5639 else { 5640 // 3-character punctuators. 5641 str = str.substr(0, 3); 5642 if (str === '===' || str === '!==' || str === '>>>' || 5643 str === '<<=' || str === '>>=' || str === '**=') { 5644 this.index += 3; 5645 } 5646 else { 5647 // 2-character punctuators. 5648 str = str.substr(0, 2); 5649 if (str === '&&' || str === '||' || str === '==' || str === '!=' || 5650 str === '+=' || str === '-=' || str === '*=' || str === '/=' || 5651 str === '++' || str === '--' || str === '<<' || str === '>>' || 5652 str === '&=' || str === '|=' || str === '^=' || str === '%=' || 5653 str === '<=' || str === '>=' || str === '=>' || str === '**') { 5654 this.index += 2; 5655 } 5656 else { 5657 // 1-character punctuators. 5658 str = this.source[this.index]; 5659 if ('<>=!+-*%&|^/'.indexOf(str) >= 0) { 5660 ++this.index; 5661 } 5662 } 5663 } 5664 } 5665 } 5666 if (this.index === start) { 5667 this.throwUnexpectedToken(); 5668 } 5669 return { 5670 type: 7 /* Punctuator */, 5671 value: str, 5672 lineNumber: this.lineNumber, 5673 lineStart: this.lineStart, 5674 start: start, 5675 end: this.index 5676 }; 5677 }; 5678 // https://tc39.github.io/ecma262/#sec-literals-numeric-literals 5679 Scanner.prototype.scanHexLiteral = function (start) { 5680 var num = ''; 5681 while (!this.eof()) { 5682 if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) { 5683 break; 5684 } 5685 num += this.source[this.index++]; 5686 } 5687 if (num.length === 0) { 5688 this.throwUnexpectedToken(); 5689 } 5690 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) { 5691 this.throwUnexpectedToken(); 5692 } 5693 return { 5694 type: 6 /* NumericLiteral */, 5695 value: parseInt('0x' + num, 16), 5696 lineNumber: this.lineNumber, 5697 lineStart: this.lineStart, 5698 start: start, 5699 end: this.index 5700 }; 5701 }; 5702 Scanner.prototype.scanBinaryLiteral = function (start) { 5703 var num = ''; 5704 var ch; 5705 while (!this.eof()) { 5706 ch = this.source[this.index]; 5707 if (ch !== '0' && ch !== '1') { 5708 break; 5709 } 5710 num += this.source[this.index++]; 5711 } 5712 if (num.length === 0) { 5713 // only 0b or 0B 5714 this.throwUnexpectedToken(); 5715 } 5716 if (!this.eof()) { 5717 ch = this.source.charCodeAt(this.index); 5718 /* istanbul ignore else */ 5719 if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) { 5720 this.throwUnexpectedToken(); 5721 } 5722 } 5723 return { 5724 type: 6 /* NumericLiteral */, 5725 value: parseInt(num, 2), 5726 lineNumber: this.lineNumber, 5727 lineStart: this.lineStart, 5728 start: start, 5729 end: this.index 5730 }; 5731 }; 5732 Scanner.prototype.scanOctalLiteral = function (prefix, start) { 5733 var num = ''; 5734 var octal = false; 5735 if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) { 5736 octal = true; 5737 num = '0' + this.source[this.index++]; 5738 } 5739 else { 5740 ++this.index; 5741 } 5742 while (!this.eof()) { 5743 if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { 5744 break; 5745 } 5746 num += this.source[this.index++]; 5747 } 5748 if (!octal && num.length === 0) { 5749 // only 0o or 0O 5750 this.throwUnexpectedToken(); 5751 } 5752 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 5753 this.throwUnexpectedToken(); 5754 } 5755 return { 5756 type: 6 /* NumericLiteral */, 5757 value: parseInt(num, 8), 5758 octal: octal, 5759 lineNumber: this.lineNumber, 5760 lineStart: this.lineStart, 5761 start: start, 5762 end: this.index 5763 }; 5764 }; 5765 Scanner.prototype.isImplicitOctalLiteral = function () { 5766 // Implicit octal, unless there is a non-octal digit. 5767 // (Annex B.1.1 on Numeric Literals) 5768 for (var i = this.index + 1; i < this.length; ++i) { 5769 var ch = this.source[i]; 5770 if (ch === '8' || ch === '9') { 5771 return false; 5772 } 5773 if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) { 5774 return true; 5775 } 5776 } 5777 return true; 5778 }; 5779 Scanner.prototype.scanNumericLiteral = function () { 5780 var start = this.index; 5781 var ch = this.source[start]; 5782 assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point'); 5783 var num = ''; 5784 if (ch !== '.') { 5785 num = this.source[this.index++]; 5786 ch = this.source[this.index]; 5787 // Hex number starts with '0x'. 5788 // Octal number starts with '0'. 5789 // Octal number in ES6 starts with '0o'. 5790 // Binary number in ES6 starts with '0b'. 5791 if (num === '0') { 5792 if (ch === 'x' || ch === 'X') { 5793 ++this.index; 5794 return this.scanHexLiteral(start); 5795 } 5796 if (ch === 'b' || ch === 'B') { 5797 ++this.index; 5798 return this.scanBinaryLiteral(start); 5799 } 5800 if (ch === 'o' || ch === 'O') { 5801 return this.scanOctalLiteral(ch, start); 5802 } 5803 if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) { 5804 if (this.isImplicitOctalLiteral()) { 5805 return this.scanOctalLiteral(ch, start); 5806 } 5807 } 5808 } 5809 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 5810 num += this.source[this.index++]; 5811 } 5812 ch = this.source[this.index]; 5813 } 5814 if (ch === '.') { 5815 num += this.source[this.index++]; 5816 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 5817 num += this.source[this.index++]; 5818 } 5819 ch = this.source[this.index]; 5820 } 5821 if (ch === 'e' || ch === 'E') { 5822 num += this.source[this.index++]; 5823 ch = this.source[this.index]; 5824 if (ch === '+' || ch === '-') { 5825 num += this.source[this.index++]; 5826 } 5827 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 5828 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 5829 num += this.source[this.index++]; 5830 } 5831 } 5832 else { 5833 this.throwUnexpectedToken(); 5834 } 5835 } 5836 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) { 5837 this.throwUnexpectedToken(); 5838 } 5839 return { 5840 type: 6 /* NumericLiteral */, 5841 value: parseFloat(num), 5842 lineNumber: this.lineNumber, 5843 lineStart: this.lineStart, 5844 start: start, 5845 end: this.index 5846 }; 5847 }; 5848 // https://tc39.github.io/ecma262/#sec-literals-string-literals 5849 Scanner.prototype.scanStringLiteral = function () { 5850 var start = this.index; 5851 var quote = this.source[start]; 5852 assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote'); 5853 ++this.index; 5854 var octal = false; 5855 var str = ''; 5856 while (!this.eof()) { 5857 var ch = this.source[this.index++]; 5858 if (ch === quote) { 5859 quote = ''; 5860 break; 5861 } 5862 else if (ch === '\\') { 5863 ch = this.source[this.index++]; 5864 if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 5865 switch (ch) { 5866 case 'u': 5867 if (this.source[this.index] === '{') { 5868 ++this.index; 5869 str += this.scanUnicodeCodePointEscape(); 5870 } 5871 else { 5872 var unescaped_1 = this.scanHexEscape(ch); 5873 if (unescaped_1 === null) { 5874 this.throwUnexpectedToken(); 5875 } 5876 str += unescaped_1; 5877 } 5878 break; 5879 case 'x': 5880 var unescaped = this.scanHexEscape(ch); 5881 if (unescaped === null) { 5882 this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence); 5883 } 5884 str += unescaped; 5885 break; 5886 case 'n': 5887 str += '\n'; 5888 break; 5889 case 'r': 5890 str += '\r'; 5891 break; 5892 case 't': 5893 str += '\t'; 5894 break; 5895 case 'b': 5896 str += '\b'; 5897 break; 5898 case 'f': 5899 str += '\f'; 5900 break; 5901 case 'v': 5902 str += '\x0B'; 5903 break; 5904 case '8': 5905 case '9': 5906 str += ch; 5907 this.tolerateUnexpectedToken(); 5908 break; 5909 default: 5910 if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) { 5911 var octToDec = this.octalToDecimal(ch); 5912 octal = octToDec.octal || octal; 5913 str += String.fromCharCode(octToDec.code); 5914 } 5915 else { 5916 str += ch; 5917 } 5918 break; 5919 } 5920 } 5921 else { 5922 ++this.lineNumber; 5923 if (ch === '\r' && this.source[this.index] === '\n') { 5924 ++this.index; 5925 } 5926 this.lineStart = this.index; 5927 } 5928 } 5929 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 5930 break; 5931 } 5932 else { 5933 str += ch; 5934 } 5935 } 5936 if (quote !== '') { 5937 this.index = start; 5938 this.throwUnexpectedToken(); 5939 } 5940 return { 5941 type: 8 /* StringLiteral */, 5942 value: str, 5943 octal: octal, 5944 lineNumber: this.lineNumber, 5945 lineStart: this.lineStart, 5946 start: start, 5947 end: this.index 5948 }; 5949 }; 5950 // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components 5951 Scanner.prototype.scanTemplate = function () { 5952 var cooked = ''; 5953 var terminated = false; 5954 var start = this.index; 5955 var head = (this.source[start] === '`'); 5956 var tail = false; 5957 var rawOffset = 2; 5958 ++this.index; 5959 while (!this.eof()) { 5960 var ch = this.source[this.index++]; 5961 if (ch === '`') { 5962 rawOffset = 1; 5963 tail = true; 5964 terminated = true; 5965 break; 5966 } 5967 else if (ch === '$') { 5968 if (this.source[this.index] === '{') { 5969 this.curlyStack.push('${'); 5970 ++this.index; 5971 terminated = true; 5972 break; 5973 } 5974 cooked += ch; 5975 } 5976 else if (ch === '\\') { 5977 ch = this.source[this.index++]; 5978 if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 5979 switch (ch) { 5980 case 'n': 5981 cooked += '\n'; 5982 break; 5983 case 'r': 5984 cooked += '\r'; 5985 break; 5986 case 't': 5987 cooked += '\t'; 5988 break; 5989 case 'u': 5990 if (this.source[this.index] === '{') { 5991 ++this.index; 5992 cooked += this.scanUnicodeCodePointEscape(); 5993 } 5994 else { 5995 var restore = this.index; 5996 var unescaped_2 = this.scanHexEscape(ch); 5997 if (unescaped_2 !== null) { 5998 cooked += unescaped_2; 5999 } 6000 else { 6001 this.index = restore; 6002 cooked += ch; 6003 } 6004 } 6005 break; 6006 case 'x': 6007 var unescaped = this.scanHexEscape(ch); 6008 if (unescaped === null) { 6009 this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence); 6010 } 6011 cooked += unescaped; 6012 break; 6013 case 'b': 6014 cooked += '\b'; 6015 break; 6016 case 'f': 6017 cooked += '\f'; 6018 break; 6019 case 'v': 6020 cooked += '\v'; 6021 break; 6022 default: 6023 if (ch === '0') { 6024 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { 6025 // Illegal: \01 \02 and so on 6026 this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral); 6027 } 6028 cooked += '\0'; 6029 } 6030 else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) { 6031 // Illegal: \1 \2 6032 this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral); 6033 } 6034 else { 6035 cooked += ch; 6036 } 6037 break; 6038 } 6039 } 6040 else { 6041 ++this.lineNumber; 6042 if (ch === '\r' && this.source[this.index] === '\n') { 6043 ++this.index; 6044 } 6045 this.lineStart = this.index; 6046 } 6047 } 6048 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 6049 ++this.lineNumber; 6050 if (ch === '\r' && this.source[this.index] === '\n') { 6051 ++this.index; 6052 } 6053 this.lineStart = this.index; 6054 cooked += '\n'; 6055 } 6056 else { 6057 cooked += ch; 6058 } 6059 } 6060 if (!terminated) { 6061 this.throwUnexpectedToken(); 6062 } 6063 if (!head) { 6064 this.curlyStack.pop(); 6065 } 6066 return { 6067 type: 10 /* Template */, 6068 value: this.source.slice(start + 1, this.index - rawOffset), 6069 cooked: cooked, 6070 head: head, 6071 tail: tail, 6072 lineNumber: this.lineNumber, 6073 lineStart: this.lineStart, 6074 start: start, 6075 end: this.index 6076 }; 6077 }; 6078 // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals 6079 Scanner.prototype.testRegExp = function (pattern, flags) { 6080 // The BMP character to use as a replacement for astral symbols when 6081 // translating an ES6 "u"-flagged pattern to an ES5-compatible 6082 // approximation. 6083 // Note: replacing with '\uFFFF' enables false positives in unlikely 6084 // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid 6085 // pattern that would not be detected by this substitution. 6086 var astralSubstitute = '\uFFFF'; 6087 var tmp = pattern; 6088 var self = this; 6089 if (flags.indexOf('u') >= 0) { 6090 tmp = tmp 6091 .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) { 6092 var codePoint = parseInt($1 || $2, 16); 6093 if (codePoint > 0x10FFFF) { 6094 self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp); 6095 } 6096 if (codePoint <= 0xFFFF) { 6097 return String.fromCharCode(codePoint); 6098 } 6099 return astralSubstitute; 6100 }) 6101 .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute); 6102 } 6103 // First, detect invalid regular expressions. 6104 try { 6105 RegExp(tmp); 6106 } 6107 catch (e) { 6108 this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp); 6109 } 6110 // Return a regular expression object for this pattern-flag pair, or 6111 // `null` in case the current environment doesn't support the flags it 6112 // uses. 6113 try { 6114 return new RegExp(pattern, flags); 6115 } 6116 catch (exception) { 6117 /* istanbul ignore next */ 6118 return null; 6119 } 6120 }; 6121 Scanner.prototype.scanRegExpBody = function () { 6122 var ch = this.source[this.index]; 6123 assert_1.assert(ch === '/', 'Regular expression literal must start with a slash'); 6124 var str = this.source[this.index++]; 6125 var classMarker = false; 6126 var terminated = false; 6127 while (!this.eof()) { 6128 ch = this.source[this.index++]; 6129 str += ch; 6130 if (ch === '\\') { 6131 ch = this.source[this.index++]; 6132 // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals 6133 if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 6134 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); 6135 } 6136 str += ch; 6137 } 6138 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { 6139 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); 6140 } 6141 else if (classMarker) { 6142 if (ch === ']') { 6143 classMarker = false; 6144 } 6145 } 6146 else { 6147 if (ch === '/') { 6148 terminated = true; 6149 break; 6150 } 6151 else if (ch === '[') { 6152 classMarker = true; 6153 } 6154 } 6155 } 6156 if (!terminated) { 6157 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); 6158 } 6159 // Exclude leading and trailing slash. 6160 return str.substr(1, str.length - 2); 6161 }; 6162 Scanner.prototype.scanRegExpFlags = function () { 6163 var str = ''; 6164 var flags = ''; 6165 while (!this.eof()) { 6166 var ch = this.source[this.index]; 6167 if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) { 6168 break; 6169 } 6170 ++this.index; 6171 if (ch === '\\' && !this.eof()) { 6172 ch = this.source[this.index]; 6173 if (ch === 'u') { 6174 ++this.index; 6175 var restore = this.index; 6176 var char = this.scanHexEscape('u'); 6177 if (char !== null) { 6178 flags += char; 6179 for (str += '\\u'; restore < this.index; ++restore) { 6180 str += this.source[restore]; 6181 } 6182 } 6183 else { 6184 this.index = restore; 6185 flags += 'u'; 6186 str += '\\u'; 6187 } 6188 this.tolerateUnexpectedToken(); 6189 } 6190 else { 6191 str += '\\'; 6192 this.tolerateUnexpectedToken(); 6193 } 6194 } 6195 else { 6196 flags += ch; 6197 str += ch; 6198 } 6199 } 6200 return flags; 6201 }; 6202 Scanner.prototype.scanRegExp = function () { 6203 var start = this.index; 6204 var pattern = this.scanRegExpBody(); 6205 var flags = this.scanRegExpFlags(); 6206 var value = this.testRegExp(pattern, flags); 6207 return { 6208 type: 9 /* RegularExpression */, 6209 value: '', 6210 pattern: pattern, 6211 flags: flags, 6212 regex: value, 6213 lineNumber: this.lineNumber, 6214 lineStart: this.lineStart, 6215 start: start, 6216 end: this.index 6217 }; 6218 }; 6219 Scanner.prototype.lex = function () { 6220 if (this.eof()) { 6221 return { 6222 type: 2 /* EOF */, 6223 value: '', 6224 lineNumber: this.lineNumber, 6225 lineStart: this.lineStart, 6226 start: this.index, 6227 end: this.index 6228 }; 6229 } 6230 var cp = this.source.charCodeAt(this.index); 6231 if (character_1.Character.isIdentifierStart(cp)) { 6232 return this.scanIdentifier(); 6233 } 6234 // Very common: ( and ) and ; 6235 if (cp === 0x28 || cp === 0x29 || cp === 0x3B) { 6236 return this.scanPunctuator(); 6237 } 6238 // String literal starts with single quote (U+0027) or double quote (U+0022). 6239 if (cp === 0x27 || cp === 0x22) { 6240 return this.scanStringLiteral(); 6241 } 6242 // Dot (.) U+002E can also start a floating-point number, hence the need 6243 // to check the next character. 6244 if (cp === 0x2E) { 6245 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) { 6246 return this.scanNumericLiteral(); 6247 } 6248 return this.scanPunctuator(); 6249 } 6250 if (character_1.Character.isDecimalDigit(cp)) { 6251 return this.scanNumericLiteral(); 6252 } 6253 // Template literals start with ` (U+0060) for template head 6254 // or } (U+007D) for template middle or template tail. 6255 if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) { 6256 return this.scanTemplate(); 6257 } 6258 // Possible identifier start in a surrogate pair. 6259 if (cp >= 0xD800 && cp < 0xDFFF) { 6260 if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) { 6261 return this.scanIdentifier(); 6262 } 6263 } 6264 return this.scanPunctuator(); 6265 }; 6266 return Scanner; 6267 }()); 6268 exports.Scanner = Scanner; 6269 6270 6271 /***/ }, 6272 /* 13 */ 6273 /***/ function(module, exports) { 6274 6275 "use strict"; 6276 Object.defineProperty(exports, "__esModule", { value: true }); 6277 exports.TokenName = {}; 6278 exports.TokenName[1 /* BooleanLiteral */] = 'Boolean'; 6279 exports.TokenName[2 /* EOF */] = '<end>'; 6280 exports.TokenName[3 /* Identifier */] = 'Identifier'; 6281 exports.TokenName[4 /* Keyword */] = 'Keyword'; 6282 exports.TokenName[5 /* NullLiteral */] = 'Null'; 6283 exports.TokenName[6 /* NumericLiteral */] = 'Numeric'; 6284 exports.TokenName[7 /* Punctuator */] = 'Punctuator'; 6285 exports.TokenName[8 /* StringLiteral */] = 'String'; 6286 exports.TokenName[9 /* RegularExpression */] = 'RegularExpression'; 6287 exports.TokenName[10 /* Template */] = 'Template'; 6288 6289 6290 /***/ }, 6291 /* 14 */ 6292 /***/ function(module, exports) { 6293 6294 "use strict"; 6295 // Generated by generate-xhtml-entities.js. DO NOT MODIFY! 6296 Object.defineProperty(exports, "__esModule", { value: true }); 6297 exports.XHTMLEntities = { 6298 quot: '\u0022', 6299 amp: '\u0026', 6300 apos: '\u0027', 6301 gt: '\u003E', 6302 nbsp: '\u00A0', 6303 iexcl: '\u00A1', 6304 cent: '\u00A2', 6305 pound: '\u00A3', 6306 curren: '\u00A4', 6307 yen: '\u00A5', 6308 brvbar: '\u00A6', 6309 sect: '\u00A7', 6310 uml: '\u00A8', 6311 copy: '\u00A9', 6312 ordf: '\u00AA', 6313 laquo: '\u00AB', 6314 not: '\u00AC', 6315 shy: '\u00AD', 6316 reg: '\u00AE', 6317 macr: '\u00AF', 6318 deg: '\u00B0', 6319 plusmn: '\u00B1', 6320 sup2: '\u00B2', 6321 sup3: '\u00B3', 6322 acute: '\u00B4', 6323 micro: '\u00B5', 6324 para: '\u00B6', 6325 middot: '\u00B7', 6326 cedil: '\u00B8', 6327 sup1: '\u00B9', 6328 ordm: '\u00BA', 6329 raquo: '\u00BB', 6330 frac14: '\u00BC', 6331 frac12: '\u00BD', 6332 frac34: '\u00BE', 6333 iquest: '\u00BF', 6334 Agrave: '\u00C0', 6335 Aacute: '\u00C1', 6336 Acirc: '\u00C2', 6337 Atilde: '\u00C3', 6338 Auml: '\u00C4', 6339 Aring: '\u00C5', 6340 AElig: '\u00C6', 6341 Ccedil: '\u00C7', 6342 Egrave: '\u00C8', 6343 Eacute: '\u00C9', 6344 Ecirc: '\u00CA', 6345 Euml: '\u00CB', 6346 Igrave: '\u00CC', 6347 Iacute: '\u00CD', 6348 Icirc: '\u00CE', 6349 Iuml: '\u00CF', 6350 ETH: '\u00D0', 6351 Ntilde: '\u00D1', 6352 Ograve: '\u00D2', 6353 Oacute: '\u00D3', 6354 Ocirc: '\u00D4', 6355 Otilde: '\u00D5', 6356 Ouml: '\u00D6', 6357 times: '\u00D7', 6358 Oslash: '\u00D8', 6359 Ugrave: '\u00D9', 6360 Uacute: '\u00DA', 6361 Ucirc: '\u00DB', 6362 Uuml: '\u00DC', 6363 Yacute: '\u00DD', 6364 THORN: '\u00DE', 6365 szlig: '\u00DF', 6366 agrave: '\u00E0', 6367 aacute: '\u00E1', 6368 acirc: '\u00E2', 6369 atilde: '\u00E3', 6370 auml: '\u00E4', 6371 aring: '\u00E5', 6372 aelig: '\u00E6', 6373 ccedil: '\u00E7', 6374 egrave: '\u00E8', 6375 eacute: '\u00E9', 6376 ecirc: '\u00EA', 6377 euml: '\u00EB', 6378 igrave: '\u00EC', 6379 iacute: '\u00ED', 6380 icirc: '\u00EE', 6381 iuml: '\u00EF', 6382 eth: '\u00F0', 6383 ntilde: '\u00F1', 6384 ograve: '\u00F2', 6385 oacute: '\u00F3', 6386 ocirc: '\u00F4', 6387 otilde: '\u00F5', 6388 ouml: '\u00F6', 6389 divide: '\u00F7', 6390 oslash: '\u00F8', 6391 ugrave: '\u00F9', 6392 uacute: '\u00FA', 6393 ucirc: '\u00FB', 6394 uuml: '\u00FC', 6395 yacute: '\u00FD', 6396 thorn: '\u00FE', 6397 yuml: '\u00FF', 6398 OElig: '\u0152', 6399 oelig: '\u0153', 6400 Scaron: '\u0160', 6401 scaron: '\u0161', 6402 Yuml: '\u0178', 6403 fnof: '\u0192', 6404 circ: '\u02C6', 6405 tilde: '\u02DC', 6406 Alpha: '\u0391', 6407 Beta: '\u0392', 6408 Gamma: '\u0393', 6409 Delta: '\u0394', 6410 Epsilon: '\u0395', 6411 Zeta: '\u0396', 6412 Eta: '\u0397', 6413 Theta: '\u0398', 6414 Iota: '\u0399', 6415 Kappa: '\u039A', 6416 Lambda: '\u039B', 6417 Mu: '\u039C', 6418 Nu: '\u039D', 6419 Xi: '\u039E', 6420 Omicron: '\u039F', 6421 Pi: '\u03A0', 6422 Rho: '\u03A1', 6423 Sigma: '\u03A3', 6424 Tau: '\u03A4', 6425 Upsilon: '\u03A5', 6426 Phi: '\u03A6', 6427 Chi: '\u03A7', 6428 Psi: '\u03A8', 6429 Omega: '\u03A9', 6430 alpha: '\u03B1', 6431 beta: '\u03B2', 6432 gamma: '\u03B3', 6433 delta: '\u03B4', 6434 epsilon: '\u03B5', 6435 zeta: '\u03B6', 6436 eta: '\u03B7', 6437 theta: '\u03B8', 6438 iota: '\u03B9', 6439 kappa: '\u03BA', 6440 lambda: '\u03BB', 6441 mu: '\u03BC', 6442 nu: '\u03BD', 6443 xi: '\u03BE', 6444 omicron: '\u03BF', 6445 pi: '\u03C0', 6446 rho: '\u03C1', 6447 sigmaf: '\u03C2', 6448 sigma: '\u03C3', 6449 tau: '\u03C4', 6450 upsilon: '\u03C5', 6451 phi: '\u03C6', 6452 chi: '\u03C7', 6453 psi: '\u03C8', 6454 omega: '\u03C9', 6455 thetasym: '\u03D1', 6456 upsih: '\u03D2', 6457 piv: '\u03D6', 6458 ensp: '\u2002', 6459 emsp: '\u2003', 6460 thinsp: '\u2009', 6461 zwnj: '\u200C', 6462 zwj: '\u200D', 6463 lrm: '\u200E', 6464 rlm: '\u200F', 6465 ndash: '\u2013', 6466 mdash: '\u2014', 6467 lsquo: '\u2018', 6468 rsquo: '\u2019', 6469 sbquo: '\u201A', 6470 ldquo: '\u201C', 6471 rdquo: '\u201D', 6472 bdquo: '\u201E', 6473 dagger: '\u2020', 6474 Dagger: '\u2021', 6475 bull: '\u2022', 6476 hellip: '\u2026', 6477 permil: '\u2030', 6478 prime: '\u2032', 6479 Prime: '\u2033', 6480 lsaquo: '\u2039', 6481 rsaquo: '\u203A', 6482 oline: '\u203E', 6483 frasl: '\u2044', 6484 euro: '\u20AC', 6485 image: '\u2111', 6486 weierp: '\u2118', 6487 real: '\u211C', 6488 trade: '\u2122', 6489 alefsym: '\u2135', 6490 larr: '\u2190', 6491 uarr: '\u2191', 6492 rarr: '\u2192', 6493 darr: '\u2193', 6494 harr: '\u2194', 6495 crarr: '\u21B5', 6496 lArr: '\u21D0', 6497 uArr: '\u21D1', 6498 rArr: '\u21D2', 6499 dArr: '\u21D3', 6500 hArr: '\u21D4', 6501 forall: '\u2200', 6502 part: '\u2202', 6503 exist: '\u2203', 6504 empty: '\u2205', 6505 nabla: '\u2207', 6506 isin: '\u2208', 6507 notin: '\u2209', 6508 ni: '\u220B', 6509 prod: '\u220F', 6510 sum: '\u2211', 6511 minus: '\u2212', 6512 lowast: '\u2217', 6513 radic: '\u221A', 6514 prop: '\u221D', 6515 infin: '\u221E', 6516 ang: '\u2220', 6517 and: '\u2227', 6518 or: '\u2228', 6519 cap: '\u2229', 6520 cup: '\u222A', 6521 int: '\u222B', 6522 there4: '\u2234', 6523 sim: '\u223C', 6524 cong: '\u2245', 6525 asymp: '\u2248', 6526 ne: '\u2260', 6527 equiv: '\u2261', 6528 le: '\u2264', 6529 ge: '\u2265', 6530 sub: '\u2282', 6531 sup: '\u2283', 6532 nsub: '\u2284', 6533 sube: '\u2286', 6534 supe: '\u2287', 6535 oplus: '\u2295', 6536 otimes: '\u2297', 6537 perp: '\u22A5', 6538 sdot: '\u22C5', 6539 lceil: '\u2308', 6540 rceil: '\u2309', 6541 lfloor: '\u230A', 6542 rfloor: '\u230B', 6543 loz: '\u25CA', 6544 spades: '\u2660', 6545 clubs: '\u2663', 6546 hearts: '\u2665', 6547 diams: '\u2666', 6548 lang: '\u27E8', 6549 rang: '\u27E9' 6550 }; 6551 6552 6553 /***/ }, 6554 /* 15 */ 6555 /***/ function(module, exports, __webpack_require__) { 6556 6557 "use strict"; 6558 Object.defineProperty(exports, "__esModule", { value: true }); 6559 var error_handler_1 = __webpack_require__(10); 6560 var scanner_1 = __webpack_require__(12); 6561 var token_1 = __webpack_require__(13); 6562 var Reader = (function () { 6563 function Reader() { 6564 this.values = []; 6565 this.curly = this.paren = -1; 6566 } 6567 // A function following one of those tokens is an expression. 6568 Reader.prototype.beforeFunctionExpression = function (t) { 6569 return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', 6570 'return', 'case', 'delete', 'throw', 'void', 6571 // assignment operators 6572 '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=', 6573 '&=', '|=', '^=', ',', 6574 // binary/unary operators 6575 '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&', 6576 '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', 6577 '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0; 6578 }; 6579 // Determine if forward slash (/) is an operator or part of a regular expression 6580 // https://github.com/mozilla/sweet.js/wiki/design 6581 Reader.prototype.isRegexStart = function () { 6582 var previous = this.values[this.values.length - 1]; 6583 var regex = (previous !== null); 6584 switch (previous) { 6585 case 'this': 6586 case ']': 6587 regex = false; 6588 break; 6589 case ')': 6590 var keyword = this.values[this.paren - 1]; 6591 regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with'); 6592 break; 6593 case '}': 6594 // Dividing a function by anything makes little sense, 6595 // but we have to check for that. 6596 regex = false; 6597 if (this.values[this.curly - 3] === 'function') { 6598 // Anonymous function, e.g. function(){} /42 6599 var check = this.values[this.curly - 4]; 6600 regex = check ? !this.beforeFunctionExpression(check) : false; 6601 } 6602 else if (this.values[this.curly - 4] === 'function') { 6603 // Named function, e.g. function f(){} /42/ 6604 var check = this.values[this.curly - 5]; 6605 regex = check ? !this.beforeFunctionExpression(check) : true; 6606 } 6607 break; 6608 default: 6609 break; 6610 } 6611 return regex; 6612 }; 6613 Reader.prototype.push = function (token) { 6614 if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) { 6615 if (token.value === '{') { 6616 this.curly = this.values.length; 6617 } 6618 else if (token.value === '(') { 6619 this.paren = this.values.length; 6620 } 6621 this.values.push(token.value); 6622 } 6623 else { 6624 this.values.push(null); 6625 } 6626 }; 6627 return Reader; 6628 }()); 6629 var Tokenizer = (function () { 6630 function Tokenizer(code, config) { 6631 this.errorHandler = new error_handler_1.ErrorHandler(); 6632 this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false; 6633 this.scanner = new scanner_1.Scanner(code, this.errorHandler); 6634 this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false; 6635 this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false; 6636 this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false; 6637 this.buffer = []; 6638 this.reader = new Reader(); 6639 } 6640 Tokenizer.prototype.errors = function () { 6641 return this.errorHandler.errors; 6642 }; 6643 Tokenizer.prototype.getNextToken = function () { 6644 if (this.buffer.length === 0) { 6645 var comments = this.scanner.scanComments(); 6646 if (this.scanner.trackComment) { 6647 for (var i = 0; i < comments.length; ++i) { 6648 var e = comments[i]; 6649 var value = this.scanner.source.slice(e.slice[0], e.slice[1]); 6650 var comment = { 6651 type: e.multiLine ? 'BlockComment' : 'LineComment', 6652 value: value 6653 }; 6654 if (this.trackRange) { 6655 comment.range = e.range; 6656 } 6657 if (this.trackLoc) { 6658 comment.loc = e.loc; 6659 } 6660 this.buffer.push(comment); 6661 } 6662 } 6663 if (!this.scanner.eof()) { 6664 var loc = void 0; 6665 if (this.trackLoc) { 6666 loc = { 6667 start: { 6668 line: this.scanner.lineNumber, 6669 column: this.scanner.index - this.scanner.lineStart 6670 }, 6671 end: {} 6672 }; 6673 } 6674 var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart(); 6675 var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex(); 6676 this.reader.push(token); 6677 var entry = { 6678 type: token_1.TokenName[token.type], 6679 value: this.scanner.source.slice(token.start, token.end) 6680 }; 6681 if (this.trackRange) { 6682 entry.range = [token.start, token.end]; 6683 } 6684 if (this.trackLoc) { 6685 loc.end = { 6686 line: this.scanner.lineNumber, 6687 column: this.scanner.index - this.scanner.lineStart 6688 }; 6689 entry.loc = loc; 6690 } 6691 if (token.type === 9 /* RegularExpression */) { 6692 var pattern = token.pattern; 6693 var flags = token.flags; 6694 entry.regex = { pattern: pattern, flags: flags }; 6695 } 6696 this.buffer.push(entry); 6697 } 6698 } 6699 return this.buffer.shift(); 6700 }; 6701 return Tokenizer; 6702 }()); 6703 exports.Tokenizer = Tokenizer; 6704 6705 6706 /***/ } 6707 /******/ ]) 6708 }); 6709 ;