|
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.0'; |
|
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) { |
|
2114 return { |
|
2115 index: token.start, |
|
2116 line: token.lineNumber, |
|
2117 column: token.start - token.lineStart |
|
2118 }; |
|
2119 }; |
|
2120 Parser.prototype.finalize = function (marker, node) { |
|
2121 if (this.config.range) { |
|
2122 node.range = [marker.index, this.lastMarker.index]; |
|
2123 } |
|
2124 if (this.config.loc) { |
|
2125 node.loc = { |
|
2126 start: { |
|
2127 line: marker.line, |
|
2128 column: marker.column, |
|
2129 }, |
|
2130 end: { |
|
2131 line: this.lastMarker.line, |
|
2132 column: this.lastMarker.column |
|
2133 } |
|
2134 }; |
|
2135 if (this.config.source) { |
|
2136 node.loc.source = this.config.source; |
|
2137 } |
|
2138 } |
|
2139 if (this.delegate) { |
|
2140 var metadata = { |
|
2141 start: { |
|
2142 line: marker.line, |
|
2143 column: marker.column, |
|
2144 offset: marker.index |
|
2145 }, |
|
2146 end: { |
|
2147 line: this.lastMarker.line, |
|
2148 column: this.lastMarker.column, |
|
2149 offset: this.lastMarker.index |
|
2150 } |
|
2151 }; |
|
2152 this.delegate(node, metadata); |
|
2153 } |
|
2154 return node; |
|
2155 }; |
|
2156 // Expect the next token to match the specified punctuator. |
|
2157 // If not, an exception will be thrown. |
|
2158 Parser.prototype.expect = function (value) { |
|
2159 var token = this.nextToken(); |
|
2160 if (token.type !== 7 /* Punctuator */ || token.value !== value) { |
|
2161 this.throwUnexpectedToken(token); |
|
2162 } |
|
2163 }; |
|
2164 // Quietly expect a comma when in tolerant mode, otherwise delegates to expect(). |
|
2165 Parser.prototype.expectCommaSeparator = function () { |
|
2166 if (this.config.tolerant) { |
|
2167 var token = this.lookahead; |
|
2168 if (token.type === 7 /* Punctuator */ && token.value === ',') { |
|
2169 this.nextToken(); |
|
2170 } |
|
2171 else if (token.type === 7 /* Punctuator */ && token.value === ';') { |
|
2172 this.nextToken(); |
|
2173 this.tolerateUnexpectedToken(token); |
|
2174 } |
|
2175 else { |
|
2176 this.tolerateUnexpectedToken(token, messages_1.Messages.UnexpectedToken); |
|
2177 } |
|
2178 } |
|
2179 else { |
|
2180 this.expect(','); |
|
2181 } |
|
2182 }; |
|
2183 // Expect the next token to match the specified keyword. |
|
2184 // If not, an exception will be thrown. |
|
2185 Parser.prototype.expectKeyword = function (keyword) { |
|
2186 var token = this.nextToken(); |
|
2187 if (token.type !== 4 /* Keyword */ || token.value !== keyword) { |
|
2188 this.throwUnexpectedToken(token); |
|
2189 } |
|
2190 }; |
|
2191 // Return true if the next token matches the specified punctuator. |
|
2192 Parser.prototype.match = function (value) { |
|
2193 return this.lookahead.type === 7 /* Punctuator */ && this.lookahead.value === value; |
|
2194 }; |
|
2195 // Return true if the next token matches the specified keyword |
|
2196 Parser.prototype.matchKeyword = function (keyword) { |
|
2197 return this.lookahead.type === 4 /* Keyword */ && this.lookahead.value === keyword; |
|
2198 }; |
|
2199 // Return true if the next token matches the specified contextual keyword |
|
2200 // (where an identifier is sometimes a keyword depending on the context) |
|
2201 Parser.prototype.matchContextualKeyword = function (keyword) { |
|
2202 return this.lookahead.type === 3 /* Identifier */ && this.lookahead.value === keyword; |
|
2203 }; |
|
2204 // Return true if the next token is an assignment operator |
|
2205 Parser.prototype.matchAssign = function () { |
|
2206 if (this.lookahead.type !== 7 /* Punctuator */) { |
|
2207 return false; |
|
2208 } |
|
2209 var op = this.lookahead.value; |
|
2210 return op === '=' || |
|
2211 op === '*=' || |
|
2212 op === '**=' || |
|
2213 op === '/=' || |
|
2214 op === '%=' || |
|
2215 op === '+=' || |
|
2216 op === '-=' || |
|
2217 op === '<<=' || |
|
2218 op === '>>=' || |
|
2219 op === '>>>=' || |
|
2220 op === '&=' || |
|
2221 op === '^=' || |
|
2222 op === '|='; |
|
2223 }; |
|
2224 // Cover grammar support. |
|
2225 // |
|
2226 // When an assignment expression position starts with an left parenthesis, the determination of the type |
|
2227 // of the syntax is to be deferred arbitrarily long until the end of the parentheses pair (plus a lookahead) |
|
2228 // or the first comma. This situation also defers the determination of all the expressions nested in the pair. |
|
2229 // |
|
2230 // There are three productions that can be parsed in a parentheses pair that needs to be determined |
|
2231 // after the outermost pair is closed. They are: |
|
2232 // |
|
2233 // 1. AssignmentExpression |
|
2234 // 2. BindingElements |
|
2235 // 3. AssignmentTargets |
|
2236 // |
|
2237 // In order to avoid exponential backtracking, we use two flags to denote if the production can be |
|
2238 // binding element or assignment target. |
|
2239 // |
|
2240 // The three productions have the relationship: |
|
2241 // |
|
2242 // BindingElements ⊆ AssignmentTargets ⊆ AssignmentExpression |
|
2243 // |
|
2244 // with a single exception that CoverInitializedName when used directly in an Expression, generates |
|
2245 // an early error. Therefore, we need the third state, firstCoverInitializedNameError, to track the |
|
2246 // first usage of CoverInitializedName and report it when we reached the end of the parentheses pair. |
|
2247 // |
|
2248 // isolateCoverGrammar function runs the given parser function with a new cover grammar context, and it does not |
|
2249 // effect the current flags. This means the production the parser parses is only used as an expression. Therefore |
|
2250 // the CoverInitializedName check is conducted. |
|
2251 // |
|
2252 // inheritCoverGrammar function runs the given parse function with a new cover grammar context, and it propagates |
|
2253 // the flags outside of the parser. This means the production the parser parses is used as a part of a potential |
|
2254 // pattern. The CoverInitializedName check is deferred. |
|
2255 Parser.prototype.isolateCoverGrammar = function (parseFunction) { |
|
2256 var previousIsBindingElement = this.context.isBindingElement; |
|
2257 var previousIsAssignmentTarget = this.context.isAssignmentTarget; |
|
2258 var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; |
|
2259 this.context.isBindingElement = true; |
|
2260 this.context.isAssignmentTarget = true; |
|
2261 this.context.firstCoverInitializedNameError = null; |
|
2262 var result = parseFunction.call(this); |
|
2263 if (this.context.firstCoverInitializedNameError !== null) { |
|
2264 this.throwUnexpectedToken(this.context.firstCoverInitializedNameError); |
|
2265 } |
|
2266 this.context.isBindingElement = previousIsBindingElement; |
|
2267 this.context.isAssignmentTarget = previousIsAssignmentTarget; |
|
2268 this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError; |
|
2269 return result; |
|
2270 }; |
|
2271 Parser.prototype.inheritCoverGrammar = function (parseFunction) { |
|
2272 var previousIsBindingElement = this.context.isBindingElement; |
|
2273 var previousIsAssignmentTarget = this.context.isAssignmentTarget; |
|
2274 var previousFirstCoverInitializedNameError = this.context.firstCoverInitializedNameError; |
|
2275 this.context.isBindingElement = true; |
|
2276 this.context.isAssignmentTarget = true; |
|
2277 this.context.firstCoverInitializedNameError = null; |
|
2278 var result = parseFunction.call(this); |
|
2279 this.context.isBindingElement = this.context.isBindingElement && previousIsBindingElement; |
|
2280 this.context.isAssignmentTarget = this.context.isAssignmentTarget && previousIsAssignmentTarget; |
|
2281 this.context.firstCoverInitializedNameError = previousFirstCoverInitializedNameError || this.context.firstCoverInitializedNameError; |
|
2282 return result; |
|
2283 }; |
|
2284 Parser.prototype.consumeSemicolon = function () { |
|
2285 if (this.match(';')) { |
|
2286 this.nextToken(); |
|
2287 } |
|
2288 else if (!this.hasLineTerminator) { |
|
2289 if (this.lookahead.type !== 2 /* EOF */ && !this.match('}')) { |
|
2290 this.throwUnexpectedToken(this.lookahead); |
|
2291 } |
|
2292 this.lastMarker.index = this.startMarker.index; |
|
2293 this.lastMarker.line = this.startMarker.line; |
|
2294 this.lastMarker.column = this.startMarker.column; |
|
2295 } |
|
2296 }; |
|
2297 // https://tc39.github.io/ecma262/#sec-primary-expression |
|
2298 Parser.prototype.parsePrimaryExpression = function () { |
|
2299 var node = this.createNode(); |
|
2300 var expr; |
|
2301 var token, raw; |
|
2302 switch (this.lookahead.type) { |
|
2303 case 3 /* Identifier */: |
|
2304 if ((this.context.isModule || this.context.await) && this.lookahead.value === 'await') { |
|
2305 this.tolerateUnexpectedToken(this.lookahead); |
|
2306 } |
|
2307 expr = this.matchAsyncFunction() ? this.parseFunctionExpression() : this.finalize(node, new Node.Identifier(this.nextToken().value)); |
|
2308 break; |
|
2309 case 6 /* NumericLiteral */: |
|
2310 case 8 /* StringLiteral */: |
|
2311 if (this.context.strict && this.lookahead.octal) { |
|
2312 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.StrictOctalLiteral); |
|
2313 } |
|
2314 this.context.isAssignmentTarget = false; |
|
2315 this.context.isBindingElement = false; |
|
2316 token = this.nextToken(); |
|
2317 raw = this.getTokenRaw(token); |
|
2318 expr = this.finalize(node, new Node.Literal(token.value, raw)); |
|
2319 break; |
|
2320 case 1 /* BooleanLiteral */: |
|
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 === 'true', raw)); |
|
2326 break; |
|
2327 case 5 /* NullLiteral */: |
|
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(null, raw)); |
|
2333 break; |
|
2334 case 10 /* Template */: |
|
2335 expr = this.parseTemplateLiteral(); |
|
2336 break; |
|
2337 case 7 /* Punctuator */: |
|
2338 switch (this.lookahead.value) { |
|
2339 case '(': |
|
2340 this.context.isBindingElement = false; |
|
2341 expr = this.inheritCoverGrammar(this.parseGroupExpression); |
|
2342 break; |
|
2343 case '[': |
|
2344 expr = this.inheritCoverGrammar(this.parseArrayInitializer); |
|
2345 break; |
|
2346 case '{': |
|
2347 expr = this.inheritCoverGrammar(this.parseObjectInitializer); |
|
2348 break; |
|
2349 case '/': |
|
2350 case '/=': |
|
2351 this.context.isAssignmentTarget = false; |
|
2352 this.context.isBindingElement = false; |
|
2353 this.scanner.index = this.startMarker.index; |
|
2354 token = this.nextRegexToken(); |
|
2355 raw = this.getTokenRaw(token); |
|
2356 expr = this.finalize(node, new Node.RegexLiteral(token.regex, raw, token.pattern, token.flags)); |
|
2357 break; |
|
2358 default: |
|
2359 expr = this.throwUnexpectedToken(this.nextToken()); |
|
2360 } |
|
2361 break; |
|
2362 case 4 /* Keyword */: |
|
2363 if (!this.context.strict && this.context.allowYield && this.matchKeyword('yield')) { |
|
2364 expr = this.parseIdentifierName(); |
|
2365 } |
|
2366 else if (!this.context.strict && this.matchKeyword('let')) { |
|
2367 expr = this.finalize(node, new Node.Identifier(this.nextToken().value)); |
|
2368 } |
|
2369 else { |
|
2370 this.context.isAssignmentTarget = false; |
|
2371 this.context.isBindingElement = false; |
|
2372 if (this.matchKeyword('function')) { |
|
2373 expr = this.parseFunctionExpression(); |
|
2374 } |
|
2375 else if (this.matchKeyword('this')) { |
|
2376 this.nextToken(); |
|
2377 expr = this.finalize(node, new Node.ThisExpression()); |
|
2378 } |
|
2379 else if (this.matchKeyword('class')) { |
|
2380 expr = this.parseClassExpression(); |
|
2381 } |
|
2382 else { |
|
2383 expr = this.throwUnexpectedToken(this.nextToken()); |
|
2384 } |
|
2385 } |
|
2386 break; |
|
2387 default: |
|
2388 expr = this.throwUnexpectedToken(this.nextToken()); |
|
2389 } |
|
2390 return expr; |
|
2391 }; |
|
2392 // https://tc39.github.io/ecma262/#sec-array-initializer |
|
2393 Parser.prototype.parseSpreadElement = function () { |
|
2394 var node = this.createNode(); |
|
2395 this.expect('...'); |
|
2396 var arg = this.inheritCoverGrammar(this.parseAssignmentExpression); |
|
2397 return this.finalize(node, new Node.SpreadElement(arg)); |
|
2398 }; |
|
2399 Parser.prototype.parseArrayInitializer = function () { |
|
2400 var node = this.createNode(); |
|
2401 var elements = []; |
|
2402 this.expect('['); |
|
2403 while (!this.match(']')) { |
|
2404 if (this.match(',')) { |
|
2405 this.nextToken(); |
|
2406 elements.push(null); |
|
2407 } |
|
2408 else if (this.match('...')) { |
|
2409 var element = this.parseSpreadElement(); |
|
2410 if (!this.match(']')) { |
|
2411 this.context.isAssignmentTarget = false; |
|
2412 this.context.isBindingElement = false; |
|
2413 this.expect(','); |
|
2414 } |
|
2415 elements.push(element); |
|
2416 } |
|
2417 else { |
|
2418 elements.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); |
|
2419 if (!this.match(']')) { |
|
2420 this.expect(','); |
|
2421 } |
|
2422 } |
|
2423 } |
|
2424 this.expect(']'); |
|
2425 return this.finalize(node, new Node.ArrayExpression(elements)); |
|
2426 }; |
|
2427 // https://tc39.github.io/ecma262/#sec-object-initializer |
|
2428 Parser.prototype.parsePropertyMethod = function (params) { |
|
2429 this.context.isAssignmentTarget = false; |
|
2430 this.context.isBindingElement = false; |
|
2431 var previousStrict = this.context.strict; |
|
2432 var previousAllowStrictDirective = this.context.allowStrictDirective; |
|
2433 this.context.allowStrictDirective = params.simple; |
|
2434 var body = this.isolateCoverGrammar(this.parseFunctionSourceElements); |
|
2435 if (this.context.strict && params.firstRestricted) { |
|
2436 this.tolerateUnexpectedToken(params.firstRestricted, params.message); |
|
2437 } |
|
2438 if (this.context.strict && params.stricted) { |
|
2439 this.tolerateUnexpectedToken(params.stricted, params.message); |
|
2440 } |
|
2441 this.context.strict = previousStrict; |
|
2442 this.context.allowStrictDirective = previousAllowStrictDirective; |
|
2443 return body; |
|
2444 }; |
|
2445 Parser.prototype.parsePropertyMethodFunction = function () { |
|
2446 var isGenerator = false; |
|
2447 var node = this.createNode(); |
|
2448 var previousAllowYield = this.context.allowYield; |
|
2449 this.context.allowYield = false; |
|
2450 var params = this.parseFormalParameters(); |
|
2451 var method = this.parsePropertyMethod(params); |
|
2452 this.context.allowYield = previousAllowYield; |
|
2453 return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); |
|
2454 }; |
|
2455 Parser.prototype.parsePropertyMethodAsyncFunction = function () { |
|
2456 var node = this.createNode(); |
|
2457 var previousAllowYield = this.context.allowYield; |
|
2458 var previousAwait = this.context.await; |
|
2459 this.context.allowYield = false; |
|
2460 this.context.await = true; |
|
2461 var params = this.parseFormalParameters(); |
|
2462 var method = this.parsePropertyMethod(params); |
|
2463 this.context.allowYield = previousAllowYield; |
|
2464 this.context.await = previousAwait; |
|
2465 return this.finalize(node, new Node.AsyncFunctionExpression(null, params.params, method)); |
|
2466 }; |
|
2467 Parser.prototype.parseObjectPropertyKey = function () { |
|
2468 var node = this.createNode(); |
|
2469 var token = this.nextToken(); |
|
2470 var key; |
|
2471 switch (token.type) { |
|
2472 case 8 /* StringLiteral */: |
|
2473 case 6 /* NumericLiteral */: |
|
2474 if (this.context.strict && token.octal) { |
|
2475 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictOctalLiteral); |
|
2476 } |
|
2477 var raw = this.getTokenRaw(token); |
|
2478 key = this.finalize(node, new Node.Literal(token.value, raw)); |
|
2479 break; |
|
2480 case 3 /* Identifier */: |
|
2481 case 1 /* BooleanLiteral */: |
|
2482 case 5 /* NullLiteral */: |
|
2483 case 4 /* Keyword */: |
|
2484 key = this.finalize(node, new Node.Identifier(token.value)); |
|
2485 break; |
|
2486 case 7 /* Punctuator */: |
|
2487 if (token.value === '[') { |
|
2488 key = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
2489 this.expect(']'); |
|
2490 } |
|
2491 else { |
|
2492 key = this.throwUnexpectedToken(token); |
|
2493 } |
|
2494 break; |
|
2495 default: |
|
2496 key = this.throwUnexpectedToken(token); |
|
2497 } |
|
2498 return key; |
|
2499 }; |
|
2500 Parser.prototype.isPropertyKey = function (key, value) { |
|
2501 return (key.type === syntax_1.Syntax.Identifier && key.name === value) || |
|
2502 (key.type === syntax_1.Syntax.Literal && key.value === value); |
|
2503 }; |
|
2504 Parser.prototype.parseObjectProperty = function (hasProto) { |
|
2505 var node = this.createNode(); |
|
2506 var token = this.lookahead; |
|
2507 var kind; |
|
2508 var key = null; |
|
2509 var value = null; |
|
2510 var computed = false; |
|
2511 var method = false; |
|
2512 var shorthand = false; |
|
2513 var isAsync = false; |
|
2514 if (token.type === 3 /* Identifier */) { |
|
2515 var id = token.value; |
|
2516 this.nextToken(); |
|
2517 computed = this.match('['); |
|
2518 isAsync = !this.hasLineTerminator && (id === 'async') && |
|
2519 !this.match(':') && !this.match('(') && !this.match('*'); |
|
2520 key = isAsync ? this.parseObjectPropertyKey() : this.finalize(node, new Node.Identifier(id)); |
|
2521 } |
|
2522 else if (this.match('*')) { |
|
2523 this.nextToken(); |
|
2524 } |
|
2525 else { |
|
2526 computed = this.match('['); |
|
2527 key = this.parseObjectPropertyKey(); |
|
2528 } |
|
2529 var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); |
|
2530 if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'get' && lookaheadPropertyKey) { |
|
2531 kind = 'get'; |
|
2532 computed = this.match('['); |
|
2533 key = this.parseObjectPropertyKey(); |
|
2534 this.context.allowYield = false; |
|
2535 value = this.parseGetterMethod(); |
|
2536 } |
|
2537 else if (token.type === 3 /* Identifier */ && !isAsync && token.value === 'set' && lookaheadPropertyKey) { |
|
2538 kind = 'set'; |
|
2539 computed = this.match('['); |
|
2540 key = this.parseObjectPropertyKey(); |
|
2541 value = this.parseSetterMethod(); |
|
2542 } |
|
2543 else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { |
|
2544 kind = 'init'; |
|
2545 computed = this.match('['); |
|
2546 key = this.parseObjectPropertyKey(); |
|
2547 value = this.parseGeneratorMethod(); |
|
2548 method = true; |
|
2549 } |
|
2550 else { |
|
2551 if (!key) { |
|
2552 this.throwUnexpectedToken(this.lookahead); |
|
2553 } |
|
2554 kind = 'init'; |
|
2555 if (this.match(':') && !isAsync) { |
|
2556 if (!computed && this.isPropertyKey(key, '__proto__')) { |
|
2557 if (hasProto.value) { |
|
2558 this.tolerateError(messages_1.Messages.DuplicateProtoProperty); |
|
2559 } |
|
2560 hasProto.value = true; |
|
2561 } |
|
2562 this.nextToken(); |
|
2563 value = this.inheritCoverGrammar(this.parseAssignmentExpression); |
|
2564 } |
|
2565 else if (this.match('(')) { |
|
2566 value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); |
|
2567 method = true; |
|
2568 } |
|
2569 else if (token.type === 3 /* Identifier */) { |
|
2570 var id = this.finalize(node, new Node.Identifier(token.value)); |
|
2571 if (this.match('=')) { |
|
2572 this.context.firstCoverInitializedNameError = this.lookahead; |
|
2573 this.nextToken(); |
|
2574 shorthand = true; |
|
2575 var init = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
2576 value = this.finalize(node, new Node.AssignmentPattern(id, init)); |
|
2577 } |
|
2578 else { |
|
2579 shorthand = true; |
|
2580 value = id; |
|
2581 } |
|
2582 } |
|
2583 else { |
|
2584 this.throwUnexpectedToken(this.nextToken()); |
|
2585 } |
|
2586 } |
|
2587 return this.finalize(node, new Node.Property(kind, key, computed, value, method, shorthand)); |
|
2588 }; |
|
2589 Parser.prototype.parseObjectInitializer = function () { |
|
2590 var node = this.createNode(); |
|
2591 this.expect('{'); |
|
2592 var properties = []; |
|
2593 var hasProto = { value: false }; |
|
2594 while (!this.match('}')) { |
|
2595 properties.push(this.parseObjectProperty(hasProto)); |
|
2596 if (!this.match('}')) { |
|
2597 this.expectCommaSeparator(); |
|
2598 } |
|
2599 } |
|
2600 this.expect('}'); |
|
2601 return this.finalize(node, new Node.ObjectExpression(properties)); |
|
2602 }; |
|
2603 // https://tc39.github.io/ecma262/#sec-template-literals |
|
2604 Parser.prototype.parseTemplateHead = function () { |
|
2605 assert_1.assert(this.lookahead.head, 'Template literal must start with a template head'); |
|
2606 var node = this.createNode(); |
|
2607 var token = this.nextToken(); |
|
2608 var raw = token.value; |
|
2609 var cooked = token.cooked; |
|
2610 return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); |
|
2611 }; |
|
2612 Parser.prototype.parseTemplateElement = function () { |
|
2613 if (this.lookahead.type !== 10 /* Template */) { |
|
2614 this.throwUnexpectedToken(); |
|
2615 } |
|
2616 var node = this.createNode(); |
|
2617 var token = this.nextToken(); |
|
2618 var raw = token.value; |
|
2619 var cooked = token.cooked; |
|
2620 return this.finalize(node, new Node.TemplateElement({ raw: raw, cooked: cooked }, token.tail)); |
|
2621 }; |
|
2622 Parser.prototype.parseTemplateLiteral = function () { |
|
2623 var node = this.createNode(); |
|
2624 var expressions = []; |
|
2625 var quasis = []; |
|
2626 var quasi = this.parseTemplateHead(); |
|
2627 quasis.push(quasi); |
|
2628 while (!quasi.tail) { |
|
2629 expressions.push(this.parseExpression()); |
|
2630 quasi = this.parseTemplateElement(); |
|
2631 quasis.push(quasi); |
|
2632 } |
|
2633 return this.finalize(node, new Node.TemplateLiteral(quasis, expressions)); |
|
2634 }; |
|
2635 // https://tc39.github.io/ecma262/#sec-grouping-operator |
|
2636 Parser.prototype.reinterpretExpressionAsPattern = function (expr) { |
|
2637 switch (expr.type) { |
|
2638 case syntax_1.Syntax.Identifier: |
|
2639 case syntax_1.Syntax.MemberExpression: |
|
2640 case syntax_1.Syntax.RestElement: |
|
2641 case syntax_1.Syntax.AssignmentPattern: |
|
2642 break; |
|
2643 case syntax_1.Syntax.SpreadElement: |
|
2644 expr.type = syntax_1.Syntax.RestElement; |
|
2645 this.reinterpretExpressionAsPattern(expr.argument); |
|
2646 break; |
|
2647 case syntax_1.Syntax.ArrayExpression: |
|
2648 expr.type = syntax_1.Syntax.ArrayPattern; |
|
2649 for (var i = 0; i < expr.elements.length; i++) { |
|
2650 if (expr.elements[i] !== null) { |
|
2651 this.reinterpretExpressionAsPattern(expr.elements[i]); |
|
2652 } |
|
2653 } |
|
2654 break; |
|
2655 case syntax_1.Syntax.ObjectExpression: |
|
2656 expr.type = syntax_1.Syntax.ObjectPattern; |
|
2657 for (var i = 0; i < expr.properties.length; i++) { |
|
2658 this.reinterpretExpressionAsPattern(expr.properties[i].value); |
|
2659 } |
|
2660 break; |
|
2661 case syntax_1.Syntax.AssignmentExpression: |
|
2662 expr.type = syntax_1.Syntax.AssignmentPattern; |
|
2663 delete expr.operator; |
|
2664 this.reinterpretExpressionAsPattern(expr.left); |
|
2665 break; |
|
2666 default: |
|
2667 // Allow other node type for tolerant parsing. |
|
2668 break; |
|
2669 } |
|
2670 }; |
|
2671 Parser.prototype.parseGroupExpression = function () { |
|
2672 var expr; |
|
2673 this.expect('('); |
|
2674 if (this.match(')')) { |
|
2675 this.nextToken(); |
|
2676 if (!this.match('=>')) { |
|
2677 this.expect('=>'); |
|
2678 } |
|
2679 expr = { |
|
2680 type: ArrowParameterPlaceHolder, |
|
2681 params: [], |
|
2682 async: false |
|
2683 }; |
|
2684 } |
|
2685 else { |
|
2686 var startToken = this.lookahead; |
|
2687 var params = []; |
|
2688 if (this.match('...')) { |
|
2689 expr = this.parseRestElement(params); |
|
2690 this.expect(')'); |
|
2691 if (!this.match('=>')) { |
|
2692 this.expect('=>'); |
|
2693 } |
|
2694 expr = { |
|
2695 type: ArrowParameterPlaceHolder, |
|
2696 params: [expr], |
|
2697 async: false |
|
2698 }; |
|
2699 } |
|
2700 else { |
|
2701 var arrow = false; |
|
2702 this.context.isBindingElement = true; |
|
2703 expr = this.inheritCoverGrammar(this.parseAssignmentExpression); |
|
2704 if (this.match(',')) { |
|
2705 var expressions = []; |
|
2706 this.context.isAssignmentTarget = false; |
|
2707 expressions.push(expr); |
|
2708 while (this.lookahead.type !== 2 /* EOF */) { |
|
2709 if (!this.match(',')) { |
|
2710 break; |
|
2711 } |
|
2712 this.nextToken(); |
|
2713 if (this.match(')')) { |
|
2714 this.nextToken(); |
|
2715 for (var i = 0; i < expressions.length; i++) { |
|
2716 this.reinterpretExpressionAsPattern(expressions[i]); |
|
2717 } |
|
2718 arrow = true; |
|
2719 expr = { |
|
2720 type: ArrowParameterPlaceHolder, |
|
2721 params: expressions, |
|
2722 async: false |
|
2723 }; |
|
2724 } |
|
2725 else if (this.match('...')) { |
|
2726 if (!this.context.isBindingElement) { |
|
2727 this.throwUnexpectedToken(this.lookahead); |
|
2728 } |
|
2729 expressions.push(this.parseRestElement(params)); |
|
2730 this.expect(')'); |
|
2731 if (!this.match('=>')) { |
|
2732 this.expect('=>'); |
|
2733 } |
|
2734 this.context.isBindingElement = false; |
|
2735 for (var i = 0; i < expressions.length; i++) { |
|
2736 this.reinterpretExpressionAsPattern(expressions[i]); |
|
2737 } |
|
2738 arrow = true; |
|
2739 expr = { |
|
2740 type: ArrowParameterPlaceHolder, |
|
2741 params: expressions, |
|
2742 async: false |
|
2743 }; |
|
2744 } |
|
2745 else { |
|
2746 expressions.push(this.inheritCoverGrammar(this.parseAssignmentExpression)); |
|
2747 } |
|
2748 if (arrow) { |
|
2749 break; |
|
2750 } |
|
2751 } |
|
2752 if (!arrow) { |
|
2753 expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); |
|
2754 } |
|
2755 } |
|
2756 if (!arrow) { |
|
2757 this.expect(')'); |
|
2758 if (this.match('=>')) { |
|
2759 if (expr.type === syntax_1.Syntax.Identifier && expr.name === 'yield') { |
|
2760 arrow = true; |
|
2761 expr = { |
|
2762 type: ArrowParameterPlaceHolder, |
|
2763 params: [expr], |
|
2764 async: false |
|
2765 }; |
|
2766 } |
|
2767 if (!arrow) { |
|
2768 if (!this.context.isBindingElement) { |
|
2769 this.throwUnexpectedToken(this.lookahead); |
|
2770 } |
|
2771 if (expr.type === syntax_1.Syntax.SequenceExpression) { |
|
2772 for (var i = 0; i < expr.expressions.length; i++) { |
|
2773 this.reinterpretExpressionAsPattern(expr.expressions[i]); |
|
2774 } |
|
2775 } |
|
2776 else { |
|
2777 this.reinterpretExpressionAsPattern(expr); |
|
2778 } |
|
2779 var parameters = (expr.type === syntax_1.Syntax.SequenceExpression ? expr.expressions : [expr]); |
|
2780 expr = { |
|
2781 type: ArrowParameterPlaceHolder, |
|
2782 params: parameters, |
|
2783 async: false |
|
2784 }; |
|
2785 } |
|
2786 } |
|
2787 this.context.isBindingElement = false; |
|
2788 } |
|
2789 } |
|
2790 } |
|
2791 return expr; |
|
2792 }; |
|
2793 // https://tc39.github.io/ecma262/#sec-left-hand-side-expressions |
|
2794 Parser.prototype.parseArguments = function () { |
|
2795 this.expect('('); |
|
2796 var args = []; |
|
2797 if (!this.match(')')) { |
|
2798 while (true) { |
|
2799 var expr = this.match('...') ? this.parseSpreadElement() : |
|
2800 this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
2801 args.push(expr); |
|
2802 if (this.match(')')) { |
|
2803 break; |
|
2804 } |
|
2805 this.expectCommaSeparator(); |
|
2806 if (this.match(')')) { |
|
2807 break; |
|
2808 } |
|
2809 } |
|
2810 } |
|
2811 this.expect(')'); |
|
2812 return args; |
|
2813 }; |
|
2814 Parser.prototype.isIdentifierName = function (token) { |
|
2815 return token.type === 3 /* Identifier */ || |
|
2816 token.type === 4 /* Keyword */ || |
|
2817 token.type === 1 /* BooleanLiteral */ || |
|
2818 token.type === 5 /* NullLiteral */; |
|
2819 }; |
|
2820 Parser.prototype.parseIdentifierName = function () { |
|
2821 var node = this.createNode(); |
|
2822 var token = this.nextToken(); |
|
2823 if (!this.isIdentifierName(token)) { |
|
2824 this.throwUnexpectedToken(token); |
|
2825 } |
|
2826 return this.finalize(node, new Node.Identifier(token.value)); |
|
2827 }; |
|
2828 Parser.prototype.parseNewExpression = function () { |
|
2829 var node = this.createNode(); |
|
2830 var id = this.parseIdentifierName(); |
|
2831 assert_1.assert(id.name === 'new', 'New expression must start with `new`'); |
|
2832 var expr; |
|
2833 if (this.match('.')) { |
|
2834 this.nextToken(); |
|
2835 if (this.lookahead.type === 3 /* Identifier */ && this.context.inFunctionBody && this.lookahead.value === 'target') { |
|
2836 var property = this.parseIdentifierName(); |
|
2837 expr = new Node.MetaProperty(id, property); |
|
2838 } |
|
2839 else { |
|
2840 this.throwUnexpectedToken(this.lookahead); |
|
2841 } |
|
2842 } |
|
2843 else { |
|
2844 var callee = this.isolateCoverGrammar(this.parseLeftHandSideExpression); |
|
2845 var args = this.match('(') ? this.parseArguments() : []; |
|
2846 expr = new Node.NewExpression(callee, args); |
|
2847 this.context.isAssignmentTarget = false; |
|
2848 this.context.isBindingElement = false; |
|
2849 } |
|
2850 return this.finalize(node, expr); |
|
2851 }; |
|
2852 Parser.prototype.parseAsyncArgument = function () { |
|
2853 var arg = this.parseAssignmentExpression(); |
|
2854 this.context.firstCoverInitializedNameError = null; |
|
2855 return arg; |
|
2856 }; |
|
2857 Parser.prototype.parseAsyncArguments = function () { |
|
2858 this.expect('('); |
|
2859 var args = []; |
|
2860 if (!this.match(')')) { |
|
2861 while (true) { |
|
2862 var expr = this.match('...') ? this.parseSpreadElement() : |
|
2863 this.isolateCoverGrammar(this.parseAsyncArgument); |
|
2864 args.push(expr); |
|
2865 if (this.match(')')) { |
|
2866 break; |
|
2867 } |
|
2868 this.expectCommaSeparator(); |
|
2869 if (this.match(')')) { |
|
2870 break; |
|
2871 } |
|
2872 } |
|
2873 } |
|
2874 this.expect(')'); |
|
2875 return args; |
|
2876 }; |
|
2877 Parser.prototype.parseLeftHandSideExpressionAllowCall = function () { |
|
2878 var startToken = this.lookahead; |
|
2879 var maybeAsync = this.matchContextualKeyword('async'); |
|
2880 var previousAllowIn = this.context.allowIn; |
|
2881 this.context.allowIn = true; |
|
2882 var expr; |
|
2883 if (this.matchKeyword('super') && this.context.inFunctionBody) { |
|
2884 expr = this.createNode(); |
|
2885 this.nextToken(); |
|
2886 expr = this.finalize(expr, new Node.Super()); |
|
2887 if (!this.match('(') && !this.match('.') && !this.match('[')) { |
|
2888 this.throwUnexpectedToken(this.lookahead); |
|
2889 } |
|
2890 } |
|
2891 else { |
|
2892 expr = this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); |
|
2893 } |
|
2894 while (true) { |
|
2895 if (this.match('.')) { |
|
2896 this.context.isBindingElement = false; |
|
2897 this.context.isAssignmentTarget = true; |
|
2898 this.expect('.'); |
|
2899 var property = this.parseIdentifierName(); |
|
2900 expr = this.finalize(this.startNode(startToken), new Node.StaticMemberExpression(expr, property)); |
|
2901 } |
|
2902 else if (this.match('(')) { |
|
2903 var asyncArrow = maybeAsync && (startToken.lineNumber === this.lookahead.lineNumber); |
|
2904 this.context.isBindingElement = false; |
|
2905 this.context.isAssignmentTarget = false; |
|
2906 var args = asyncArrow ? this.parseAsyncArguments() : this.parseArguments(); |
|
2907 expr = this.finalize(this.startNode(startToken), new Node.CallExpression(expr, args)); |
|
2908 if (asyncArrow && this.match('=>')) { |
|
2909 for (var i = 0; i < args.length; ++i) { |
|
2910 this.reinterpretExpressionAsPattern(args[i]); |
|
2911 } |
|
2912 expr = { |
|
2913 type: ArrowParameterPlaceHolder, |
|
2914 params: args, |
|
2915 async: true |
|
2916 }; |
|
2917 } |
|
2918 } |
|
2919 else if (this.match('[')) { |
|
2920 this.context.isBindingElement = false; |
|
2921 this.context.isAssignmentTarget = true; |
|
2922 this.expect('['); |
|
2923 var property = this.isolateCoverGrammar(this.parseExpression); |
|
2924 this.expect(']'); |
|
2925 expr = this.finalize(this.startNode(startToken), new Node.ComputedMemberExpression(expr, property)); |
|
2926 } |
|
2927 else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { |
|
2928 var quasi = this.parseTemplateLiteral(); |
|
2929 expr = this.finalize(this.startNode(startToken), new Node.TaggedTemplateExpression(expr, quasi)); |
|
2930 } |
|
2931 else { |
|
2932 break; |
|
2933 } |
|
2934 } |
|
2935 this.context.allowIn = previousAllowIn; |
|
2936 return expr; |
|
2937 }; |
|
2938 Parser.prototype.parseSuper = function () { |
|
2939 var node = this.createNode(); |
|
2940 this.expectKeyword('super'); |
|
2941 if (!this.match('[') && !this.match('.')) { |
|
2942 this.throwUnexpectedToken(this.lookahead); |
|
2943 } |
|
2944 return this.finalize(node, new Node.Super()); |
|
2945 }; |
|
2946 Parser.prototype.parseLeftHandSideExpression = function () { |
|
2947 assert_1.assert(this.context.allowIn, 'callee of new expression always allow in keyword.'); |
|
2948 var node = this.startNode(this.lookahead); |
|
2949 var expr = (this.matchKeyword('super') && this.context.inFunctionBody) ? this.parseSuper() : |
|
2950 this.inheritCoverGrammar(this.matchKeyword('new') ? this.parseNewExpression : this.parsePrimaryExpression); |
|
2951 while (true) { |
|
2952 if (this.match('[')) { |
|
2953 this.context.isBindingElement = false; |
|
2954 this.context.isAssignmentTarget = true; |
|
2955 this.expect('['); |
|
2956 var property = this.isolateCoverGrammar(this.parseExpression); |
|
2957 this.expect(']'); |
|
2958 expr = this.finalize(node, new Node.ComputedMemberExpression(expr, property)); |
|
2959 } |
|
2960 else if (this.match('.')) { |
|
2961 this.context.isBindingElement = false; |
|
2962 this.context.isAssignmentTarget = true; |
|
2963 this.expect('.'); |
|
2964 var property = this.parseIdentifierName(); |
|
2965 expr = this.finalize(node, new Node.StaticMemberExpression(expr, property)); |
|
2966 } |
|
2967 else if (this.lookahead.type === 10 /* Template */ && this.lookahead.head) { |
|
2968 var quasi = this.parseTemplateLiteral(); |
|
2969 expr = this.finalize(node, new Node.TaggedTemplateExpression(expr, quasi)); |
|
2970 } |
|
2971 else { |
|
2972 break; |
|
2973 } |
|
2974 } |
|
2975 return expr; |
|
2976 }; |
|
2977 // https://tc39.github.io/ecma262/#sec-update-expressions |
|
2978 Parser.prototype.parseUpdateExpression = function () { |
|
2979 var expr; |
|
2980 var startToken = this.lookahead; |
|
2981 if (this.match('++') || this.match('--')) { |
|
2982 var node = this.startNode(startToken); |
|
2983 var token = this.nextToken(); |
|
2984 expr = this.inheritCoverGrammar(this.parseUnaryExpression); |
|
2985 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { |
|
2986 this.tolerateError(messages_1.Messages.StrictLHSPrefix); |
|
2987 } |
|
2988 if (!this.context.isAssignmentTarget) { |
|
2989 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); |
|
2990 } |
|
2991 var prefix = true; |
|
2992 expr = this.finalize(node, new Node.UpdateExpression(token.value, expr, prefix)); |
|
2993 this.context.isAssignmentTarget = false; |
|
2994 this.context.isBindingElement = false; |
|
2995 } |
|
2996 else { |
|
2997 expr = this.inheritCoverGrammar(this.parseLeftHandSideExpressionAllowCall); |
|
2998 if (!this.hasLineTerminator && this.lookahead.type === 7 /* Punctuator */) { |
|
2999 if (this.match('++') || this.match('--')) { |
|
3000 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier && this.scanner.isRestrictedWord(expr.name)) { |
|
3001 this.tolerateError(messages_1.Messages.StrictLHSPostfix); |
|
3002 } |
|
3003 if (!this.context.isAssignmentTarget) { |
|
3004 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); |
|
3005 } |
|
3006 this.context.isAssignmentTarget = false; |
|
3007 this.context.isBindingElement = false; |
|
3008 var operator = this.nextToken().value; |
|
3009 var prefix = false; |
|
3010 expr = this.finalize(this.startNode(startToken), new Node.UpdateExpression(operator, expr, prefix)); |
|
3011 } |
|
3012 } |
|
3013 } |
|
3014 return expr; |
|
3015 }; |
|
3016 // https://tc39.github.io/ecma262/#sec-unary-operators |
|
3017 Parser.prototype.parseAwaitExpression = function () { |
|
3018 var node = this.createNode(); |
|
3019 this.nextToken(); |
|
3020 var argument = this.parseUnaryExpression(); |
|
3021 return this.finalize(node, new Node.AwaitExpression(argument)); |
|
3022 }; |
|
3023 Parser.prototype.parseUnaryExpression = function () { |
|
3024 var expr; |
|
3025 if (this.match('+') || this.match('-') || this.match('~') || this.match('!') || |
|
3026 this.matchKeyword('delete') || this.matchKeyword('void') || this.matchKeyword('typeof')) { |
|
3027 var node = this.startNode(this.lookahead); |
|
3028 var token = this.nextToken(); |
|
3029 expr = this.inheritCoverGrammar(this.parseUnaryExpression); |
|
3030 expr = this.finalize(node, new Node.UnaryExpression(token.value, expr)); |
|
3031 if (this.context.strict && expr.operator === 'delete' && expr.argument.type === syntax_1.Syntax.Identifier) { |
|
3032 this.tolerateError(messages_1.Messages.StrictDelete); |
|
3033 } |
|
3034 this.context.isAssignmentTarget = false; |
|
3035 this.context.isBindingElement = false; |
|
3036 } |
|
3037 else if (this.context.await && this.matchContextualKeyword('await')) { |
|
3038 expr = this.parseAwaitExpression(); |
|
3039 } |
|
3040 else { |
|
3041 expr = this.parseUpdateExpression(); |
|
3042 } |
|
3043 return expr; |
|
3044 }; |
|
3045 Parser.prototype.parseExponentiationExpression = function () { |
|
3046 var startToken = this.lookahead; |
|
3047 var expr = this.inheritCoverGrammar(this.parseUnaryExpression); |
|
3048 if (expr.type !== syntax_1.Syntax.UnaryExpression && this.match('**')) { |
|
3049 this.nextToken(); |
|
3050 this.context.isAssignmentTarget = false; |
|
3051 this.context.isBindingElement = false; |
|
3052 var left = expr; |
|
3053 var right = this.isolateCoverGrammar(this.parseExponentiationExpression); |
|
3054 expr = this.finalize(this.startNode(startToken), new Node.BinaryExpression('**', left, right)); |
|
3055 } |
|
3056 return expr; |
|
3057 }; |
|
3058 // https://tc39.github.io/ecma262/#sec-exp-operator |
|
3059 // https://tc39.github.io/ecma262/#sec-multiplicative-operators |
|
3060 // https://tc39.github.io/ecma262/#sec-additive-operators |
|
3061 // https://tc39.github.io/ecma262/#sec-bitwise-shift-operators |
|
3062 // https://tc39.github.io/ecma262/#sec-relational-operators |
|
3063 // https://tc39.github.io/ecma262/#sec-equality-operators |
|
3064 // https://tc39.github.io/ecma262/#sec-binary-bitwise-operators |
|
3065 // https://tc39.github.io/ecma262/#sec-binary-logical-operators |
|
3066 Parser.prototype.binaryPrecedence = function (token) { |
|
3067 var op = token.value; |
|
3068 var precedence; |
|
3069 if (token.type === 7 /* Punctuator */) { |
|
3070 precedence = this.operatorPrecedence[op] || 0; |
|
3071 } |
|
3072 else if (token.type === 4 /* Keyword */) { |
|
3073 precedence = (op === 'instanceof' || (this.context.allowIn && op === 'in')) ? 7 : 0; |
|
3074 } |
|
3075 else { |
|
3076 precedence = 0; |
|
3077 } |
|
3078 return precedence; |
|
3079 }; |
|
3080 Parser.prototype.parseBinaryExpression = function () { |
|
3081 var startToken = this.lookahead; |
|
3082 var expr = this.inheritCoverGrammar(this.parseExponentiationExpression); |
|
3083 var token = this.lookahead; |
|
3084 var prec = this.binaryPrecedence(token); |
|
3085 if (prec > 0) { |
|
3086 this.nextToken(); |
|
3087 this.context.isAssignmentTarget = false; |
|
3088 this.context.isBindingElement = false; |
|
3089 var markers = [startToken, this.lookahead]; |
|
3090 var left = expr; |
|
3091 var right = this.isolateCoverGrammar(this.parseExponentiationExpression); |
|
3092 var stack = [left, token.value, right]; |
|
3093 var precedences = [prec]; |
|
3094 while (true) { |
|
3095 prec = this.binaryPrecedence(this.lookahead); |
|
3096 if (prec <= 0) { |
|
3097 break; |
|
3098 } |
|
3099 // Reduce: make a binary expression from the three topmost entries. |
|
3100 while ((stack.length > 2) && (prec <= precedences[precedences.length - 1])) { |
|
3101 right = stack.pop(); |
|
3102 var operator = stack.pop(); |
|
3103 precedences.pop(); |
|
3104 left = stack.pop(); |
|
3105 markers.pop(); |
|
3106 var node = this.startNode(markers[markers.length - 1]); |
|
3107 stack.push(this.finalize(node, new Node.BinaryExpression(operator, left, right))); |
|
3108 } |
|
3109 // Shift. |
|
3110 stack.push(this.nextToken().value); |
|
3111 precedences.push(prec); |
|
3112 markers.push(this.lookahead); |
|
3113 stack.push(this.isolateCoverGrammar(this.parseExponentiationExpression)); |
|
3114 } |
|
3115 // Final reduce to clean-up the stack. |
|
3116 var i = stack.length - 1; |
|
3117 expr = stack[i]; |
|
3118 markers.pop(); |
|
3119 while (i > 1) { |
|
3120 var node = this.startNode(markers.pop()); |
|
3121 var operator = stack[i - 1]; |
|
3122 expr = this.finalize(node, new Node.BinaryExpression(operator, stack[i - 2], expr)); |
|
3123 i -= 2; |
|
3124 } |
|
3125 } |
|
3126 return expr; |
|
3127 }; |
|
3128 // https://tc39.github.io/ecma262/#sec-conditional-operator |
|
3129 Parser.prototype.parseConditionalExpression = function () { |
|
3130 var startToken = this.lookahead; |
|
3131 var expr = this.inheritCoverGrammar(this.parseBinaryExpression); |
|
3132 if (this.match('?')) { |
|
3133 this.nextToken(); |
|
3134 var previousAllowIn = this.context.allowIn; |
|
3135 this.context.allowIn = true; |
|
3136 var consequent = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3137 this.context.allowIn = previousAllowIn; |
|
3138 this.expect(':'); |
|
3139 var alternate = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3140 expr = this.finalize(this.startNode(startToken), new Node.ConditionalExpression(expr, consequent, alternate)); |
|
3141 this.context.isAssignmentTarget = false; |
|
3142 this.context.isBindingElement = false; |
|
3143 } |
|
3144 return expr; |
|
3145 }; |
|
3146 // https://tc39.github.io/ecma262/#sec-assignment-operators |
|
3147 Parser.prototype.checkPatternParam = function (options, param) { |
|
3148 switch (param.type) { |
|
3149 case syntax_1.Syntax.Identifier: |
|
3150 this.validateParam(options, param, param.name); |
|
3151 break; |
|
3152 case syntax_1.Syntax.RestElement: |
|
3153 this.checkPatternParam(options, param.argument); |
|
3154 break; |
|
3155 case syntax_1.Syntax.AssignmentPattern: |
|
3156 this.checkPatternParam(options, param.left); |
|
3157 break; |
|
3158 case syntax_1.Syntax.ArrayPattern: |
|
3159 for (var i = 0; i < param.elements.length; i++) { |
|
3160 if (param.elements[i] !== null) { |
|
3161 this.checkPatternParam(options, param.elements[i]); |
|
3162 } |
|
3163 } |
|
3164 break; |
|
3165 case syntax_1.Syntax.ObjectPattern: |
|
3166 for (var i = 0; i < param.properties.length; i++) { |
|
3167 this.checkPatternParam(options, param.properties[i].value); |
|
3168 } |
|
3169 break; |
|
3170 default: |
|
3171 break; |
|
3172 } |
|
3173 options.simple = options.simple && (param instanceof Node.Identifier); |
|
3174 }; |
|
3175 Parser.prototype.reinterpretAsCoverFormalsList = function (expr) { |
|
3176 var params = [expr]; |
|
3177 var options; |
|
3178 var asyncArrow = false; |
|
3179 switch (expr.type) { |
|
3180 case syntax_1.Syntax.Identifier: |
|
3181 break; |
|
3182 case ArrowParameterPlaceHolder: |
|
3183 params = expr.params; |
|
3184 asyncArrow = expr.async; |
|
3185 break; |
|
3186 default: |
|
3187 return null; |
|
3188 } |
|
3189 options = { |
|
3190 simple: true, |
|
3191 paramSet: {} |
|
3192 }; |
|
3193 for (var i = 0; i < params.length; ++i) { |
|
3194 var param = params[i]; |
|
3195 if (param.type === syntax_1.Syntax.AssignmentPattern) { |
|
3196 if (param.right.type === syntax_1.Syntax.YieldExpression) { |
|
3197 if (param.right.argument) { |
|
3198 this.throwUnexpectedToken(this.lookahead); |
|
3199 } |
|
3200 param.right.type = syntax_1.Syntax.Identifier; |
|
3201 param.right.name = 'yield'; |
|
3202 delete param.right.argument; |
|
3203 delete param.right.delegate; |
|
3204 } |
|
3205 } |
|
3206 else if (asyncArrow && param.type === syntax_1.Syntax.Identifier && param.name === 'await') { |
|
3207 this.throwUnexpectedToken(this.lookahead); |
|
3208 } |
|
3209 this.checkPatternParam(options, param); |
|
3210 params[i] = param; |
|
3211 } |
|
3212 if (this.context.strict || !this.context.allowYield) { |
|
3213 for (var i = 0; i < params.length; ++i) { |
|
3214 var param = params[i]; |
|
3215 if (param.type === syntax_1.Syntax.YieldExpression) { |
|
3216 this.throwUnexpectedToken(this.lookahead); |
|
3217 } |
|
3218 } |
|
3219 } |
|
3220 if (options.message === messages_1.Messages.StrictParamDupe) { |
|
3221 var token = this.context.strict ? options.stricted : options.firstRestricted; |
|
3222 this.throwUnexpectedToken(token, options.message); |
|
3223 } |
|
3224 return { |
|
3225 simple: options.simple, |
|
3226 params: params, |
|
3227 stricted: options.stricted, |
|
3228 firstRestricted: options.firstRestricted, |
|
3229 message: options.message |
|
3230 }; |
|
3231 }; |
|
3232 Parser.prototype.parseAssignmentExpression = function () { |
|
3233 var expr; |
|
3234 if (!this.context.allowYield && this.matchKeyword('yield')) { |
|
3235 expr = this.parseYieldExpression(); |
|
3236 } |
|
3237 else { |
|
3238 var startToken = this.lookahead; |
|
3239 var token = startToken; |
|
3240 expr = this.parseConditionalExpression(); |
|
3241 if (token.type === 3 /* Identifier */ && (token.lineNumber === this.lookahead.lineNumber) && token.value === 'async') { |
|
3242 if (this.lookahead.type === 3 /* Identifier */ || this.matchKeyword('yield')) { |
|
3243 var arg = this.parsePrimaryExpression(); |
|
3244 this.reinterpretExpressionAsPattern(arg); |
|
3245 expr = { |
|
3246 type: ArrowParameterPlaceHolder, |
|
3247 params: [arg], |
|
3248 async: true |
|
3249 }; |
|
3250 } |
|
3251 } |
|
3252 if (expr.type === ArrowParameterPlaceHolder || this.match('=>')) { |
|
3253 // https://tc39.github.io/ecma262/#sec-arrow-function-definitions |
|
3254 this.context.isAssignmentTarget = false; |
|
3255 this.context.isBindingElement = false; |
|
3256 var isAsync = expr.async; |
|
3257 var list = this.reinterpretAsCoverFormalsList(expr); |
|
3258 if (list) { |
|
3259 if (this.hasLineTerminator) { |
|
3260 this.tolerateUnexpectedToken(this.lookahead); |
|
3261 } |
|
3262 this.context.firstCoverInitializedNameError = null; |
|
3263 var previousStrict = this.context.strict; |
|
3264 var previousAllowStrictDirective = this.context.allowStrictDirective; |
|
3265 this.context.allowStrictDirective = list.simple; |
|
3266 var previousAllowYield = this.context.allowYield; |
|
3267 var previousAwait = this.context.await; |
|
3268 this.context.allowYield = true; |
|
3269 this.context.await = isAsync; |
|
3270 var node = this.startNode(startToken); |
|
3271 this.expect('=>'); |
|
3272 var body = void 0; |
|
3273 if (this.match('{')) { |
|
3274 var previousAllowIn = this.context.allowIn; |
|
3275 this.context.allowIn = true; |
|
3276 body = this.parseFunctionSourceElements(); |
|
3277 this.context.allowIn = previousAllowIn; |
|
3278 } |
|
3279 else { |
|
3280 body = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3281 } |
|
3282 var expression = body.type !== syntax_1.Syntax.BlockStatement; |
|
3283 if (this.context.strict && list.firstRestricted) { |
|
3284 this.throwUnexpectedToken(list.firstRestricted, list.message); |
|
3285 } |
|
3286 if (this.context.strict && list.stricted) { |
|
3287 this.tolerateUnexpectedToken(list.stricted, list.message); |
|
3288 } |
|
3289 expr = isAsync ? this.finalize(node, new Node.AsyncArrowFunctionExpression(list.params, body, expression)) : |
|
3290 this.finalize(node, new Node.ArrowFunctionExpression(list.params, body, expression)); |
|
3291 this.context.strict = previousStrict; |
|
3292 this.context.allowStrictDirective = previousAllowStrictDirective; |
|
3293 this.context.allowYield = previousAllowYield; |
|
3294 this.context.await = previousAwait; |
|
3295 } |
|
3296 } |
|
3297 else { |
|
3298 if (this.matchAssign()) { |
|
3299 if (!this.context.isAssignmentTarget) { |
|
3300 this.tolerateError(messages_1.Messages.InvalidLHSInAssignment); |
|
3301 } |
|
3302 if (this.context.strict && expr.type === syntax_1.Syntax.Identifier) { |
|
3303 var id = expr; |
|
3304 if (this.scanner.isRestrictedWord(id.name)) { |
|
3305 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictLHSAssignment); |
|
3306 } |
|
3307 if (this.scanner.isStrictModeReservedWord(id.name)) { |
|
3308 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); |
|
3309 } |
|
3310 } |
|
3311 if (!this.match('=')) { |
|
3312 this.context.isAssignmentTarget = false; |
|
3313 this.context.isBindingElement = false; |
|
3314 } |
|
3315 else { |
|
3316 this.reinterpretExpressionAsPattern(expr); |
|
3317 } |
|
3318 token = this.nextToken(); |
|
3319 var operator = token.value; |
|
3320 var right = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3321 expr = this.finalize(this.startNode(startToken), new Node.AssignmentExpression(operator, expr, right)); |
|
3322 this.context.firstCoverInitializedNameError = null; |
|
3323 } |
|
3324 } |
|
3325 } |
|
3326 return expr; |
|
3327 }; |
|
3328 // https://tc39.github.io/ecma262/#sec-comma-operator |
|
3329 Parser.prototype.parseExpression = function () { |
|
3330 var startToken = this.lookahead; |
|
3331 var expr = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3332 if (this.match(',')) { |
|
3333 var expressions = []; |
|
3334 expressions.push(expr); |
|
3335 while (this.lookahead.type !== 2 /* EOF */) { |
|
3336 if (!this.match(',')) { |
|
3337 break; |
|
3338 } |
|
3339 this.nextToken(); |
|
3340 expressions.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); |
|
3341 } |
|
3342 expr = this.finalize(this.startNode(startToken), new Node.SequenceExpression(expressions)); |
|
3343 } |
|
3344 return expr; |
|
3345 }; |
|
3346 // https://tc39.github.io/ecma262/#sec-block |
|
3347 Parser.prototype.parseStatementListItem = function () { |
|
3348 var statement; |
|
3349 this.context.isAssignmentTarget = true; |
|
3350 this.context.isBindingElement = true; |
|
3351 if (this.lookahead.type === 4 /* Keyword */) { |
|
3352 switch (this.lookahead.value) { |
|
3353 case 'export': |
|
3354 if (!this.context.isModule) { |
|
3355 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalExportDeclaration); |
|
3356 } |
|
3357 statement = this.parseExportDeclaration(); |
|
3358 break; |
|
3359 case 'import': |
|
3360 if (!this.context.isModule) { |
|
3361 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.IllegalImportDeclaration); |
|
3362 } |
|
3363 statement = this.parseImportDeclaration(); |
|
3364 break; |
|
3365 case 'const': |
|
3366 statement = this.parseLexicalDeclaration({ inFor: false }); |
|
3367 break; |
|
3368 case 'function': |
|
3369 statement = this.parseFunctionDeclaration(); |
|
3370 break; |
|
3371 case 'class': |
|
3372 statement = this.parseClassDeclaration(); |
|
3373 break; |
|
3374 case 'let': |
|
3375 statement = this.isLexicalDeclaration() ? this.parseLexicalDeclaration({ inFor: false }) : this.parseStatement(); |
|
3376 break; |
|
3377 default: |
|
3378 statement = this.parseStatement(); |
|
3379 break; |
|
3380 } |
|
3381 } |
|
3382 else { |
|
3383 statement = this.parseStatement(); |
|
3384 } |
|
3385 return statement; |
|
3386 }; |
|
3387 Parser.prototype.parseBlock = function () { |
|
3388 var node = this.createNode(); |
|
3389 this.expect('{'); |
|
3390 var block = []; |
|
3391 while (true) { |
|
3392 if (this.match('}')) { |
|
3393 break; |
|
3394 } |
|
3395 block.push(this.parseStatementListItem()); |
|
3396 } |
|
3397 this.expect('}'); |
|
3398 return this.finalize(node, new Node.BlockStatement(block)); |
|
3399 }; |
|
3400 // https://tc39.github.io/ecma262/#sec-let-and-const-declarations |
|
3401 Parser.prototype.parseLexicalBinding = function (kind, options) { |
|
3402 var node = this.createNode(); |
|
3403 var params = []; |
|
3404 var id = this.parsePattern(params, kind); |
|
3405 if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { |
|
3406 if (this.scanner.isRestrictedWord(id.name)) { |
|
3407 this.tolerateError(messages_1.Messages.StrictVarName); |
|
3408 } |
|
3409 } |
|
3410 var init = null; |
|
3411 if (kind === 'const') { |
|
3412 if (!this.matchKeyword('in') && !this.matchContextualKeyword('of')) { |
|
3413 if (this.match('=')) { |
|
3414 this.nextToken(); |
|
3415 init = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3416 } |
|
3417 else { |
|
3418 this.throwError(messages_1.Messages.DeclarationMissingInitializer, 'const'); |
|
3419 } |
|
3420 } |
|
3421 } |
|
3422 else if ((!options.inFor && id.type !== syntax_1.Syntax.Identifier) || this.match('=')) { |
|
3423 this.expect('='); |
|
3424 init = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3425 } |
|
3426 return this.finalize(node, new Node.VariableDeclarator(id, init)); |
|
3427 }; |
|
3428 Parser.prototype.parseBindingList = function (kind, options) { |
|
3429 var list = [this.parseLexicalBinding(kind, options)]; |
|
3430 while (this.match(',')) { |
|
3431 this.nextToken(); |
|
3432 list.push(this.parseLexicalBinding(kind, options)); |
|
3433 } |
|
3434 return list; |
|
3435 }; |
|
3436 Parser.prototype.isLexicalDeclaration = function () { |
|
3437 var state = this.scanner.saveState(); |
|
3438 this.scanner.scanComments(); |
|
3439 var next = this.scanner.lex(); |
|
3440 this.scanner.restoreState(state); |
|
3441 return (next.type === 3 /* Identifier */) || |
|
3442 (next.type === 7 /* Punctuator */ && next.value === '[') || |
|
3443 (next.type === 7 /* Punctuator */ && next.value === '{') || |
|
3444 (next.type === 4 /* Keyword */ && next.value === 'let') || |
|
3445 (next.type === 4 /* Keyword */ && next.value === 'yield'); |
|
3446 }; |
|
3447 Parser.prototype.parseLexicalDeclaration = function (options) { |
|
3448 var node = this.createNode(); |
|
3449 var kind = this.nextToken().value; |
|
3450 assert_1.assert(kind === 'let' || kind === 'const', 'Lexical declaration must be either let or const'); |
|
3451 var declarations = this.parseBindingList(kind, options); |
|
3452 this.consumeSemicolon(); |
|
3453 return this.finalize(node, new Node.VariableDeclaration(declarations, kind)); |
|
3454 }; |
|
3455 // https://tc39.github.io/ecma262/#sec-destructuring-binding-patterns |
|
3456 Parser.prototype.parseBindingRestElement = function (params, kind) { |
|
3457 var node = this.createNode(); |
|
3458 this.expect('...'); |
|
3459 var arg = this.parsePattern(params, kind); |
|
3460 return this.finalize(node, new Node.RestElement(arg)); |
|
3461 }; |
|
3462 Parser.prototype.parseArrayPattern = function (params, kind) { |
|
3463 var node = this.createNode(); |
|
3464 this.expect('['); |
|
3465 var elements = []; |
|
3466 while (!this.match(']')) { |
|
3467 if (this.match(',')) { |
|
3468 this.nextToken(); |
|
3469 elements.push(null); |
|
3470 } |
|
3471 else { |
|
3472 if (this.match('...')) { |
|
3473 elements.push(this.parseBindingRestElement(params, kind)); |
|
3474 break; |
|
3475 } |
|
3476 else { |
|
3477 elements.push(this.parsePatternWithDefault(params, kind)); |
|
3478 } |
|
3479 if (!this.match(']')) { |
|
3480 this.expect(','); |
|
3481 } |
|
3482 } |
|
3483 } |
|
3484 this.expect(']'); |
|
3485 return this.finalize(node, new Node.ArrayPattern(elements)); |
|
3486 }; |
|
3487 Parser.prototype.parsePropertyPattern = function (params, kind) { |
|
3488 var node = this.createNode(); |
|
3489 var computed = false; |
|
3490 var shorthand = false; |
|
3491 var method = false; |
|
3492 var key; |
|
3493 var value; |
|
3494 if (this.lookahead.type === 3 /* Identifier */) { |
|
3495 var keyToken = this.lookahead; |
|
3496 key = this.parseVariableIdentifier(); |
|
3497 var init = this.finalize(node, new Node.Identifier(keyToken.value)); |
|
3498 if (this.match('=')) { |
|
3499 params.push(keyToken); |
|
3500 shorthand = true; |
|
3501 this.nextToken(); |
|
3502 var expr = this.parseAssignmentExpression(); |
|
3503 value = this.finalize(this.startNode(keyToken), new Node.AssignmentPattern(init, expr)); |
|
3504 } |
|
3505 else if (!this.match(':')) { |
|
3506 params.push(keyToken); |
|
3507 shorthand = true; |
|
3508 value = init; |
|
3509 } |
|
3510 else { |
|
3511 this.expect(':'); |
|
3512 value = this.parsePatternWithDefault(params, kind); |
|
3513 } |
|
3514 } |
|
3515 else { |
|
3516 computed = this.match('['); |
|
3517 key = this.parseObjectPropertyKey(); |
|
3518 this.expect(':'); |
|
3519 value = this.parsePatternWithDefault(params, kind); |
|
3520 } |
|
3521 return this.finalize(node, new Node.Property('init', key, computed, value, method, shorthand)); |
|
3522 }; |
|
3523 Parser.prototype.parseObjectPattern = function (params, kind) { |
|
3524 var node = this.createNode(); |
|
3525 var properties = []; |
|
3526 this.expect('{'); |
|
3527 while (!this.match('}')) { |
|
3528 properties.push(this.parsePropertyPattern(params, kind)); |
|
3529 if (!this.match('}')) { |
|
3530 this.expect(','); |
|
3531 } |
|
3532 } |
|
3533 this.expect('}'); |
|
3534 return this.finalize(node, new Node.ObjectPattern(properties)); |
|
3535 }; |
|
3536 Parser.prototype.parsePattern = function (params, kind) { |
|
3537 var pattern; |
|
3538 if (this.match('[')) { |
|
3539 pattern = this.parseArrayPattern(params, kind); |
|
3540 } |
|
3541 else if (this.match('{')) { |
|
3542 pattern = this.parseObjectPattern(params, kind); |
|
3543 } |
|
3544 else { |
|
3545 if (this.matchKeyword('let') && (kind === 'const' || kind === 'let')) { |
|
3546 this.tolerateUnexpectedToken(this.lookahead, messages_1.Messages.LetInLexicalBinding); |
|
3547 } |
|
3548 params.push(this.lookahead); |
|
3549 pattern = this.parseVariableIdentifier(kind); |
|
3550 } |
|
3551 return pattern; |
|
3552 }; |
|
3553 Parser.prototype.parsePatternWithDefault = function (params, kind) { |
|
3554 var startToken = this.lookahead; |
|
3555 var pattern = this.parsePattern(params, kind); |
|
3556 if (this.match('=')) { |
|
3557 this.nextToken(); |
|
3558 var previousAllowYield = this.context.allowYield; |
|
3559 this.context.allowYield = true; |
|
3560 var right = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3561 this.context.allowYield = previousAllowYield; |
|
3562 pattern = this.finalize(this.startNode(startToken), new Node.AssignmentPattern(pattern, right)); |
|
3563 } |
|
3564 return pattern; |
|
3565 }; |
|
3566 // https://tc39.github.io/ecma262/#sec-variable-statement |
|
3567 Parser.prototype.parseVariableIdentifier = function (kind) { |
|
3568 var node = this.createNode(); |
|
3569 var token = this.nextToken(); |
|
3570 if (token.type === 4 /* Keyword */ && token.value === 'yield') { |
|
3571 if (this.context.strict) { |
|
3572 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); |
|
3573 } |
|
3574 else if (!this.context.allowYield) { |
|
3575 this.throwUnexpectedToken(token); |
|
3576 } |
|
3577 } |
|
3578 else if (token.type !== 3 /* Identifier */) { |
|
3579 if (this.context.strict && token.type === 4 /* Keyword */ && this.scanner.isStrictModeReservedWord(token.value)) { |
|
3580 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictReservedWord); |
|
3581 } |
|
3582 else { |
|
3583 if (this.context.strict || token.value !== 'let' || kind !== 'var') { |
|
3584 this.throwUnexpectedToken(token); |
|
3585 } |
|
3586 } |
|
3587 } |
|
3588 else if ((this.context.isModule || this.context.await) && token.type === 3 /* Identifier */ && token.value === 'await') { |
|
3589 this.tolerateUnexpectedToken(token); |
|
3590 } |
|
3591 return this.finalize(node, new Node.Identifier(token.value)); |
|
3592 }; |
|
3593 Parser.prototype.parseVariableDeclaration = function (options) { |
|
3594 var node = this.createNode(); |
|
3595 var params = []; |
|
3596 var id = this.parsePattern(params, 'var'); |
|
3597 if (this.context.strict && id.type === syntax_1.Syntax.Identifier) { |
|
3598 if (this.scanner.isRestrictedWord(id.name)) { |
|
3599 this.tolerateError(messages_1.Messages.StrictVarName); |
|
3600 } |
|
3601 } |
|
3602 var init = null; |
|
3603 if (this.match('=')) { |
|
3604 this.nextToken(); |
|
3605 init = this.isolateCoverGrammar(this.parseAssignmentExpression); |
|
3606 } |
|
3607 else if (id.type !== syntax_1.Syntax.Identifier && !options.inFor) { |
|
3608 this.expect('='); |
|
3609 } |
|
3610 return this.finalize(node, new Node.VariableDeclarator(id, init)); |
|
3611 }; |
|
3612 Parser.prototype.parseVariableDeclarationList = function (options) { |
|
3613 var opt = { inFor: options.inFor }; |
|
3614 var list = []; |
|
3615 list.push(this.parseVariableDeclaration(opt)); |
|
3616 while (this.match(',')) { |
|
3617 this.nextToken(); |
|
3618 list.push(this.parseVariableDeclaration(opt)); |
|
3619 } |
|
3620 return list; |
|
3621 }; |
|
3622 Parser.prototype.parseVariableStatement = function () { |
|
3623 var node = this.createNode(); |
|
3624 this.expectKeyword('var'); |
|
3625 var declarations = this.parseVariableDeclarationList({ inFor: false }); |
|
3626 this.consumeSemicolon(); |
|
3627 return this.finalize(node, new Node.VariableDeclaration(declarations, 'var')); |
|
3628 }; |
|
3629 // https://tc39.github.io/ecma262/#sec-empty-statement |
|
3630 Parser.prototype.parseEmptyStatement = function () { |
|
3631 var node = this.createNode(); |
|
3632 this.expect(';'); |
|
3633 return this.finalize(node, new Node.EmptyStatement()); |
|
3634 }; |
|
3635 // https://tc39.github.io/ecma262/#sec-expression-statement |
|
3636 Parser.prototype.parseExpressionStatement = function () { |
|
3637 var node = this.createNode(); |
|
3638 var expr = this.parseExpression(); |
|
3639 this.consumeSemicolon(); |
|
3640 return this.finalize(node, new Node.ExpressionStatement(expr)); |
|
3641 }; |
|
3642 // https://tc39.github.io/ecma262/#sec-if-statement |
|
3643 Parser.prototype.parseIfClause = function () { |
|
3644 if (this.context.strict && this.matchKeyword('function')) { |
|
3645 this.tolerateError(messages_1.Messages.StrictFunction); |
|
3646 } |
|
3647 return this.parseStatement(); |
|
3648 }; |
|
3649 Parser.prototype.parseIfStatement = function () { |
|
3650 var node = this.createNode(); |
|
3651 var consequent; |
|
3652 var alternate = null; |
|
3653 this.expectKeyword('if'); |
|
3654 this.expect('('); |
|
3655 var test = this.parseExpression(); |
|
3656 if (!this.match(')') && this.config.tolerant) { |
|
3657 this.tolerateUnexpectedToken(this.nextToken()); |
|
3658 consequent = this.finalize(this.createNode(), new Node.EmptyStatement()); |
|
3659 } |
|
3660 else { |
|
3661 this.expect(')'); |
|
3662 consequent = this.parseIfClause(); |
|
3663 if (this.matchKeyword('else')) { |
|
3664 this.nextToken(); |
|
3665 alternate = this.parseIfClause(); |
|
3666 } |
|
3667 } |
|
3668 return this.finalize(node, new Node.IfStatement(test, consequent, alternate)); |
|
3669 }; |
|
3670 // https://tc39.github.io/ecma262/#sec-do-while-statement |
|
3671 Parser.prototype.parseDoWhileStatement = function () { |
|
3672 var node = this.createNode(); |
|
3673 this.expectKeyword('do'); |
|
3674 var previousInIteration = this.context.inIteration; |
|
3675 this.context.inIteration = true; |
|
3676 var body = this.parseStatement(); |
|
3677 this.context.inIteration = previousInIteration; |
|
3678 this.expectKeyword('while'); |
|
3679 this.expect('('); |
|
3680 var test = this.parseExpression(); |
|
3681 if (!this.match(')') && this.config.tolerant) { |
|
3682 this.tolerateUnexpectedToken(this.nextToken()); |
|
3683 } |
|
3684 else { |
|
3685 this.expect(')'); |
|
3686 if (this.match(';')) { |
|
3687 this.nextToken(); |
|
3688 } |
|
3689 } |
|
3690 return this.finalize(node, new Node.DoWhileStatement(body, test)); |
|
3691 }; |
|
3692 // https://tc39.github.io/ecma262/#sec-while-statement |
|
3693 Parser.prototype.parseWhileStatement = function () { |
|
3694 var node = this.createNode(); |
|
3695 var body; |
|
3696 this.expectKeyword('while'); |
|
3697 this.expect('('); |
|
3698 var test = this.parseExpression(); |
|
3699 if (!this.match(')') && this.config.tolerant) { |
|
3700 this.tolerateUnexpectedToken(this.nextToken()); |
|
3701 body = this.finalize(this.createNode(), new Node.EmptyStatement()); |
|
3702 } |
|
3703 else { |
|
3704 this.expect(')'); |
|
3705 var previousInIteration = this.context.inIteration; |
|
3706 this.context.inIteration = true; |
|
3707 body = this.parseStatement(); |
|
3708 this.context.inIteration = previousInIteration; |
|
3709 } |
|
3710 return this.finalize(node, new Node.WhileStatement(test, body)); |
|
3711 }; |
|
3712 // https://tc39.github.io/ecma262/#sec-for-statement |
|
3713 // https://tc39.github.io/ecma262/#sec-for-in-and-for-of-statements |
|
3714 Parser.prototype.parseForStatement = function () { |
|
3715 var init = null; |
|
3716 var test = null; |
|
3717 var update = null; |
|
3718 var forIn = true; |
|
3719 var left, right; |
|
3720 var node = this.createNode(); |
|
3721 this.expectKeyword('for'); |
|
3722 this.expect('('); |
|
3723 if (this.match(';')) { |
|
3724 this.nextToken(); |
|
3725 } |
|
3726 else { |
|
3727 if (this.matchKeyword('var')) { |
|
3728 init = this.createNode(); |
|
3729 this.nextToken(); |
|
3730 var previousAllowIn = this.context.allowIn; |
|
3731 this.context.allowIn = false; |
|
3732 var declarations = this.parseVariableDeclarationList({ inFor: true }); |
|
3733 this.context.allowIn = previousAllowIn; |
|
3734 if (declarations.length === 1 && this.matchKeyword('in')) { |
|
3735 var decl = declarations[0]; |
|
3736 if (decl.init && (decl.id.type === syntax_1.Syntax.ArrayPattern || decl.id.type === syntax_1.Syntax.ObjectPattern || this.context.strict)) { |
|
3737 this.tolerateError(messages_1.Messages.ForInOfLoopInitializer, 'for-in'); |
|
3738 } |
|
3739 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); |
|
3740 this.nextToken(); |
|
3741 left = init; |
|
3742 right = this.parseExpression(); |
|
3743 init = null; |
|
3744 } |
|
3745 else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { |
|
3746 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); |
|
3747 this.nextToken(); |
|
3748 left = init; |
|
3749 right = this.parseAssignmentExpression(); |
|
3750 init = null; |
|
3751 forIn = false; |
|
3752 } |
|
3753 else { |
|
3754 init = this.finalize(init, new Node.VariableDeclaration(declarations, 'var')); |
|
3755 this.expect(';'); |
|
3756 } |
|
3757 } |
|
3758 else if (this.matchKeyword('const') || this.matchKeyword('let')) { |
|
3759 init = this.createNode(); |
|
3760 var kind = this.nextToken().value; |
|
3761 if (!this.context.strict && this.lookahead.value === 'in') { |
|
3762 init = this.finalize(init, new Node.Identifier(kind)); |
|
3763 this.nextToken(); |
|
3764 left = init; |
|
3765 right = this.parseExpression(); |
|
3766 init = null; |
|
3767 } |
|
3768 else { |
|
3769 var previousAllowIn = this.context.allowIn; |
|
3770 this.context.allowIn = false; |
|
3771 var declarations = this.parseBindingList(kind, { inFor: true }); |
|
3772 this.context.allowIn = previousAllowIn; |
|
3773 if (declarations.length === 1 && declarations[0].init === null && this.matchKeyword('in')) { |
|
3774 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); |
|
3775 this.nextToken(); |
|
3776 left = init; |
|
3777 right = this.parseExpression(); |
|
3778 init = null; |
|
3779 } |
|
3780 else if (declarations.length === 1 && declarations[0].init === null && this.matchContextualKeyword('of')) { |
|
3781 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); |
|
3782 this.nextToken(); |
|
3783 left = init; |
|
3784 right = this.parseAssignmentExpression(); |
|
3785 init = null; |
|
3786 forIn = false; |
|
3787 } |
|
3788 else { |
|
3789 this.consumeSemicolon(); |
|
3790 init = this.finalize(init, new Node.VariableDeclaration(declarations, kind)); |
|
3791 } |
|
3792 } |
|
3793 } |
|
3794 else { |
|
3795 var initStartToken = this.lookahead; |
|
3796 var previousAllowIn = this.context.allowIn; |
|
3797 this.context.allowIn = false; |
|
3798 init = this.inheritCoverGrammar(this.parseAssignmentExpression); |
|
3799 this.context.allowIn = previousAllowIn; |
|
3800 if (this.matchKeyword('in')) { |
|
3801 if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { |
|
3802 this.tolerateError(messages_1.Messages.InvalidLHSInForIn); |
|
3803 } |
|
3804 this.nextToken(); |
|
3805 this.reinterpretExpressionAsPattern(init); |
|
3806 left = init; |
|
3807 right = this.parseExpression(); |
|
3808 init = null; |
|
3809 } |
|
3810 else if (this.matchContextualKeyword('of')) { |
|
3811 if (!this.context.isAssignmentTarget || init.type === syntax_1.Syntax.AssignmentExpression) { |
|
3812 this.tolerateError(messages_1.Messages.InvalidLHSInForLoop); |
|
3813 } |
|
3814 this.nextToken(); |
|
3815 this.reinterpretExpressionAsPattern(init); |
|
3816 left = init; |
|
3817 right = this.parseAssignmentExpression(); |
|
3818 init = null; |
|
3819 forIn = false; |
|
3820 } |
|
3821 else { |
|
3822 if (this.match(',')) { |
|
3823 var initSeq = [init]; |
|
3824 while (this.match(',')) { |
|
3825 this.nextToken(); |
|
3826 initSeq.push(this.isolateCoverGrammar(this.parseAssignmentExpression)); |
|
3827 } |
|
3828 init = this.finalize(this.startNode(initStartToken), new Node.SequenceExpression(initSeq)); |
|
3829 } |
|
3830 this.expect(';'); |
|
3831 } |
|
3832 } |
|
3833 } |
|
3834 if (typeof left === 'undefined') { |
|
3835 if (!this.match(';')) { |
|
3836 test = this.parseExpression(); |
|
3837 } |
|
3838 this.expect(';'); |
|
3839 if (!this.match(')')) { |
|
3840 update = this.parseExpression(); |
|
3841 } |
|
3842 } |
|
3843 var body; |
|
3844 if (!this.match(')') && this.config.tolerant) { |
|
3845 this.tolerateUnexpectedToken(this.nextToken()); |
|
3846 body = this.finalize(this.createNode(), new Node.EmptyStatement()); |
|
3847 } |
|
3848 else { |
|
3849 this.expect(')'); |
|
3850 var previousInIteration = this.context.inIteration; |
|
3851 this.context.inIteration = true; |
|
3852 body = this.isolateCoverGrammar(this.parseStatement); |
|
3853 this.context.inIteration = previousInIteration; |
|
3854 } |
|
3855 return (typeof left === 'undefined') ? |
|
3856 this.finalize(node, new Node.ForStatement(init, test, update, body)) : |
|
3857 forIn ? this.finalize(node, new Node.ForInStatement(left, right, body)) : |
|
3858 this.finalize(node, new Node.ForOfStatement(left, right, body)); |
|
3859 }; |
|
3860 // https://tc39.github.io/ecma262/#sec-continue-statement |
|
3861 Parser.prototype.parseContinueStatement = function () { |
|
3862 var node = this.createNode(); |
|
3863 this.expectKeyword('continue'); |
|
3864 var label = null; |
|
3865 if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { |
|
3866 var id = this.parseVariableIdentifier(); |
|
3867 label = id; |
|
3868 var key = '$' + id.name; |
|
3869 if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { |
|
3870 this.throwError(messages_1.Messages.UnknownLabel, id.name); |
|
3871 } |
|
3872 } |
|
3873 this.consumeSemicolon(); |
|
3874 if (label === null && !this.context.inIteration) { |
|
3875 this.throwError(messages_1.Messages.IllegalContinue); |
|
3876 } |
|
3877 return this.finalize(node, new Node.ContinueStatement(label)); |
|
3878 }; |
|
3879 // https://tc39.github.io/ecma262/#sec-break-statement |
|
3880 Parser.prototype.parseBreakStatement = function () { |
|
3881 var node = this.createNode(); |
|
3882 this.expectKeyword('break'); |
|
3883 var label = null; |
|
3884 if (this.lookahead.type === 3 /* Identifier */ && !this.hasLineTerminator) { |
|
3885 var id = this.parseVariableIdentifier(); |
|
3886 var key = '$' + id.name; |
|
3887 if (!Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { |
|
3888 this.throwError(messages_1.Messages.UnknownLabel, id.name); |
|
3889 } |
|
3890 label = id; |
|
3891 } |
|
3892 this.consumeSemicolon(); |
|
3893 if (label === null && !this.context.inIteration && !this.context.inSwitch) { |
|
3894 this.throwError(messages_1.Messages.IllegalBreak); |
|
3895 } |
|
3896 return this.finalize(node, new Node.BreakStatement(label)); |
|
3897 }; |
|
3898 // https://tc39.github.io/ecma262/#sec-return-statement |
|
3899 Parser.prototype.parseReturnStatement = function () { |
|
3900 if (!this.context.inFunctionBody) { |
|
3901 this.tolerateError(messages_1.Messages.IllegalReturn); |
|
3902 } |
|
3903 var node = this.createNode(); |
|
3904 this.expectKeyword('return'); |
|
3905 var hasArgument = !this.match(';') && !this.match('}') && |
|
3906 !this.hasLineTerminator && this.lookahead.type !== 2 /* EOF */; |
|
3907 var argument = hasArgument ? this.parseExpression() : null; |
|
3908 this.consumeSemicolon(); |
|
3909 return this.finalize(node, new Node.ReturnStatement(argument)); |
|
3910 }; |
|
3911 // https://tc39.github.io/ecma262/#sec-with-statement |
|
3912 Parser.prototype.parseWithStatement = function () { |
|
3913 if (this.context.strict) { |
|
3914 this.tolerateError(messages_1.Messages.StrictModeWith); |
|
3915 } |
|
3916 var node = this.createNode(); |
|
3917 var body; |
|
3918 this.expectKeyword('with'); |
|
3919 this.expect('('); |
|
3920 var object = this.parseExpression(); |
|
3921 if (!this.match(')') && this.config.tolerant) { |
|
3922 this.tolerateUnexpectedToken(this.nextToken()); |
|
3923 body = this.finalize(this.createNode(), new Node.EmptyStatement()); |
|
3924 } |
|
3925 else { |
|
3926 this.expect(')'); |
|
3927 body = this.parseStatement(); |
|
3928 } |
|
3929 return this.finalize(node, new Node.WithStatement(object, body)); |
|
3930 }; |
|
3931 // https://tc39.github.io/ecma262/#sec-switch-statement |
|
3932 Parser.prototype.parseSwitchCase = function () { |
|
3933 var node = this.createNode(); |
|
3934 var test; |
|
3935 if (this.matchKeyword('default')) { |
|
3936 this.nextToken(); |
|
3937 test = null; |
|
3938 } |
|
3939 else { |
|
3940 this.expectKeyword('case'); |
|
3941 test = this.parseExpression(); |
|
3942 } |
|
3943 this.expect(':'); |
|
3944 var consequent = []; |
|
3945 while (true) { |
|
3946 if (this.match('}') || this.matchKeyword('default') || this.matchKeyword('case')) { |
|
3947 break; |
|
3948 } |
|
3949 consequent.push(this.parseStatementListItem()); |
|
3950 } |
|
3951 return this.finalize(node, new Node.SwitchCase(test, consequent)); |
|
3952 }; |
|
3953 Parser.prototype.parseSwitchStatement = function () { |
|
3954 var node = this.createNode(); |
|
3955 this.expectKeyword('switch'); |
|
3956 this.expect('('); |
|
3957 var discriminant = this.parseExpression(); |
|
3958 this.expect(')'); |
|
3959 var previousInSwitch = this.context.inSwitch; |
|
3960 this.context.inSwitch = true; |
|
3961 var cases = []; |
|
3962 var defaultFound = false; |
|
3963 this.expect('{'); |
|
3964 while (true) { |
|
3965 if (this.match('}')) { |
|
3966 break; |
|
3967 } |
|
3968 var clause = this.parseSwitchCase(); |
|
3969 if (clause.test === null) { |
|
3970 if (defaultFound) { |
|
3971 this.throwError(messages_1.Messages.MultipleDefaultsInSwitch); |
|
3972 } |
|
3973 defaultFound = true; |
|
3974 } |
|
3975 cases.push(clause); |
|
3976 } |
|
3977 this.expect('}'); |
|
3978 this.context.inSwitch = previousInSwitch; |
|
3979 return this.finalize(node, new Node.SwitchStatement(discriminant, cases)); |
|
3980 }; |
|
3981 // https://tc39.github.io/ecma262/#sec-labelled-statements |
|
3982 Parser.prototype.parseLabelledStatement = function () { |
|
3983 var node = this.createNode(); |
|
3984 var expr = this.parseExpression(); |
|
3985 var statement; |
|
3986 if ((expr.type === syntax_1.Syntax.Identifier) && this.match(':')) { |
|
3987 this.nextToken(); |
|
3988 var id = expr; |
|
3989 var key = '$' + id.name; |
|
3990 if (Object.prototype.hasOwnProperty.call(this.context.labelSet, key)) { |
|
3991 this.throwError(messages_1.Messages.Redeclaration, 'Label', id.name); |
|
3992 } |
|
3993 this.context.labelSet[key] = true; |
|
3994 var body = void 0; |
|
3995 if (this.matchKeyword('class')) { |
|
3996 this.tolerateUnexpectedToken(this.lookahead); |
|
3997 body = this.parseClassDeclaration(); |
|
3998 } |
|
3999 else if (this.matchKeyword('function')) { |
|
4000 var token = this.lookahead; |
|
4001 var declaration = this.parseFunctionDeclaration(); |
|
4002 if (this.context.strict) { |
|
4003 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunction); |
|
4004 } |
|
4005 else if (declaration.generator) { |
|
4006 this.tolerateUnexpectedToken(token, messages_1.Messages.GeneratorInLegacyContext); |
|
4007 } |
|
4008 body = declaration; |
|
4009 } |
|
4010 else { |
|
4011 body = this.parseStatement(); |
|
4012 } |
|
4013 delete this.context.labelSet[key]; |
|
4014 statement = new Node.LabeledStatement(id, body); |
|
4015 } |
|
4016 else { |
|
4017 this.consumeSemicolon(); |
|
4018 statement = new Node.ExpressionStatement(expr); |
|
4019 } |
|
4020 return this.finalize(node, statement); |
|
4021 }; |
|
4022 // https://tc39.github.io/ecma262/#sec-throw-statement |
|
4023 Parser.prototype.parseThrowStatement = function () { |
|
4024 var node = this.createNode(); |
|
4025 this.expectKeyword('throw'); |
|
4026 if (this.hasLineTerminator) { |
|
4027 this.throwError(messages_1.Messages.NewlineAfterThrow); |
|
4028 } |
|
4029 var argument = this.parseExpression(); |
|
4030 this.consumeSemicolon(); |
|
4031 return this.finalize(node, new Node.ThrowStatement(argument)); |
|
4032 }; |
|
4033 // https://tc39.github.io/ecma262/#sec-try-statement |
|
4034 Parser.prototype.parseCatchClause = function () { |
|
4035 var node = this.createNode(); |
|
4036 this.expectKeyword('catch'); |
|
4037 this.expect('('); |
|
4038 if (this.match(')')) { |
|
4039 this.throwUnexpectedToken(this.lookahead); |
|
4040 } |
|
4041 var params = []; |
|
4042 var param = this.parsePattern(params); |
|
4043 var paramMap = {}; |
|
4044 for (var i = 0; i < params.length; i++) { |
|
4045 var key = '$' + params[i].value; |
|
4046 if (Object.prototype.hasOwnProperty.call(paramMap, key)) { |
|
4047 this.tolerateError(messages_1.Messages.DuplicateBinding, params[i].value); |
|
4048 } |
|
4049 paramMap[key] = true; |
|
4050 } |
|
4051 if (this.context.strict && param.type === syntax_1.Syntax.Identifier) { |
|
4052 if (this.scanner.isRestrictedWord(param.name)) { |
|
4053 this.tolerateError(messages_1.Messages.StrictCatchVariable); |
|
4054 } |
|
4055 } |
|
4056 this.expect(')'); |
|
4057 var body = this.parseBlock(); |
|
4058 return this.finalize(node, new Node.CatchClause(param, body)); |
|
4059 }; |
|
4060 Parser.prototype.parseFinallyClause = function () { |
|
4061 this.expectKeyword('finally'); |
|
4062 return this.parseBlock(); |
|
4063 }; |
|
4064 Parser.prototype.parseTryStatement = function () { |
|
4065 var node = this.createNode(); |
|
4066 this.expectKeyword('try'); |
|
4067 var block = this.parseBlock(); |
|
4068 var handler = this.matchKeyword('catch') ? this.parseCatchClause() : null; |
|
4069 var finalizer = this.matchKeyword('finally') ? this.parseFinallyClause() : null; |
|
4070 if (!handler && !finalizer) { |
|
4071 this.throwError(messages_1.Messages.NoCatchOrFinally); |
|
4072 } |
|
4073 return this.finalize(node, new Node.TryStatement(block, handler, finalizer)); |
|
4074 }; |
|
4075 // https://tc39.github.io/ecma262/#sec-debugger-statement |
|
4076 Parser.prototype.parseDebuggerStatement = function () { |
|
4077 var node = this.createNode(); |
|
4078 this.expectKeyword('debugger'); |
|
4079 this.consumeSemicolon(); |
|
4080 return this.finalize(node, new Node.DebuggerStatement()); |
|
4081 }; |
|
4082 // https://tc39.github.io/ecma262/#sec-ecmascript-language-statements-and-declarations |
|
4083 Parser.prototype.parseStatement = function () { |
|
4084 var statement; |
|
4085 switch (this.lookahead.type) { |
|
4086 case 1 /* BooleanLiteral */: |
|
4087 case 5 /* NullLiteral */: |
|
4088 case 6 /* NumericLiteral */: |
|
4089 case 8 /* StringLiteral */: |
|
4090 case 10 /* Template */: |
|
4091 case 9 /* RegularExpression */: |
|
4092 statement = this.parseExpressionStatement(); |
|
4093 break; |
|
4094 case 7 /* Punctuator */: |
|
4095 var value = this.lookahead.value; |
|
4096 if (value === '{') { |
|
4097 statement = this.parseBlock(); |
|
4098 } |
|
4099 else if (value === '(') { |
|
4100 statement = this.parseExpressionStatement(); |
|
4101 } |
|
4102 else if (value === ';') { |
|
4103 statement = this.parseEmptyStatement(); |
|
4104 } |
|
4105 else { |
|
4106 statement = this.parseExpressionStatement(); |
|
4107 } |
|
4108 break; |
|
4109 case 3 /* Identifier */: |
|
4110 statement = this.matchAsyncFunction() ? this.parseFunctionDeclaration() : this.parseLabelledStatement(); |
|
4111 break; |
|
4112 case 4 /* Keyword */: |
|
4113 switch (this.lookahead.value) { |
|
4114 case 'break': |
|
4115 statement = this.parseBreakStatement(); |
|
4116 break; |
|
4117 case 'continue': |
|
4118 statement = this.parseContinueStatement(); |
|
4119 break; |
|
4120 case 'debugger': |
|
4121 statement = this.parseDebuggerStatement(); |
|
4122 break; |
|
4123 case 'do': |
|
4124 statement = this.parseDoWhileStatement(); |
|
4125 break; |
|
4126 case 'for': |
|
4127 statement = this.parseForStatement(); |
|
4128 break; |
|
4129 case 'function': |
|
4130 statement = this.parseFunctionDeclaration(); |
|
4131 break; |
|
4132 case 'if': |
|
4133 statement = this.parseIfStatement(); |
|
4134 break; |
|
4135 case 'return': |
|
4136 statement = this.parseReturnStatement(); |
|
4137 break; |
|
4138 case 'switch': |
|
4139 statement = this.parseSwitchStatement(); |
|
4140 break; |
|
4141 case 'throw': |
|
4142 statement = this.parseThrowStatement(); |
|
4143 break; |
|
4144 case 'try': |
|
4145 statement = this.parseTryStatement(); |
|
4146 break; |
|
4147 case 'var': |
|
4148 statement = this.parseVariableStatement(); |
|
4149 break; |
|
4150 case 'while': |
|
4151 statement = this.parseWhileStatement(); |
|
4152 break; |
|
4153 case 'with': |
|
4154 statement = this.parseWithStatement(); |
|
4155 break; |
|
4156 default: |
|
4157 statement = this.parseExpressionStatement(); |
|
4158 break; |
|
4159 } |
|
4160 break; |
|
4161 default: |
|
4162 statement = this.throwUnexpectedToken(this.lookahead); |
|
4163 } |
|
4164 return statement; |
|
4165 }; |
|
4166 // https://tc39.github.io/ecma262/#sec-function-definitions |
|
4167 Parser.prototype.parseFunctionSourceElements = function () { |
|
4168 var node = this.createNode(); |
|
4169 this.expect('{'); |
|
4170 var body = this.parseDirectivePrologues(); |
|
4171 var previousLabelSet = this.context.labelSet; |
|
4172 var previousInIteration = this.context.inIteration; |
|
4173 var previousInSwitch = this.context.inSwitch; |
|
4174 var previousInFunctionBody = this.context.inFunctionBody; |
|
4175 this.context.labelSet = {}; |
|
4176 this.context.inIteration = false; |
|
4177 this.context.inSwitch = false; |
|
4178 this.context.inFunctionBody = true; |
|
4179 while (this.lookahead.type !== 2 /* EOF */) { |
|
4180 if (this.match('}')) { |
|
4181 break; |
|
4182 } |
|
4183 body.push(this.parseStatementListItem()); |
|
4184 } |
|
4185 this.expect('}'); |
|
4186 this.context.labelSet = previousLabelSet; |
|
4187 this.context.inIteration = previousInIteration; |
|
4188 this.context.inSwitch = previousInSwitch; |
|
4189 this.context.inFunctionBody = previousInFunctionBody; |
|
4190 return this.finalize(node, new Node.BlockStatement(body)); |
|
4191 }; |
|
4192 Parser.prototype.validateParam = function (options, param, name) { |
|
4193 var key = '$' + name; |
|
4194 if (this.context.strict) { |
|
4195 if (this.scanner.isRestrictedWord(name)) { |
|
4196 options.stricted = param; |
|
4197 options.message = messages_1.Messages.StrictParamName; |
|
4198 } |
|
4199 if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { |
|
4200 options.stricted = param; |
|
4201 options.message = messages_1.Messages.StrictParamDupe; |
|
4202 } |
|
4203 } |
|
4204 else if (!options.firstRestricted) { |
|
4205 if (this.scanner.isRestrictedWord(name)) { |
|
4206 options.firstRestricted = param; |
|
4207 options.message = messages_1.Messages.StrictParamName; |
|
4208 } |
|
4209 else if (this.scanner.isStrictModeReservedWord(name)) { |
|
4210 options.firstRestricted = param; |
|
4211 options.message = messages_1.Messages.StrictReservedWord; |
|
4212 } |
|
4213 else if (Object.prototype.hasOwnProperty.call(options.paramSet, key)) { |
|
4214 options.stricted = param; |
|
4215 options.message = messages_1.Messages.StrictParamDupe; |
|
4216 } |
|
4217 } |
|
4218 /* istanbul ignore next */ |
|
4219 if (typeof Object.defineProperty === 'function') { |
|
4220 Object.defineProperty(options.paramSet, key, { value: true, enumerable: true, writable: true, configurable: true }); |
|
4221 } |
|
4222 else { |
|
4223 options.paramSet[key] = true; |
|
4224 } |
|
4225 }; |
|
4226 Parser.prototype.parseRestElement = function (params) { |
|
4227 var node = this.createNode(); |
|
4228 this.expect('...'); |
|
4229 var arg = this.parsePattern(params); |
|
4230 if (this.match('=')) { |
|
4231 this.throwError(messages_1.Messages.DefaultRestParameter); |
|
4232 } |
|
4233 if (!this.match(')')) { |
|
4234 this.throwError(messages_1.Messages.ParameterAfterRestParameter); |
|
4235 } |
|
4236 return this.finalize(node, new Node.RestElement(arg)); |
|
4237 }; |
|
4238 Parser.prototype.parseFormalParameter = function (options) { |
|
4239 var params = []; |
|
4240 var param = this.match('...') ? this.parseRestElement(params) : this.parsePatternWithDefault(params); |
|
4241 for (var i = 0; i < params.length; i++) { |
|
4242 this.validateParam(options, params[i], params[i].value); |
|
4243 } |
|
4244 options.simple = options.simple && (param instanceof Node.Identifier); |
|
4245 options.params.push(param); |
|
4246 }; |
|
4247 Parser.prototype.parseFormalParameters = function (firstRestricted) { |
|
4248 var options; |
|
4249 options = { |
|
4250 simple: true, |
|
4251 params: [], |
|
4252 firstRestricted: firstRestricted |
|
4253 }; |
|
4254 this.expect('('); |
|
4255 if (!this.match(')')) { |
|
4256 options.paramSet = {}; |
|
4257 while (this.lookahead.type !== 2 /* EOF */) { |
|
4258 this.parseFormalParameter(options); |
|
4259 if (this.match(')')) { |
|
4260 break; |
|
4261 } |
|
4262 this.expect(','); |
|
4263 if (this.match(')')) { |
|
4264 break; |
|
4265 } |
|
4266 } |
|
4267 } |
|
4268 this.expect(')'); |
|
4269 return { |
|
4270 simple: options.simple, |
|
4271 params: options.params, |
|
4272 stricted: options.stricted, |
|
4273 firstRestricted: options.firstRestricted, |
|
4274 message: options.message |
|
4275 }; |
|
4276 }; |
|
4277 Parser.prototype.matchAsyncFunction = function () { |
|
4278 var match = this.matchContextualKeyword('async'); |
|
4279 if (match) { |
|
4280 var state = this.scanner.saveState(); |
|
4281 this.scanner.scanComments(); |
|
4282 var next = this.scanner.lex(); |
|
4283 this.scanner.restoreState(state); |
|
4284 match = (state.lineNumber === next.lineNumber) && (next.type === 4 /* Keyword */) && (next.value === 'function'); |
|
4285 } |
|
4286 return match; |
|
4287 }; |
|
4288 Parser.prototype.parseFunctionDeclaration = function (identifierIsOptional) { |
|
4289 var node = this.createNode(); |
|
4290 var isAsync = this.matchContextualKeyword('async'); |
|
4291 if (isAsync) { |
|
4292 this.nextToken(); |
|
4293 } |
|
4294 this.expectKeyword('function'); |
|
4295 var isGenerator = isAsync ? false : this.match('*'); |
|
4296 if (isGenerator) { |
|
4297 this.nextToken(); |
|
4298 } |
|
4299 var message; |
|
4300 var id = null; |
|
4301 var firstRestricted = null; |
|
4302 if (!identifierIsOptional || !this.match('(')) { |
|
4303 var token = this.lookahead; |
|
4304 id = this.parseVariableIdentifier(); |
|
4305 if (this.context.strict) { |
|
4306 if (this.scanner.isRestrictedWord(token.value)) { |
|
4307 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); |
|
4308 } |
|
4309 } |
|
4310 else { |
|
4311 if (this.scanner.isRestrictedWord(token.value)) { |
|
4312 firstRestricted = token; |
|
4313 message = messages_1.Messages.StrictFunctionName; |
|
4314 } |
|
4315 else if (this.scanner.isStrictModeReservedWord(token.value)) { |
|
4316 firstRestricted = token; |
|
4317 message = messages_1.Messages.StrictReservedWord; |
|
4318 } |
|
4319 } |
|
4320 } |
|
4321 var previousAllowAwait = this.context.await; |
|
4322 var previousAllowYield = this.context.allowYield; |
|
4323 this.context.await = isAsync; |
|
4324 this.context.allowYield = !isGenerator; |
|
4325 var formalParameters = this.parseFormalParameters(firstRestricted); |
|
4326 var params = formalParameters.params; |
|
4327 var stricted = formalParameters.stricted; |
|
4328 firstRestricted = formalParameters.firstRestricted; |
|
4329 if (formalParameters.message) { |
|
4330 message = formalParameters.message; |
|
4331 } |
|
4332 var previousStrict = this.context.strict; |
|
4333 var previousAllowStrictDirective = this.context.allowStrictDirective; |
|
4334 this.context.allowStrictDirective = formalParameters.simple; |
|
4335 var body = this.parseFunctionSourceElements(); |
|
4336 if (this.context.strict && firstRestricted) { |
|
4337 this.throwUnexpectedToken(firstRestricted, message); |
|
4338 } |
|
4339 if (this.context.strict && stricted) { |
|
4340 this.tolerateUnexpectedToken(stricted, message); |
|
4341 } |
|
4342 this.context.strict = previousStrict; |
|
4343 this.context.allowStrictDirective = previousAllowStrictDirective; |
|
4344 this.context.await = previousAllowAwait; |
|
4345 this.context.allowYield = previousAllowYield; |
|
4346 return isAsync ? this.finalize(node, new Node.AsyncFunctionDeclaration(id, params, body)) : |
|
4347 this.finalize(node, new Node.FunctionDeclaration(id, params, body, isGenerator)); |
|
4348 }; |
|
4349 Parser.prototype.parseFunctionExpression = function () { |
|
4350 var node = this.createNode(); |
|
4351 var isAsync = this.matchContextualKeyword('async'); |
|
4352 if (isAsync) { |
|
4353 this.nextToken(); |
|
4354 } |
|
4355 this.expectKeyword('function'); |
|
4356 var isGenerator = isAsync ? false : this.match('*'); |
|
4357 if (isGenerator) { |
|
4358 this.nextToken(); |
|
4359 } |
|
4360 var message; |
|
4361 var id = null; |
|
4362 var firstRestricted; |
|
4363 var previousAllowAwait = this.context.await; |
|
4364 var previousAllowYield = this.context.allowYield; |
|
4365 this.context.await = isAsync; |
|
4366 this.context.allowYield = !isGenerator; |
|
4367 if (!this.match('(')) { |
|
4368 var token = this.lookahead; |
|
4369 id = (!this.context.strict && !isGenerator && this.matchKeyword('yield')) ? this.parseIdentifierName() : this.parseVariableIdentifier(); |
|
4370 if (this.context.strict) { |
|
4371 if (this.scanner.isRestrictedWord(token.value)) { |
|
4372 this.tolerateUnexpectedToken(token, messages_1.Messages.StrictFunctionName); |
|
4373 } |
|
4374 } |
|
4375 else { |
|
4376 if (this.scanner.isRestrictedWord(token.value)) { |
|
4377 firstRestricted = token; |
|
4378 message = messages_1.Messages.StrictFunctionName; |
|
4379 } |
|
4380 else if (this.scanner.isStrictModeReservedWord(token.value)) { |
|
4381 firstRestricted = token; |
|
4382 message = messages_1.Messages.StrictReservedWord; |
|
4383 } |
|
4384 } |
|
4385 } |
|
4386 var formalParameters = this.parseFormalParameters(firstRestricted); |
|
4387 var params = formalParameters.params; |
|
4388 var stricted = formalParameters.stricted; |
|
4389 firstRestricted = formalParameters.firstRestricted; |
|
4390 if (formalParameters.message) { |
|
4391 message = formalParameters.message; |
|
4392 } |
|
4393 var previousStrict = this.context.strict; |
|
4394 var previousAllowStrictDirective = this.context.allowStrictDirective; |
|
4395 this.context.allowStrictDirective = formalParameters.simple; |
|
4396 var body = this.parseFunctionSourceElements(); |
|
4397 if (this.context.strict && firstRestricted) { |
|
4398 this.throwUnexpectedToken(firstRestricted, message); |
|
4399 } |
|
4400 if (this.context.strict && stricted) { |
|
4401 this.tolerateUnexpectedToken(stricted, message); |
|
4402 } |
|
4403 this.context.strict = previousStrict; |
|
4404 this.context.allowStrictDirective = previousAllowStrictDirective; |
|
4405 this.context.await = previousAllowAwait; |
|
4406 this.context.allowYield = previousAllowYield; |
|
4407 return isAsync ? this.finalize(node, new Node.AsyncFunctionExpression(id, params, body)) : |
|
4408 this.finalize(node, new Node.FunctionExpression(id, params, body, isGenerator)); |
|
4409 }; |
|
4410 // https://tc39.github.io/ecma262/#sec-directive-prologues-and-the-use-strict-directive |
|
4411 Parser.prototype.parseDirective = function () { |
|
4412 var token = this.lookahead; |
|
4413 var node = this.createNode(); |
|
4414 var expr = this.parseExpression(); |
|
4415 var directive = (expr.type === syntax_1.Syntax.Literal) ? this.getTokenRaw(token).slice(1, -1) : null; |
|
4416 this.consumeSemicolon(); |
|
4417 return this.finalize(node, directive ? new Node.Directive(expr, directive) : new Node.ExpressionStatement(expr)); |
|
4418 }; |
|
4419 Parser.prototype.parseDirectivePrologues = function () { |
|
4420 var firstRestricted = null; |
|
4421 var body = []; |
|
4422 while (true) { |
|
4423 var token = this.lookahead; |
|
4424 if (token.type !== 8 /* StringLiteral */) { |
|
4425 break; |
|
4426 } |
|
4427 var statement = this.parseDirective(); |
|
4428 body.push(statement); |
|
4429 var directive = statement.directive; |
|
4430 if (typeof directive !== 'string') { |
|
4431 break; |
|
4432 } |
|
4433 if (directive === 'use strict') { |
|
4434 this.context.strict = true; |
|
4435 if (firstRestricted) { |
|
4436 this.tolerateUnexpectedToken(firstRestricted, messages_1.Messages.StrictOctalLiteral); |
|
4437 } |
|
4438 if (!this.context.allowStrictDirective) { |
|
4439 this.tolerateUnexpectedToken(token, messages_1.Messages.IllegalLanguageModeDirective); |
|
4440 } |
|
4441 } |
|
4442 else { |
|
4443 if (!firstRestricted && token.octal) { |
|
4444 firstRestricted = token; |
|
4445 } |
|
4446 } |
|
4447 } |
|
4448 return body; |
|
4449 }; |
|
4450 // https://tc39.github.io/ecma262/#sec-method-definitions |
|
4451 Parser.prototype.qualifiedPropertyName = function (token) { |
|
4452 switch (token.type) { |
|
4453 case 3 /* Identifier */: |
|
4454 case 8 /* StringLiteral */: |
|
4455 case 1 /* BooleanLiteral */: |
|
4456 case 5 /* NullLiteral */: |
|
4457 case 6 /* NumericLiteral */: |
|
4458 case 4 /* Keyword */: |
|
4459 return true; |
|
4460 case 7 /* Punctuator */: |
|
4461 return token.value === '['; |
|
4462 default: |
|
4463 break; |
|
4464 } |
|
4465 return false; |
|
4466 }; |
|
4467 Parser.prototype.parseGetterMethod = function () { |
|
4468 var node = this.createNode(); |
|
4469 var isGenerator = false; |
|
4470 var previousAllowYield = this.context.allowYield; |
|
4471 this.context.allowYield = false; |
|
4472 var formalParameters = this.parseFormalParameters(); |
|
4473 if (formalParameters.params.length > 0) { |
|
4474 this.tolerateError(messages_1.Messages.BadGetterArity); |
|
4475 } |
|
4476 var method = this.parsePropertyMethod(formalParameters); |
|
4477 this.context.allowYield = previousAllowYield; |
|
4478 return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); |
|
4479 }; |
|
4480 Parser.prototype.parseSetterMethod = function () { |
|
4481 var node = this.createNode(); |
|
4482 var isGenerator = false; |
|
4483 var previousAllowYield = this.context.allowYield; |
|
4484 this.context.allowYield = false; |
|
4485 var formalParameters = this.parseFormalParameters(); |
|
4486 if (formalParameters.params.length !== 1) { |
|
4487 this.tolerateError(messages_1.Messages.BadSetterArity); |
|
4488 } |
|
4489 else if (formalParameters.params[0] instanceof Node.RestElement) { |
|
4490 this.tolerateError(messages_1.Messages.BadSetterRestParameter); |
|
4491 } |
|
4492 var method = this.parsePropertyMethod(formalParameters); |
|
4493 this.context.allowYield = previousAllowYield; |
|
4494 return this.finalize(node, new Node.FunctionExpression(null, formalParameters.params, method, isGenerator)); |
|
4495 }; |
|
4496 Parser.prototype.parseGeneratorMethod = function () { |
|
4497 var node = this.createNode(); |
|
4498 var isGenerator = true; |
|
4499 var previousAllowYield = this.context.allowYield; |
|
4500 this.context.allowYield = true; |
|
4501 var params = this.parseFormalParameters(); |
|
4502 this.context.allowYield = false; |
|
4503 var method = this.parsePropertyMethod(params); |
|
4504 this.context.allowYield = previousAllowYield; |
|
4505 return this.finalize(node, new Node.FunctionExpression(null, params.params, method, isGenerator)); |
|
4506 }; |
|
4507 // https://tc39.github.io/ecma262/#sec-generator-function-definitions |
|
4508 Parser.prototype.isStartOfExpression = function () { |
|
4509 var start = true; |
|
4510 var value = this.lookahead.value; |
|
4511 switch (this.lookahead.type) { |
|
4512 case 7 /* Punctuator */: |
|
4513 start = (value === '[') || (value === '(') || (value === '{') || |
|
4514 (value === '+') || (value === '-') || |
|
4515 (value === '!') || (value === '~') || |
|
4516 (value === '++') || (value === '--') || |
|
4517 (value === '/') || (value === '/='); // regular expression literal |
|
4518 break; |
|
4519 case 4 /* Keyword */: |
|
4520 start = (value === 'class') || (value === 'delete') || |
|
4521 (value === 'function') || (value === 'let') || (value === 'new') || |
|
4522 (value === 'super') || (value === 'this') || (value === 'typeof') || |
|
4523 (value === 'void') || (value === 'yield'); |
|
4524 break; |
|
4525 default: |
|
4526 break; |
|
4527 } |
|
4528 return start; |
|
4529 }; |
|
4530 Parser.prototype.parseYieldExpression = function () { |
|
4531 var node = this.createNode(); |
|
4532 this.expectKeyword('yield'); |
|
4533 var argument = null; |
|
4534 var delegate = false; |
|
4535 if (!this.hasLineTerminator) { |
|
4536 var previousAllowYield = this.context.allowYield; |
|
4537 this.context.allowYield = false; |
|
4538 delegate = this.match('*'); |
|
4539 if (delegate) { |
|
4540 this.nextToken(); |
|
4541 argument = this.parseAssignmentExpression(); |
|
4542 } |
|
4543 else if (this.isStartOfExpression()) { |
|
4544 argument = this.parseAssignmentExpression(); |
|
4545 } |
|
4546 this.context.allowYield = previousAllowYield; |
|
4547 } |
|
4548 return this.finalize(node, new Node.YieldExpression(argument, delegate)); |
|
4549 }; |
|
4550 // https://tc39.github.io/ecma262/#sec-class-definitions |
|
4551 Parser.prototype.parseClassElement = function (hasConstructor) { |
|
4552 var token = this.lookahead; |
|
4553 var node = this.createNode(); |
|
4554 var kind = ''; |
|
4555 var key = null; |
|
4556 var value = null; |
|
4557 var computed = false; |
|
4558 var method = false; |
|
4559 var isStatic = false; |
|
4560 var isAsync = false; |
|
4561 if (this.match('*')) { |
|
4562 this.nextToken(); |
|
4563 } |
|
4564 else { |
|
4565 computed = this.match('['); |
|
4566 key = this.parseObjectPropertyKey(); |
|
4567 var id = key; |
|
4568 if (id.name === 'static' && (this.qualifiedPropertyName(this.lookahead) || this.match('*'))) { |
|
4569 token = this.lookahead; |
|
4570 isStatic = true; |
|
4571 computed = this.match('['); |
|
4572 if (this.match('*')) { |
|
4573 this.nextToken(); |
|
4574 } |
|
4575 else { |
|
4576 key = this.parseObjectPropertyKey(); |
|
4577 } |
|
4578 } |
|
4579 if ((token.type === 3 /* Identifier */) && !this.hasLineTerminator && (token.value === 'async')) { |
|
4580 var punctuator = this.lookahead.value; |
|
4581 if (punctuator !== ':' && punctuator !== '(' && punctuator !== '*') { |
|
4582 isAsync = true; |
|
4583 token = this.lookahead; |
|
4584 key = this.parseObjectPropertyKey(); |
|
4585 if (token.type === 3 /* Identifier */) { |
|
4586 if (token.value === 'get' || token.value === 'set') { |
|
4587 this.tolerateUnexpectedToken(token); |
|
4588 } |
|
4589 else if (token.value === 'constructor') { |
|
4590 this.tolerateUnexpectedToken(token, messages_1.Messages.ConstructorIsAsync); |
|
4591 } |
|
4592 } |
|
4593 } |
|
4594 } |
|
4595 } |
|
4596 var lookaheadPropertyKey = this.qualifiedPropertyName(this.lookahead); |
|
4597 if (token.type === 3 /* Identifier */) { |
|
4598 if (token.value === 'get' && lookaheadPropertyKey) { |
|
4599 kind = 'get'; |
|
4600 computed = this.match('['); |
|
4601 key = this.parseObjectPropertyKey(); |
|
4602 this.context.allowYield = false; |
|
4603 value = this.parseGetterMethod(); |
|
4604 } |
|
4605 else if (token.value === 'set' && lookaheadPropertyKey) { |
|
4606 kind = 'set'; |
|
4607 computed = this.match('['); |
|
4608 key = this.parseObjectPropertyKey(); |
|
4609 value = this.parseSetterMethod(); |
|
4610 } |
|
4611 } |
|
4612 else if (token.type === 7 /* Punctuator */ && token.value === '*' && lookaheadPropertyKey) { |
|
4613 kind = 'init'; |
|
4614 computed = this.match('['); |
|
4615 key = this.parseObjectPropertyKey(); |
|
4616 value = this.parseGeneratorMethod(); |
|
4617 method = true; |
|
4618 } |
|
4619 if (!kind && key && this.match('(')) { |
|
4620 kind = 'init'; |
|
4621 value = isAsync ? this.parsePropertyMethodAsyncFunction() : this.parsePropertyMethodFunction(); |
|
4622 method = true; |
|
4623 } |
|
4624 if (!kind) { |
|
4625 this.throwUnexpectedToken(this.lookahead); |
|
4626 } |
|
4627 if (kind === 'init') { |
|
4628 kind = 'method'; |
|
4629 } |
|
4630 if (!computed) { |
|
4631 if (isStatic && this.isPropertyKey(key, 'prototype')) { |
|
4632 this.throwUnexpectedToken(token, messages_1.Messages.StaticPrototype); |
|
4633 } |
|
4634 if (!isStatic && this.isPropertyKey(key, 'constructor')) { |
|
4635 if (kind !== 'method' || !method || (value && value.generator)) { |
|
4636 this.throwUnexpectedToken(token, messages_1.Messages.ConstructorSpecialMethod); |
|
4637 } |
|
4638 if (hasConstructor.value) { |
|
4639 this.throwUnexpectedToken(token, messages_1.Messages.DuplicateConstructor); |
|
4640 } |
|
4641 else { |
|
4642 hasConstructor.value = true; |
|
4643 } |
|
4644 kind = 'constructor'; |
|
4645 } |
|
4646 } |
|
4647 return this.finalize(node, new Node.MethodDefinition(key, computed, value, kind, isStatic)); |
|
4648 }; |
|
4649 Parser.prototype.parseClassElementList = function () { |
|
4650 var body = []; |
|
4651 var hasConstructor = { value: false }; |
|
4652 this.expect('{'); |
|
4653 while (!this.match('}')) { |
|
4654 if (this.match(';')) { |
|
4655 this.nextToken(); |
|
4656 } |
|
4657 else { |
|
4658 body.push(this.parseClassElement(hasConstructor)); |
|
4659 } |
|
4660 } |
|
4661 this.expect('}'); |
|
4662 return body; |
|
4663 }; |
|
4664 Parser.prototype.parseClassBody = function () { |
|
4665 var node = this.createNode(); |
|
4666 var elementList = this.parseClassElementList(); |
|
4667 return this.finalize(node, new Node.ClassBody(elementList)); |
|
4668 }; |
|
4669 Parser.prototype.parseClassDeclaration = function (identifierIsOptional) { |
|
4670 var node = this.createNode(); |
|
4671 var previousStrict = this.context.strict; |
|
4672 this.context.strict = true; |
|
4673 this.expectKeyword('class'); |
|
4674 var id = (identifierIsOptional && (this.lookahead.type !== 3 /* Identifier */)) ? null : this.parseVariableIdentifier(); |
|
4675 var superClass = null; |
|
4676 if (this.matchKeyword('extends')) { |
|
4677 this.nextToken(); |
|
4678 superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); |
|
4679 } |
|
4680 var classBody = this.parseClassBody(); |
|
4681 this.context.strict = previousStrict; |
|
4682 return this.finalize(node, new Node.ClassDeclaration(id, superClass, classBody)); |
|
4683 }; |
|
4684 Parser.prototype.parseClassExpression = function () { |
|
4685 var node = this.createNode(); |
|
4686 var previousStrict = this.context.strict; |
|
4687 this.context.strict = true; |
|
4688 this.expectKeyword('class'); |
|
4689 var id = (this.lookahead.type === 3 /* Identifier */) ? this.parseVariableIdentifier() : null; |
|
4690 var superClass = null; |
|
4691 if (this.matchKeyword('extends')) { |
|
4692 this.nextToken(); |
|
4693 superClass = this.isolateCoverGrammar(this.parseLeftHandSideExpressionAllowCall); |
|
4694 } |
|
4695 var classBody = this.parseClassBody(); |
|
4696 this.context.strict = previousStrict; |
|
4697 return this.finalize(node, new Node.ClassExpression(id, superClass, classBody)); |
|
4698 }; |
|
4699 // https://tc39.github.io/ecma262/#sec-scripts |
|
4700 // https://tc39.github.io/ecma262/#sec-modules |
|
4701 Parser.prototype.parseModule = function () { |
|
4702 this.context.strict = true; |
|
4703 this.context.isModule = true; |
|
4704 var node = this.createNode(); |
|
4705 var body = this.parseDirectivePrologues(); |
|
4706 while (this.lookahead.type !== 2 /* EOF */) { |
|
4707 body.push(this.parseStatementListItem()); |
|
4708 } |
|
4709 return this.finalize(node, new Node.Module(body)); |
|
4710 }; |
|
4711 Parser.prototype.parseScript = function () { |
|
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.Script(body)); |
|
4718 }; |
|
4719 // https://tc39.github.io/ecma262/#sec-imports |
|
4720 Parser.prototype.parseModuleSpecifier = function () { |
|
4721 var node = this.createNode(); |
|
4722 if (this.lookahead.type !== 8 /* StringLiteral */) { |
|
4723 this.throwError(messages_1.Messages.InvalidModuleSpecifier); |
|
4724 } |
|
4725 var token = this.nextToken(); |
|
4726 var raw = this.getTokenRaw(token); |
|
4727 return this.finalize(node, new Node.Literal(token.value, raw)); |
|
4728 }; |
|
4729 // import {<foo as bar>} ...; |
|
4730 Parser.prototype.parseImportSpecifier = function () { |
|
4731 var node = this.createNode(); |
|
4732 var imported; |
|
4733 var local; |
|
4734 if (this.lookahead.type === 3 /* Identifier */) { |
|
4735 imported = this.parseVariableIdentifier(); |
|
4736 local = imported; |
|
4737 if (this.matchContextualKeyword('as')) { |
|
4738 this.nextToken(); |
|
4739 local = this.parseVariableIdentifier(); |
|
4740 } |
|
4741 } |
|
4742 else { |
|
4743 imported = this.parseIdentifierName(); |
|
4744 local = imported; |
|
4745 if (this.matchContextualKeyword('as')) { |
|
4746 this.nextToken(); |
|
4747 local = this.parseVariableIdentifier(); |
|
4748 } |
|
4749 else { |
|
4750 this.throwUnexpectedToken(this.nextToken()); |
|
4751 } |
|
4752 } |
|
4753 return this.finalize(node, new Node.ImportSpecifier(local, imported)); |
|
4754 }; |
|
4755 // {foo, bar as bas} |
|
4756 Parser.prototype.parseNamedImports = function () { |
|
4757 this.expect('{'); |
|
4758 var specifiers = []; |
|
4759 while (!this.match('}')) { |
|
4760 specifiers.push(this.parseImportSpecifier()); |
|
4761 if (!this.match('}')) { |
|
4762 this.expect(','); |
|
4763 } |
|
4764 } |
|
4765 this.expect('}'); |
|
4766 return specifiers; |
|
4767 }; |
|
4768 // import <foo> ...; |
|
4769 Parser.prototype.parseImportDefaultSpecifier = function () { |
|
4770 var node = this.createNode(); |
|
4771 var local = this.parseIdentifierName(); |
|
4772 return this.finalize(node, new Node.ImportDefaultSpecifier(local)); |
|
4773 }; |
|
4774 // import <* as foo> ...; |
|
4775 Parser.prototype.parseImportNamespaceSpecifier = function () { |
|
4776 var node = this.createNode(); |
|
4777 this.expect('*'); |
|
4778 if (!this.matchContextualKeyword('as')) { |
|
4779 this.throwError(messages_1.Messages.NoAsAfterImportNamespace); |
|
4780 } |
|
4781 this.nextToken(); |
|
4782 var local = this.parseIdentifierName(); |
|
4783 return this.finalize(node, new Node.ImportNamespaceSpecifier(local)); |
|
4784 }; |
|
4785 Parser.prototype.parseImportDeclaration = function () { |
|
4786 if (this.context.inFunctionBody) { |
|
4787 this.throwError(messages_1.Messages.IllegalImportDeclaration); |
|
4788 } |
|
4789 var node = this.createNode(); |
|
4790 this.expectKeyword('import'); |
|
4791 var src; |
|
4792 var specifiers = []; |
|
4793 if (this.lookahead.type === 8 /* StringLiteral */) { |
|
4794 // import 'foo'; |
|
4795 src = this.parseModuleSpecifier(); |
|
4796 } |
|
4797 else { |
|
4798 if (this.match('{')) { |
|
4799 // import {bar} |
|
4800 specifiers = specifiers.concat(this.parseNamedImports()); |
|
4801 } |
|
4802 else if (this.match('*')) { |
|
4803 // import * as foo |
|
4804 specifiers.push(this.parseImportNamespaceSpecifier()); |
|
4805 } |
|
4806 else if (this.isIdentifierName(this.lookahead) && !this.matchKeyword('default')) { |
|
4807 // import foo |
|
4808 specifiers.push(this.parseImportDefaultSpecifier()); |
|
4809 if (this.match(',')) { |
|
4810 this.nextToken(); |
|
4811 if (this.match('*')) { |
|
4812 // import foo, * as foo |
|
4813 specifiers.push(this.parseImportNamespaceSpecifier()); |
|
4814 } |
|
4815 else if (this.match('{')) { |
|
4816 // import foo, {bar} |
|
4817 specifiers = specifiers.concat(this.parseNamedImports()); |
|
4818 } |
|
4819 else { |
|
4820 this.throwUnexpectedToken(this.lookahead); |
|
4821 } |
|
4822 } |
|
4823 } |
|
4824 else { |
|
4825 this.throwUnexpectedToken(this.nextToken()); |
|
4826 } |
|
4827 if (!this.matchContextualKeyword('from')) { |
|
4828 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; |
|
4829 this.throwError(message, this.lookahead.value); |
|
4830 } |
|
4831 this.nextToken(); |
|
4832 src = this.parseModuleSpecifier(); |
|
4833 } |
|
4834 this.consumeSemicolon(); |
|
4835 return this.finalize(node, new Node.ImportDeclaration(specifiers, src)); |
|
4836 }; |
|
4837 // https://tc39.github.io/ecma262/#sec-exports |
|
4838 Parser.prototype.parseExportSpecifier = function () { |
|
4839 var node = this.createNode(); |
|
4840 var local = this.parseIdentifierName(); |
|
4841 var exported = local; |
|
4842 if (this.matchContextualKeyword('as')) { |
|
4843 this.nextToken(); |
|
4844 exported = this.parseIdentifierName(); |
|
4845 } |
|
4846 return this.finalize(node, new Node.ExportSpecifier(local, exported)); |
|
4847 }; |
|
4848 Parser.prototype.parseExportDeclaration = function () { |
|
4849 if (this.context.inFunctionBody) { |
|
4850 this.throwError(messages_1.Messages.IllegalExportDeclaration); |
|
4851 } |
|
4852 var node = this.createNode(); |
|
4853 this.expectKeyword('export'); |
|
4854 var exportDeclaration; |
|
4855 if (this.matchKeyword('default')) { |
|
4856 // export default ... |
|
4857 this.nextToken(); |
|
4858 if (this.matchKeyword('function')) { |
|
4859 // export default function foo () {} |
|
4860 // export default function () {} |
|
4861 var declaration = this.parseFunctionDeclaration(true); |
|
4862 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); |
|
4863 } |
|
4864 else if (this.matchKeyword('class')) { |
|
4865 // export default class foo {} |
|
4866 var declaration = this.parseClassDeclaration(true); |
|
4867 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); |
|
4868 } |
|
4869 else if (this.matchContextualKeyword('async')) { |
|
4870 // export default async function f () {} |
|
4871 // export default async function () {} |
|
4872 // export default async x => x |
|
4873 var declaration = this.matchAsyncFunction() ? this.parseFunctionDeclaration(true) : this.parseAssignmentExpression(); |
|
4874 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); |
|
4875 } |
|
4876 else { |
|
4877 if (this.matchContextualKeyword('from')) { |
|
4878 this.throwError(messages_1.Messages.UnexpectedToken, this.lookahead.value); |
|
4879 } |
|
4880 // export default {}; |
|
4881 // export default []; |
|
4882 // export default (1 + 2); |
|
4883 var declaration = this.match('{') ? this.parseObjectInitializer() : |
|
4884 this.match('[') ? this.parseArrayInitializer() : this.parseAssignmentExpression(); |
|
4885 this.consumeSemicolon(); |
|
4886 exportDeclaration = this.finalize(node, new Node.ExportDefaultDeclaration(declaration)); |
|
4887 } |
|
4888 } |
|
4889 else if (this.match('*')) { |
|
4890 // export * from 'foo'; |
|
4891 this.nextToken(); |
|
4892 if (!this.matchContextualKeyword('from')) { |
|
4893 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; |
|
4894 this.throwError(message, this.lookahead.value); |
|
4895 } |
|
4896 this.nextToken(); |
|
4897 var src = this.parseModuleSpecifier(); |
|
4898 this.consumeSemicolon(); |
|
4899 exportDeclaration = this.finalize(node, new Node.ExportAllDeclaration(src)); |
|
4900 } |
|
4901 else if (this.lookahead.type === 4 /* Keyword */) { |
|
4902 // export var f = 1; |
|
4903 var declaration = void 0; |
|
4904 switch (this.lookahead.value) { |
|
4905 case 'let': |
|
4906 case 'const': |
|
4907 declaration = this.parseLexicalDeclaration({ inFor: false }); |
|
4908 break; |
|
4909 case 'var': |
|
4910 case 'class': |
|
4911 case 'function': |
|
4912 declaration = this.parseStatementListItem(); |
|
4913 break; |
|
4914 default: |
|
4915 this.throwUnexpectedToken(this.lookahead); |
|
4916 } |
|
4917 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); |
|
4918 } |
|
4919 else if (this.matchAsyncFunction()) { |
|
4920 var declaration = this.parseFunctionDeclaration(); |
|
4921 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(declaration, [], null)); |
|
4922 } |
|
4923 else { |
|
4924 var specifiers = []; |
|
4925 var source = null; |
|
4926 var isExportFromIdentifier = false; |
|
4927 this.expect('{'); |
|
4928 while (!this.match('}')) { |
|
4929 isExportFromIdentifier = isExportFromIdentifier || this.matchKeyword('default'); |
|
4930 specifiers.push(this.parseExportSpecifier()); |
|
4931 if (!this.match('}')) { |
|
4932 this.expect(','); |
|
4933 } |
|
4934 } |
|
4935 this.expect('}'); |
|
4936 if (this.matchContextualKeyword('from')) { |
|
4937 // export {default} from 'foo'; |
|
4938 // export {foo} from 'foo'; |
|
4939 this.nextToken(); |
|
4940 source = this.parseModuleSpecifier(); |
|
4941 this.consumeSemicolon(); |
|
4942 } |
|
4943 else if (isExportFromIdentifier) { |
|
4944 // export {default}; // missing fromClause |
|
4945 var message = this.lookahead.value ? messages_1.Messages.UnexpectedToken : messages_1.Messages.MissingFromClause; |
|
4946 this.throwError(message, this.lookahead.value); |
|
4947 } |
|
4948 else { |
|
4949 // export {foo}; |
|
4950 this.consumeSemicolon(); |
|
4951 } |
|
4952 exportDeclaration = this.finalize(node, new Node.ExportNamedDeclaration(null, specifiers, source)); |
|
4953 } |
|
4954 return exportDeclaration; |
|
4955 }; |
|
4956 return Parser; |
|
4957 }()); |
|
4958 exports.Parser = Parser; |
|
4959 |
|
4960 |
|
4961 /***/ }, |
|
4962 /* 9 */ |
|
4963 /***/ function(module, exports) { |
|
4964 |
|
4965 "use strict"; |
|
4966 // Ensure the condition is true, otherwise throw an error. |
|
4967 // This is only to have a better contract semantic, i.e. another safety net |
|
4968 // to catch a logic error. The condition shall be fulfilled in normal case. |
|
4969 // Do NOT use this to enforce a certain condition on any user input. |
|
4970 Object.defineProperty(exports, "__esModule", { value: true }); |
|
4971 function assert(condition, message) { |
|
4972 /* istanbul ignore if */ |
|
4973 if (!condition) { |
|
4974 throw new Error('ASSERT: ' + message); |
|
4975 } |
|
4976 } |
|
4977 exports.assert = assert; |
|
4978 |
|
4979 |
|
4980 /***/ }, |
|
4981 /* 10 */ |
|
4982 /***/ function(module, exports) { |
|
4983 |
|
4984 "use strict"; |
|
4985 /* tslint:disable:max-classes-per-file */ |
|
4986 Object.defineProperty(exports, "__esModule", { value: true }); |
|
4987 var ErrorHandler = (function () { |
|
4988 function ErrorHandler() { |
|
4989 this.errors = []; |
|
4990 this.tolerant = false; |
|
4991 } |
|
4992 ErrorHandler.prototype.recordError = function (error) { |
|
4993 this.errors.push(error); |
|
4994 }; |
|
4995 ErrorHandler.prototype.tolerate = function (error) { |
|
4996 if (this.tolerant) { |
|
4997 this.recordError(error); |
|
4998 } |
|
4999 else { |
|
5000 throw error; |
|
5001 } |
|
5002 }; |
|
5003 ErrorHandler.prototype.constructError = function (msg, column) { |
|
5004 var error = new Error(msg); |
|
5005 try { |
|
5006 throw error; |
|
5007 } |
|
5008 catch (base) { |
|
5009 /* istanbul ignore else */ |
|
5010 if (Object.create && Object.defineProperty) { |
|
5011 error = Object.create(base); |
|
5012 Object.defineProperty(error, 'column', { value: column }); |
|
5013 } |
|
5014 } |
|
5015 /* istanbul ignore next */ |
|
5016 return error; |
|
5017 }; |
|
5018 ErrorHandler.prototype.createError = function (index, line, col, description) { |
|
5019 var msg = 'Line ' + line + ': ' + description; |
|
5020 var error = this.constructError(msg, col); |
|
5021 error.index = index; |
|
5022 error.lineNumber = line; |
|
5023 error.description = description; |
|
5024 return error; |
|
5025 }; |
|
5026 ErrorHandler.prototype.throwError = function (index, line, col, description) { |
|
5027 throw this.createError(index, line, col, description); |
|
5028 }; |
|
5029 ErrorHandler.prototype.tolerateError = function (index, line, col, description) { |
|
5030 var error = this.createError(index, line, col, description); |
|
5031 if (this.tolerant) { |
|
5032 this.recordError(error); |
|
5033 } |
|
5034 else { |
|
5035 throw error; |
|
5036 } |
|
5037 }; |
|
5038 return ErrorHandler; |
|
5039 }()); |
|
5040 exports.ErrorHandler = ErrorHandler; |
|
5041 |
|
5042 |
|
5043 /***/ }, |
|
5044 /* 11 */ |
|
5045 /***/ function(module, exports) { |
|
5046 |
|
5047 "use strict"; |
|
5048 Object.defineProperty(exports, "__esModule", { value: true }); |
|
5049 // Error messages should be identical to V8. |
|
5050 exports.Messages = { |
|
5051 BadGetterArity: 'Getter must not have any formal parameters', |
|
5052 BadSetterArity: 'Setter must have exactly one formal parameter', |
|
5053 BadSetterRestParameter: 'Setter function argument must not be a rest parameter', |
|
5054 ConstructorIsAsync: 'Class constructor may not be an async method', |
|
5055 ConstructorSpecialMethod: 'Class constructor may not be an accessor', |
|
5056 DeclarationMissingInitializer: 'Missing initializer in %0 declaration', |
|
5057 DefaultRestParameter: 'Unexpected token =', |
|
5058 DuplicateBinding: 'Duplicate binding %0', |
|
5059 DuplicateConstructor: 'A class may only have one constructor', |
|
5060 DuplicateProtoProperty: 'Duplicate __proto__ fields are not allowed in object literals', |
|
5061 ForInOfLoopInitializer: '%0 loop variable declaration may not have an initializer', |
|
5062 GeneratorInLegacyContext: 'Generator declarations are not allowed in legacy contexts', |
|
5063 IllegalBreak: 'Illegal break statement', |
|
5064 IllegalContinue: 'Illegal continue statement', |
|
5065 IllegalExportDeclaration: 'Unexpected token', |
|
5066 IllegalImportDeclaration: 'Unexpected token', |
|
5067 IllegalLanguageModeDirective: 'Illegal \'use strict\' directive in function with non-simple parameter list', |
|
5068 IllegalReturn: 'Illegal return statement', |
|
5069 InvalidEscapedReservedWord: 'Keyword must not contain escaped characters', |
|
5070 InvalidHexEscapeSequence: 'Invalid hexadecimal escape sequence', |
|
5071 InvalidLHSInAssignment: 'Invalid left-hand side in assignment', |
|
5072 InvalidLHSInForIn: 'Invalid left-hand side in for-in', |
|
5073 InvalidLHSInForLoop: 'Invalid left-hand side in for-loop', |
|
5074 InvalidModuleSpecifier: 'Unexpected token', |
|
5075 InvalidRegExp: 'Invalid regular expression', |
|
5076 LetInLexicalBinding: 'let is disallowed as a lexically bound name', |
|
5077 MissingFromClause: 'Unexpected token', |
|
5078 MultipleDefaultsInSwitch: 'More than one default clause in switch statement', |
|
5079 NewlineAfterThrow: 'Illegal newline after throw', |
|
5080 NoAsAfterImportNamespace: 'Unexpected token', |
|
5081 NoCatchOrFinally: 'Missing catch or finally after try', |
|
5082 ParameterAfterRestParameter: 'Rest parameter must be last formal parameter', |
|
5083 Redeclaration: '%0 \'%1\' has already been declared', |
|
5084 StaticPrototype: 'Classes may not have static property named prototype', |
|
5085 StrictCatchVariable: 'Catch variable may not be eval or arguments in strict mode', |
|
5086 StrictDelete: 'Delete of an unqualified identifier in strict mode.', |
|
5087 StrictFunction: 'In strict mode code, functions can only be declared at top level or inside a block', |
|
5088 StrictFunctionName: 'Function name may not be eval or arguments in strict mode', |
|
5089 StrictLHSAssignment: 'Assignment to eval or arguments is not allowed in strict mode', |
|
5090 StrictLHSPostfix: 'Postfix increment/decrement may not have eval or arguments operand in strict mode', |
|
5091 StrictLHSPrefix: 'Prefix increment/decrement may not have eval or arguments operand in strict mode', |
|
5092 StrictModeWith: 'Strict mode code may not include a with statement', |
|
5093 StrictOctalLiteral: 'Octal literals are not allowed in strict mode.', |
|
5094 StrictParamDupe: 'Strict mode function may not have duplicate parameter names', |
|
5095 StrictParamName: 'Parameter name eval or arguments is not allowed in strict mode', |
|
5096 StrictReservedWord: 'Use of future reserved word in strict mode', |
|
5097 StrictVarName: 'Variable name may not be eval or arguments in strict mode', |
|
5098 TemplateOctalLiteral: 'Octal literals are not allowed in template strings.', |
|
5099 UnexpectedEOS: 'Unexpected end of input', |
|
5100 UnexpectedIdentifier: 'Unexpected identifier', |
|
5101 UnexpectedNumber: 'Unexpected number', |
|
5102 UnexpectedReserved: 'Unexpected reserved word', |
|
5103 UnexpectedString: 'Unexpected string', |
|
5104 UnexpectedTemplate: 'Unexpected quasi %0', |
|
5105 UnexpectedToken: 'Unexpected token %0', |
|
5106 UnexpectedTokenIllegal: 'Unexpected token ILLEGAL', |
|
5107 UnknownLabel: 'Undefined label \'%0\'', |
|
5108 UnterminatedRegExp: 'Invalid regular expression: missing /' |
|
5109 }; |
|
5110 |
|
5111 |
|
5112 /***/ }, |
|
5113 /* 12 */ |
|
5114 /***/ function(module, exports, __webpack_require__) { |
|
5115 |
|
5116 "use strict"; |
|
5117 Object.defineProperty(exports, "__esModule", { value: true }); |
|
5118 var assert_1 = __webpack_require__(9); |
|
5119 var character_1 = __webpack_require__(4); |
|
5120 var messages_1 = __webpack_require__(11); |
|
5121 function hexValue(ch) { |
|
5122 return '0123456789abcdef'.indexOf(ch.toLowerCase()); |
|
5123 } |
|
5124 function octalValue(ch) { |
|
5125 return '01234567'.indexOf(ch); |
|
5126 } |
|
5127 var Scanner = (function () { |
|
5128 function Scanner(code, handler) { |
|
5129 this.source = code; |
|
5130 this.errorHandler = handler; |
|
5131 this.trackComment = false; |
|
5132 this.length = code.length; |
|
5133 this.index = 0; |
|
5134 this.lineNumber = (code.length > 0) ? 1 : 0; |
|
5135 this.lineStart = 0; |
|
5136 this.curlyStack = []; |
|
5137 } |
|
5138 Scanner.prototype.saveState = function () { |
|
5139 return { |
|
5140 index: this.index, |
|
5141 lineNumber: this.lineNumber, |
|
5142 lineStart: this.lineStart |
|
5143 }; |
|
5144 }; |
|
5145 Scanner.prototype.restoreState = function (state) { |
|
5146 this.index = state.index; |
|
5147 this.lineNumber = state.lineNumber; |
|
5148 this.lineStart = state.lineStart; |
|
5149 }; |
|
5150 Scanner.prototype.eof = function () { |
|
5151 return this.index >= this.length; |
|
5152 }; |
|
5153 Scanner.prototype.throwUnexpectedToken = function (message) { |
|
5154 if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } |
|
5155 return this.errorHandler.throwError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); |
|
5156 }; |
|
5157 Scanner.prototype.tolerateUnexpectedToken = function (message) { |
|
5158 if (message === void 0) { message = messages_1.Messages.UnexpectedTokenIllegal; } |
|
5159 this.errorHandler.tolerateError(this.index, this.lineNumber, this.index - this.lineStart + 1, message); |
|
5160 }; |
|
5161 // https://tc39.github.io/ecma262/#sec-comments |
|
5162 Scanner.prototype.skipSingleLineComment = function (offset) { |
|
5163 var comments = []; |
|
5164 var start, loc; |
|
5165 if (this.trackComment) { |
|
5166 comments = []; |
|
5167 start = this.index - offset; |
|
5168 loc = { |
|
5169 start: { |
|
5170 line: this.lineNumber, |
|
5171 column: this.index - this.lineStart - offset |
|
5172 }, |
|
5173 end: {} |
|
5174 }; |
|
5175 } |
|
5176 while (!this.eof()) { |
|
5177 var ch = this.source.charCodeAt(this.index); |
|
5178 ++this.index; |
|
5179 if (character_1.Character.isLineTerminator(ch)) { |
|
5180 if (this.trackComment) { |
|
5181 loc.end = { |
|
5182 line: this.lineNumber, |
|
5183 column: this.index - this.lineStart - 1 |
|
5184 }; |
|
5185 var entry = { |
|
5186 multiLine: false, |
|
5187 slice: [start + offset, this.index - 1], |
|
5188 range: [start, this.index - 1], |
|
5189 loc: loc |
|
5190 }; |
|
5191 comments.push(entry); |
|
5192 } |
|
5193 if (ch === 13 && this.source.charCodeAt(this.index) === 10) { |
|
5194 ++this.index; |
|
5195 } |
|
5196 ++this.lineNumber; |
|
5197 this.lineStart = this.index; |
|
5198 return comments; |
|
5199 } |
|
5200 } |
|
5201 if (this.trackComment) { |
|
5202 loc.end = { |
|
5203 line: this.lineNumber, |
|
5204 column: this.index - this.lineStart |
|
5205 }; |
|
5206 var entry = { |
|
5207 multiLine: false, |
|
5208 slice: [start + offset, this.index], |
|
5209 range: [start, this.index], |
|
5210 loc: loc |
|
5211 }; |
|
5212 comments.push(entry); |
|
5213 } |
|
5214 return comments; |
|
5215 }; |
|
5216 Scanner.prototype.skipMultiLineComment = function () { |
|
5217 var comments = []; |
|
5218 var start, loc; |
|
5219 if (this.trackComment) { |
|
5220 comments = []; |
|
5221 start = this.index - 2; |
|
5222 loc = { |
|
5223 start: { |
|
5224 line: this.lineNumber, |
|
5225 column: this.index - this.lineStart - 2 |
|
5226 }, |
|
5227 end: {} |
|
5228 }; |
|
5229 } |
|
5230 while (!this.eof()) { |
|
5231 var ch = this.source.charCodeAt(this.index); |
|
5232 if (character_1.Character.isLineTerminator(ch)) { |
|
5233 if (ch === 0x0D && this.source.charCodeAt(this.index + 1) === 0x0A) { |
|
5234 ++this.index; |
|
5235 } |
|
5236 ++this.lineNumber; |
|
5237 ++this.index; |
|
5238 this.lineStart = this.index; |
|
5239 } |
|
5240 else if (ch === 0x2A) { |
|
5241 // Block comment ends with '*/'. |
|
5242 if (this.source.charCodeAt(this.index + 1) === 0x2F) { |
|
5243 this.index += 2; |
|
5244 if (this.trackComment) { |
|
5245 loc.end = { |
|
5246 line: this.lineNumber, |
|
5247 column: this.index - this.lineStart |
|
5248 }; |
|
5249 var entry = { |
|
5250 multiLine: true, |
|
5251 slice: [start + 2, this.index - 2], |
|
5252 range: [start, this.index], |
|
5253 loc: loc |
|
5254 }; |
|
5255 comments.push(entry); |
|
5256 } |
|
5257 return comments; |
|
5258 } |
|
5259 ++this.index; |
|
5260 } |
|
5261 else { |
|
5262 ++this.index; |
|
5263 } |
|
5264 } |
|
5265 // Ran off the end of the file - the whole thing is a comment |
|
5266 if (this.trackComment) { |
|
5267 loc.end = { |
|
5268 line: this.lineNumber, |
|
5269 column: this.index - this.lineStart |
|
5270 }; |
|
5271 var entry = { |
|
5272 multiLine: true, |
|
5273 slice: [start + 2, this.index], |
|
5274 range: [start, this.index], |
|
5275 loc: loc |
|
5276 }; |
|
5277 comments.push(entry); |
|
5278 } |
|
5279 this.tolerateUnexpectedToken(); |
|
5280 return comments; |
|
5281 }; |
|
5282 Scanner.prototype.scanComments = function () { |
|
5283 var comments; |
|
5284 if (this.trackComment) { |
|
5285 comments = []; |
|
5286 } |
|
5287 var start = (this.index === 0); |
|
5288 while (!this.eof()) { |
|
5289 var ch = this.source.charCodeAt(this.index); |
|
5290 if (character_1.Character.isWhiteSpace(ch)) { |
|
5291 ++this.index; |
|
5292 } |
|
5293 else if (character_1.Character.isLineTerminator(ch)) { |
|
5294 ++this.index; |
|
5295 if (ch === 0x0D && this.source.charCodeAt(this.index) === 0x0A) { |
|
5296 ++this.index; |
|
5297 } |
|
5298 ++this.lineNumber; |
|
5299 this.lineStart = this.index; |
|
5300 start = true; |
|
5301 } |
|
5302 else if (ch === 0x2F) { |
|
5303 ch = this.source.charCodeAt(this.index + 1); |
|
5304 if (ch === 0x2F) { |
|
5305 this.index += 2; |
|
5306 var comment = this.skipSingleLineComment(2); |
|
5307 if (this.trackComment) { |
|
5308 comments = comments.concat(comment); |
|
5309 } |
|
5310 start = true; |
|
5311 } |
|
5312 else if (ch === 0x2A) { |
|
5313 this.index += 2; |
|
5314 var comment = this.skipMultiLineComment(); |
|
5315 if (this.trackComment) { |
|
5316 comments = comments.concat(comment); |
|
5317 } |
|
5318 } |
|
5319 else { |
|
5320 break; |
|
5321 } |
|
5322 } |
|
5323 else if (start && ch === 0x2D) { |
|
5324 // U+003E is '>' |
|
5325 if ((this.source.charCodeAt(this.index + 1) === 0x2D) && (this.source.charCodeAt(this.index + 2) === 0x3E)) { |
|
5326 // '-->' is a single-line comment |
|
5327 this.index += 3; |
|
5328 var comment = this.skipSingleLineComment(3); |
|
5329 if (this.trackComment) { |
|
5330 comments = comments.concat(comment); |
|
5331 } |
|
5332 } |
|
5333 else { |
|
5334 break; |
|
5335 } |
|
5336 } |
|
5337 else if (ch === 0x3C) { |
|
5338 if (this.source.slice(this.index + 1, this.index + 4) === '!--') { |
|
5339 this.index += 4; // `<!--` |
|
5340 var comment = this.skipSingleLineComment(4); |
|
5341 if (this.trackComment) { |
|
5342 comments = comments.concat(comment); |
|
5343 } |
|
5344 } |
|
5345 else { |
|
5346 break; |
|
5347 } |
|
5348 } |
|
5349 else { |
|
5350 break; |
|
5351 } |
|
5352 } |
|
5353 return comments; |
|
5354 }; |
|
5355 // https://tc39.github.io/ecma262/#sec-future-reserved-words |
|
5356 Scanner.prototype.isFutureReservedWord = function (id) { |
|
5357 switch (id) { |
|
5358 case 'enum': |
|
5359 case 'export': |
|
5360 case 'import': |
|
5361 case 'super': |
|
5362 return true; |
|
5363 default: |
|
5364 return false; |
|
5365 } |
|
5366 }; |
|
5367 Scanner.prototype.isStrictModeReservedWord = function (id) { |
|
5368 switch (id) { |
|
5369 case 'implements': |
|
5370 case 'interface': |
|
5371 case 'package': |
|
5372 case 'private': |
|
5373 case 'protected': |
|
5374 case 'public': |
|
5375 case 'static': |
|
5376 case 'yield': |
|
5377 case 'let': |
|
5378 return true; |
|
5379 default: |
|
5380 return false; |
|
5381 } |
|
5382 }; |
|
5383 Scanner.prototype.isRestrictedWord = function (id) { |
|
5384 return id === 'eval' || id === 'arguments'; |
|
5385 }; |
|
5386 // https://tc39.github.io/ecma262/#sec-keywords |
|
5387 Scanner.prototype.isKeyword = function (id) { |
|
5388 switch (id.length) { |
|
5389 case 2: |
|
5390 return (id === 'if') || (id === 'in') || (id === 'do'); |
|
5391 case 3: |
|
5392 return (id === 'var') || (id === 'for') || (id === 'new') || |
|
5393 (id === 'try') || (id === 'let'); |
|
5394 case 4: |
|
5395 return (id === 'this') || (id === 'else') || (id === 'case') || |
|
5396 (id === 'void') || (id === 'with') || (id === 'enum'); |
|
5397 case 5: |
|
5398 return (id === 'while') || (id === 'break') || (id === 'catch') || |
|
5399 (id === 'throw') || (id === 'const') || (id === 'yield') || |
|
5400 (id === 'class') || (id === 'super'); |
|
5401 case 6: |
|
5402 return (id === 'return') || (id === 'typeof') || (id === 'delete') || |
|
5403 (id === 'switch') || (id === 'export') || (id === 'import'); |
|
5404 case 7: |
|
5405 return (id === 'default') || (id === 'finally') || (id === 'extends'); |
|
5406 case 8: |
|
5407 return (id === 'function') || (id === 'continue') || (id === 'debugger'); |
|
5408 case 10: |
|
5409 return (id === 'instanceof'); |
|
5410 default: |
|
5411 return false; |
|
5412 } |
|
5413 }; |
|
5414 Scanner.prototype.codePointAt = function (i) { |
|
5415 var cp = this.source.charCodeAt(i); |
|
5416 if (cp >= 0xD800 && cp <= 0xDBFF) { |
|
5417 var second = this.source.charCodeAt(i + 1); |
|
5418 if (second >= 0xDC00 && second <= 0xDFFF) { |
|
5419 var first = cp; |
|
5420 cp = (first - 0xD800) * 0x400 + second - 0xDC00 + 0x10000; |
|
5421 } |
|
5422 } |
|
5423 return cp; |
|
5424 }; |
|
5425 Scanner.prototype.scanHexEscape = function (prefix) { |
|
5426 var len = (prefix === 'u') ? 4 : 2; |
|
5427 var code = 0; |
|
5428 for (var i = 0; i < len; ++i) { |
|
5429 if (!this.eof() && character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) { |
|
5430 code = code * 16 + hexValue(this.source[this.index++]); |
|
5431 } |
|
5432 else { |
|
5433 return null; |
|
5434 } |
|
5435 } |
|
5436 return String.fromCharCode(code); |
|
5437 }; |
|
5438 Scanner.prototype.scanUnicodeCodePointEscape = function () { |
|
5439 var ch = this.source[this.index]; |
|
5440 var code = 0; |
|
5441 // At least, one hex digit is required. |
|
5442 if (ch === '}') { |
|
5443 this.throwUnexpectedToken(); |
|
5444 } |
|
5445 while (!this.eof()) { |
|
5446 ch = this.source[this.index++]; |
|
5447 if (!character_1.Character.isHexDigit(ch.charCodeAt(0))) { |
|
5448 break; |
|
5449 } |
|
5450 code = code * 16 + hexValue(ch); |
|
5451 } |
|
5452 if (code > 0x10FFFF || ch !== '}') { |
|
5453 this.throwUnexpectedToken(); |
|
5454 } |
|
5455 return character_1.Character.fromCodePoint(code); |
|
5456 }; |
|
5457 Scanner.prototype.getIdentifier = function () { |
|
5458 var start = this.index++; |
|
5459 while (!this.eof()) { |
|
5460 var ch = this.source.charCodeAt(this.index); |
|
5461 if (ch === 0x5C) { |
|
5462 // Blackslash (U+005C) marks Unicode escape sequence. |
|
5463 this.index = start; |
|
5464 return this.getComplexIdentifier(); |
|
5465 } |
|
5466 else if (ch >= 0xD800 && ch < 0xDFFF) { |
|
5467 // Need to handle surrogate pairs. |
|
5468 this.index = start; |
|
5469 return this.getComplexIdentifier(); |
|
5470 } |
|
5471 if (character_1.Character.isIdentifierPart(ch)) { |
|
5472 ++this.index; |
|
5473 } |
|
5474 else { |
|
5475 break; |
|
5476 } |
|
5477 } |
|
5478 return this.source.slice(start, this.index); |
|
5479 }; |
|
5480 Scanner.prototype.getComplexIdentifier = function () { |
|
5481 var cp = this.codePointAt(this.index); |
|
5482 var id = character_1.Character.fromCodePoint(cp); |
|
5483 this.index += id.length; |
|
5484 // '\u' (U+005C, U+0075) denotes an escaped character. |
|
5485 var ch; |
|
5486 if (cp === 0x5C) { |
|
5487 if (this.source.charCodeAt(this.index) !== 0x75) { |
|
5488 this.throwUnexpectedToken(); |
|
5489 } |
|
5490 ++this.index; |
|
5491 if (this.source[this.index] === '{') { |
|
5492 ++this.index; |
|
5493 ch = this.scanUnicodeCodePointEscape(); |
|
5494 } |
|
5495 else { |
|
5496 ch = this.scanHexEscape('u'); |
|
5497 if (ch === null || ch === '\\' || !character_1.Character.isIdentifierStart(ch.charCodeAt(0))) { |
|
5498 this.throwUnexpectedToken(); |
|
5499 } |
|
5500 } |
|
5501 id = ch; |
|
5502 } |
|
5503 while (!this.eof()) { |
|
5504 cp = this.codePointAt(this.index); |
|
5505 if (!character_1.Character.isIdentifierPart(cp)) { |
|
5506 break; |
|
5507 } |
|
5508 ch = character_1.Character.fromCodePoint(cp); |
|
5509 id += ch; |
|
5510 this.index += ch.length; |
|
5511 // '\u' (U+005C, U+0075) denotes an escaped character. |
|
5512 if (cp === 0x5C) { |
|
5513 id = id.substr(0, id.length - 1); |
|
5514 if (this.source.charCodeAt(this.index) !== 0x75) { |
|
5515 this.throwUnexpectedToken(); |
|
5516 } |
|
5517 ++this.index; |
|
5518 if (this.source[this.index] === '{') { |
|
5519 ++this.index; |
|
5520 ch = this.scanUnicodeCodePointEscape(); |
|
5521 } |
|
5522 else { |
|
5523 ch = this.scanHexEscape('u'); |
|
5524 if (ch === null || ch === '\\' || !character_1.Character.isIdentifierPart(ch.charCodeAt(0))) { |
|
5525 this.throwUnexpectedToken(); |
|
5526 } |
|
5527 } |
|
5528 id += ch; |
|
5529 } |
|
5530 } |
|
5531 return id; |
|
5532 }; |
|
5533 Scanner.prototype.octalToDecimal = function (ch) { |
|
5534 // \0 is not octal escape sequence |
|
5535 var octal = (ch !== '0'); |
|
5536 var code = octalValue(ch); |
|
5537 if (!this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { |
|
5538 octal = true; |
|
5539 code = code * 8 + octalValue(this.source[this.index++]); |
|
5540 // 3 digits are only allowed when string starts |
|
5541 // with 0, 1, 2, 3 |
|
5542 if ('0123'.indexOf(ch) >= 0 && !this.eof() && character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { |
|
5543 code = code * 8 + octalValue(this.source[this.index++]); |
|
5544 } |
|
5545 } |
|
5546 return { |
|
5547 code: code, |
|
5548 octal: octal |
|
5549 }; |
|
5550 }; |
|
5551 // https://tc39.github.io/ecma262/#sec-names-and-keywords |
|
5552 Scanner.prototype.scanIdentifier = function () { |
|
5553 var type; |
|
5554 var start = this.index; |
|
5555 // Backslash (U+005C) starts an escaped character. |
|
5556 var id = (this.source.charCodeAt(start) === 0x5C) ? this.getComplexIdentifier() : this.getIdentifier(); |
|
5557 // There is no keyword or literal with only one character. |
|
5558 // Thus, it must be an identifier. |
|
5559 if (id.length === 1) { |
|
5560 type = 3 /* Identifier */; |
|
5561 } |
|
5562 else if (this.isKeyword(id)) { |
|
5563 type = 4 /* Keyword */; |
|
5564 } |
|
5565 else if (id === 'null') { |
|
5566 type = 5 /* NullLiteral */; |
|
5567 } |
|
5568 else if (id === 'true' || id === 'false') { |
|
5569 type = 1 /* BooleanLiteral */; |
|
5570 } |
|
5571 else { |
|
5572 type = 3 /* Identifier */; |
|
5573 } |
|
5574 if (type !== 3 /* Identifier */ && (start + id.length !== this.index)) { |
|
5575 var restore = this.index; |
|
5576 this.index = start; |
|
5577 this.tolerateUnexpectedToken(messages_1.Messages.InvalidEscapedReservedWord); |
|
5578 this.index = restore; |
|
5579 } |
|
5580 return { |
|
5581 type: type, |
|
5582 value: id, |
|
5583 lineNumber: this.lineNumber, |
|
5584 lineStart: this.lineStart, |
|
5585 start: start, |
|
5586 end: this.index |
|
5587 }; |
|
5588 }; |
|
5589 // https://tc39.github.io/ecma262/#sec-punctuators |
|
5590 Scanner.prototype.scanPunctuator = function () { |
|
5591 var start = this.index; |
|
5592 // Check for most common single-character punctuators. |
|
5593 var str = this.source[this.index]; |
|
5594 switch (str) { |
|
5595 case '(': |
|
5596 case '{': |
|
5597 if (str === '{') { |
|
5598 this.curlyStack.push('{'); |
|
5599 } |
|
5600 ++this.index; |
|
5601 break; |
|
5602 case '.': |
|
5603 ++this.index; |
|
5604 if (this.source[this.index] === '.' && this.source[this.index + 1] === '.') { |
|
5605 // Spread operator: ... |
|
5606 this.index += 2; |
|
5607 str = '...'; |
|
5608 } |
|
5609 break; |
|
5610 case '}': |
|
5611 ++this.index; |
|
5612 this.curlyStack.pop(); |
|
5613 break; |
|
5614 case ')': |
|
5615 case ';': |
|
5616 case ',': |
|
5617 case '[': |
|
5618 case ']': |
|
5619 case ':': |
|
5620 case '?': |
|
5621 case '~': |
|
5622 ++this.index; |
|
5623 break; |
|
5624 default: |
|
5625 // 4-character punctuator. |
|
5626 str = this.source.substr(this.index, 4); |
|
5627 if (str === '>>>=') { |
|
5628 this.index += 4; |
|
5629 } |
|
5630 else { |
|
5631 // 3-character punctuators. |
|
5632 str = str.substr(0, 3); |
|
5633 if (str === '===' || str === '!==' || str === '>>>' || |
|
5634 str === '<<=' || str === '>>=' || str === '**=') { |
|
5635 this.index += 3; |
|
5636 } |
|
5637 else { |
|
5638 // 2-character punctuators. |
|
5639 str = str.substr(0, 2); |
|
5640 if (str === '&&' || str === '||' || str === '==' || str === '!=' || |
|
5641 str === '+=' || str === '-=' || str === '*=' || str === '/=' || |
|
5642 str === '++' || str === '--' || str === '<<' || str === '>>' || |
|
5643 str === '&=' || str === '|=' || str === '^=' || str === '%=' || |
|
5644 str === '<=' || str === '>=' || str === '=>' || str === '**') { |
|
5645 this.index += 2; |
|
5646 } |
|
5647 else { |
|
5648 // 1-character punctuators. |
|
5649 str = this.source[this.index]; |
|
5650 if ('<>=!+-*%&|^/'.indexOf(str) >= 0) { |
|
5651 ++this.index; |
|
5652 } |
|
5653 } |
|
5654 } |
|
5655 } |
|
5656 } |
|
5657 if (this.index === start) { |
|
5658 this.throwUnexpectedToken(); |
|
5659 } |
|
5660 return { |
|
5661 type: 7 /* Punctuator */, |
|
5662 value: str, |
|
5663 lineNumber: this.lineNumber, |
|
5664 lineStart: this.lineStart, |
|
5665 start: start, |
|
5666 end: this.index |
|
5667 }; |
|
5668 }; |
|
5669 // https://tc39.github.io/ecma262/#sec-literals-numeric-literals |
|
5670 Scanner.prototype.scanHexLiteral = function (start) { |
|
5671 var num = ''; |
|
5672 while (!this.eof()) { |
|
5673 if (!character_1.Character.isHexDigit(this.source.charCodeAt(this.index))) { |
|
5674 break; |
|
5675 } |
|
5676 num += this.source[this.index++]; |
|
5677 } |
|
5678 if (num.length === 0) { |
|
5679 this.throwUnexpectedToken(); |
|
5680 } |
|
5681 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) { |
|
5682 this.throwUnexpectedToken(); |
|
5683 } |
|
5684 return { |
|
5685 type: 6 /* NumericLiteral */, |
|
5686 value: parseInt('0x' + num, 16), |
|
5687 lineNumber: this.lineNumber, |
|
5688 lineStart: this.lineStart, |
|
5689 start: start, |
|
5690 end: this.index |
|
5691 }; |
|
5692 }; |
|
5693 Scanner.prototype.scanBinaryLiteral = function (start) { |
|
5694 var num = ''; |
|
5695 var ch; |
|
5696 while (!this.eof()) { |
|
5697 ch = this.source[this.index]; |
|
5698 if (ch !== '0' && ch !== '1') { |
|
5699 break; |
|
5700 } |
|
5701 num += this.source[this.index++]; |
|
5702 } |
|
5703 if (num.length === 0) { |
|
5704 // only 0b or 0B |
|
5705 this.throwUnexpectedToken(); |
|
5706 } |
|
5707 if (!this.eof()) { |
|
5708 ch = this.source.charCodeAt(this.index); |
|
5709 /* istanbul ignore else */ |
|
5710 if (character_1.Character.isIdentifierStart(ch) || character_1.Character.isDecimalDigit(ch)) { |
|
5711 this.throwUnexpectedToken(); |
|
5712 } |
|
5713 } |
|
5714 return { |
|
5715 type: 6 /* NumericLiteral */, |
|
5716 value: parseInt(num, 2), |
|
5717 lineNumber: this.lineNumber, |
|
5718 lineStart: this.lineStart, |
|
5719 start: start, |
|
5720 end: this.index |
|
5721 }; |
|
5722 }; |
|
5723 Scanner.prototype.scanOctalLiteral = function (prefix, start) { |
|
5724 var num = ''; |
|
5725 var octal = false; |
|
5726 if (character_1.Character.isOctalDigit(prefix.charCodeAt(0))) { |
|
5727 octal = true; |
|
5728 num = '0' + this.source[this.index++]; |
|
5729 } |
|
5730 else { |
|
5731 ++this.index; |
|
5732 } |
|
5733 while (!this.eof()) { |
|
5734 if (!character_1.Character.isOctalDigit(this.source.charCodeAt(this.index))) { |
|
5735 break; |
|
5736 } |
|
5737 num += this.source[this.index++]; |
|
5738 } |
|
5739 if (!octal && num.length === 0) { |
|
5740 // only 0o or 0O |
|
5741 this.throwUnexpectedToken(); |
|
5742 } |
|
5743 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index)) || character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
5744 this.throwUnexpectedToken(); |
|
5745 } |
|
5746 return { |
|
5747 type: 6 /* NumericLiteral */, |
|
5748 value: parseInt(num, 8), |
|
5749 octal: octal, |
|
5750 lineNumber: this.lineNumber, |
|
5751 lineStart: this.lineStart, |
|
5752 start: start, |
|
5753 end: this.index |
|
5754 }; |
|
5755 }; |
|
5756 Scanner.prototype.isImplicitOctalLiteral = function () { |
|
5757 // Implicit octal, unless there is a non-octal digit. |
|
5758 // (Annex B.1.1 on Numeric Literals) |
|
5759 for (var i = this.index + 1; i < this.length; ++i) { |
|
5760 var ch = this.source[i]; |
|
5761 if (ch === '8' || ch === '9') { |
|
5762 return false; |
|
5763 } |
|
5764 if (!character_1.Character.isOctalDigit(ch.charCodeAt(0))) { |
|
5765 return true; |
|
5766 } |
|
5767 } |
|
5768 return true; |
|
5769 }; |
|
5770 Scanner.prototype.scanNumericLiteral = function () { |
|
5771 var start = this.index; |
|
5772 var ch = this.source[start]; |
|
5773 assert_1.assert(character_1.Character.isDecimalDigit(ch.charCodeAt(0)) || (ch === '.'), 'Numeric literal must start with a decimal digit or a decimal point'); |
|
5774 var num = ''; |
|
5775 if (ch !== '.') { |
|
5776 num = this.source[this.index++]; |
|
5777 ch = this.source[this.index]; |
|
5778 // Hex number starts with '0x'. |
|
5779 // Octal number starts with '0'. |
|
5780 // Octal number in ES6 starts with '0o'. |
|
5781 // Binary number in ES6 starts with '0b'. |
|
5782 if (num === '0') { |
|
5783 if (ch === 'x' || ch === 'X') { |
|
5784 ++this.index; |
|
5785 return this.scanHexLiteral(start); |
|
5786 } |
|
5787 if (ch === 'b' || ch === 'B') { |
|
5788 ++this.index; |
|
5789 return this.scanBinaryLiteral(start); |
|
5790 } |
|
5791 if (ch === 'o' || ch === 'O') { |
|
5792 return this.scanOctalLiteral(ch, start); |
|
5793 } |
|
5794 if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) { |
|
5795 if (this.isImplicitOctalLiteral()) { |
|
5796 return this.scanOctalLiteral(ch, start); |
|
5797 } |
|
5798 } |
|
5799 } |
|
5800 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
5801 num += this.source[this.index++]; |
|
5802 } |
|
5803 ch = this.source[this.index]; |
|
5804 } |
|
5805 if (ch === '.') { |
|
5806 num += this.source[this.index++]; |
|
5807 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
5808 num += this.source[this.index++]; |
|
5809 } |
|
5810 ch = this.source[this.index]; |
|
5811 } |
|
5812 if (ch === 'e' || ch === 'E') { |
|
5813 num += this.source[this.index++]; |
|
5814 ch = this.source[this.index]; |
|
5815 if (ch === '+' || ch === '-') { |
|
5816 num += this.source[this.index++]; |
|
5817 } |
|
5818 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
5819 while (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
5820 num += this.source[this.index++]; |
|
5821 } |
|
5822 } |
|
5823 else { |
|
5824 this.throwUnexpectedToken(); |
|
5825 } |
|
5826 } |
|
5827 if (character_1.Character.isIdentifierStart(this.source.charCodeAt(this.index))) { |
|
5828 this.throwUnexpectedToken(); |
|
5829 } |
|
5830 return { |
|
5831 type: 6 /* NumericLiteral */, |
|
5832 value: parseFloat(num), |
|
5833 lineNumber: this.lineNumber, |
|
5834 lineStart: this.lineStart, |
|
5835 start: start, |
|
5836 end: this.index |
|
5837 }; |
|
5838 }; |
|
5839 // https://tc39.github.io/ecma262/#sec-literals-string-literals |
|
5840 Scanner.prototype.scanStringLiteral = function () { |
|
5841 var start = this.index; |
|
5842 var quote = this.source[start]; |
|
5843 assert_1.assert((quote === '\'' || quote === '"'), 'String literal must starts with a quote'); |
|
5844 ++this.index; |
|
5845 var octal = false; |
|
5846 var str = ''; |
|
5847 while (!this.eof()) { |
|
5848 var ch = this.source[this.index++]; |
|
5849 if (ch === quote) { |
|
5850 quote = ''; |
|
5851 break; |
|
5852 } |
|
5853 else if (ch === '\\') { |
|
5854 ch = this.source[this.index++]; |
|
5855 if (!ch || !character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
5856 switch (ch) { |
|
5857 case 'u': |
|
5858 if (this.source[this.index] === '{') { |
|
5859 ++this.index; |
|
5860 str += this.scanUnicodeCodePointEscape(); |
|
5861 } |
|
5862 else { |
|
5863 var unescaped_1 = this.scanHexEscape(ch); |
|
5864 if (unescaped_1 === null) { |
|
5865 this.throwUnexpectedToken(); |
|
5866 } |
|
5867 str += unescaped_1; |
|
5868 } |
|
5869 break; |
|
5870 case 'x': |
|
5871 var unescaped = this.scanHexEscape(ch); |
|
5872 if (unescaped === null) { |
|
5873 this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence); |
|
5874 } |
|
5875 str += unescaped; |
|
5876 break; |
|
5877 case 'n': |
|
5878 str += '\n'; |
|
5879 break; |
|
5880 case 'r': |
|
5881 str += '\r'; |
|
5882 break; |
|
5883 case 't': |
|
5884 str += '\t'; |
|
5885 break; |
|
5886 case 'b': |
|
5887 str += '\b'; |
|
5888 break; |
|
5889 case 'f': |
|
5890 str += '\f'; |
|
5891 break; |
|
5892 case 'v': |
|
5893 str += '\x0B'; |
|
5894 break; |
|
5895 case '8': |
|
5896 case '9': |
|
5897 str += ch; |
|
5898 this.tolerateUnexpectedToken(); |
|
5899 break; |
|
5900 default: |
|
5901 if (ch && character_1.Character.isOctalDigit(ch.charCodeAt(0))) { |
|
5902 var octToDec = this.octalToDecimal(ch); |
|
5903 octal = octToDec.octal || octal; |
|
5904 str += String.fromCharCode(octToDec.code); |
|
5905 } |
|
5906 else { |
|
5907 str += ch; |
|
5908 } |
|
5909 break; |
|
5910 } |
|
5911 } |
|
5912 else { |
|
5913 ++this.lineNumber; |
|
5914 if (ch === '\r' && this.source[this.index] === '\n') { |
|
5915 ++this.index; |
|
5916 } |
|
5917 this.lineStart = this.index; |
|
5918 } |
|
5919 } |
|
5920 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
5921 break; |
|
5922 } |
|
5923 else { |
|
5924 str += ch; |
|
5925 } |
|
5926 } |
|
5927 if (quote !== '') { |
|
5928 this.index = start; |
|
5929 this.throwUnexpectedToken(); |
|
5930 } |
|
5931 return { |
|
5932 type: 8 /* StringLiteral */, |
|
5933 value: str, |
|
5934 octal: octal, |
|
5935 lineNumber: this.lineNumber, |
|
5936 lineStart: this.lineStart, |
|
5937 start: start, |
|
5938 end: this.index |
|
5939 }; |
|
5940 }; |
|
5941 // https://tc39.github.io/ecma262/#sec-template-literal-lexical-components |
|
5942 Scanner.prototype.scanTemplate = function () { |
|
5943 var cooked = ''; |
|
5944 var terminated = false; |
|
5945 var start = this.index; |
|
5946 var head = (this.source[start] === '`'); |
|
5947 var tail = false; |
|
5948 var rawOffset = 2; |
|
5949 ++this.index; |
|
5950 while (!this.eof()) { |
|
5951 var ch = this.source[this.index++]; |
|
5952 if (ch === '`') { |
|
5953 rawOffset = 1; |
|
5954 tail = true; |
|
5955 terminated = true; |
|
5956 break; |
|
5957 } |
|
5958 else if (ch === '$') { |
|
5959 if (this.source[this.index] === '{') { |
|
5960 this.curlyStack.push('${'); |
|
5961 ++this.index; |
|
5962 terminated = true; |
|
5963 break; |
|
5964 } |
|
5965 cooked += ch; |
|
5966 } |
|
5967 else if (ch === '\\') { |
|
5968 ch = this.source[this.index++]; |
|
5969 if (!character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
5970 switch (ch) { |
|
5971 case 'n': |
|
5972 cooked += '\n'; |
|
5973 break; |
|
5974 case 'r': |
|
5975 cooked += '\r'; |
|
5976 break; |
|
5977 case 't': |
|
5978 cooked += '\t'; |
|
5979 break; |
|
5980 case 'u': |
|
5981 if (this.source[this.index] === '{') { |
|
5982 ++this.index; |
|
5983 cooked += this.scanUnicodeCodePointEscape(); |
|
5984 } |
|
5985 else { |
|
5986 var restore = this.index; |
|
5987 var unescaped_2 = this.scanHexEscape(ch); |
|
5988 if (unescaped_2 !== null) { |
|
5989 cooked += unescaped_2; |
|
5990 } |
|
5991 else { |
|
5992 this.index = restore; |
|
5993 cooked += ch; |
|
5994 } |
|
5995 } |
|
5996 break; |
|
5997 case 'x': |
|
5998 var unescaped = this.scanHexEscape(ch); |
|
5999 if (unescaped === null) { |
|
6000 this.throwUnexpectedToken(messages_1.Messages.InvalidHexEscapeSequence); |
|
6001 } |
|
6002 cooked += unescaped; |
|
6003 break; |
|
6004 case 'b': |
|
6005 cooked += '\b'; |
|
6006 break; |
|
6007 case 'f': |
|
6008 cooked += '\f'; |
|
6009 break; |
|
6010 case 'v': |
|
6011 cooked += '\v'; |
|
6012 break; |
|
6013 default: |
|
6014 if (ch === '0') { |
|
6015 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index))) { |
|
6016 // Illegal: \01 \02 and so on |
|
6017 this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral); |
|
6018 } |
|
6019 cooked += '\0'; |
|
6020 } |
|
6021 else if (character_1.Character.isOctalDigit(ch.charCodeAt(0))) { |
|
6022 // Illegal: \1 \2 |
|
6023 this.throwUnexpectedToken(messages_1.Messages.TemplateOctalLiteral); |
|
6024 } |
|
6025 else { |
|
6026 cooked += ch; |
|
6027 } |
|
6028 break; |
|
6029 } |
|
6030 } |
|
6031 else { |
|
6032 ++this.lineNumber; |
|
6033 if (ch === '\r' && this.source[this.index] === '\n') { |
|
6034 ++this.index; |
|
6035 } |
|
6036 this.lineStart = this.index; |
|
6037 } |
|
6038 } |
|
6039 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
6040 ++this.lineNumber; |
|
6041 if (ch === '\r' && this.source[this.index] === '\n') { |
|
6042 ++this.index; |
|
6043 } |
|
6044 this.lineStart = this.index; |
|
6045 cooked += '\n'; |
|
6046 } |
|
6047 else { |
|
6048 cooked += ch; |
|
6049 } |
|
6050 } |
|
6051 if (!terminated) { |
|
6052 this.throwUnexpectedToken(); |
|
6053 } |
|
6054 if (!head) { |
|
6055 this.curlyStack.pop(); |
|
6056 } |
|
6057 return { |
|
6058 type: 10 /* Template */, |
|
6059 value: this.source.slice(start + 1, this.index - rawOffset), |
|
6060 cooked: cooked, |
|
6061 head: head, |
|
6062 tail: tail, |
|
6063 lineNumber: this.lineNumber, |
|
6064 lineStart: this.lineStart, |
|
6065 start: start, |
|
6066 end: this.index |
|
6067 }; |
|
6068 }; |
|
6069 // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals |
|
6070 Scanner.prototype.testRegExp = function (pattern, flags) { |
|
6071 // The BMP character to use as a replacement for astral symbols when |
|
6072 // translating an ES6 "u"-flagged pattern to an ES5-compatible |
|
6073 // approximation. |
|
6074 // Note: replacing with '\uFFFF' enables false positives in unlikely |
|
6075 // scenarios. For example, `[\u{1044f}-\u{10440}]` is an invalid |
|
6076 // pattern that would not be detected by this substitution. |
|
6077 var astralSubstitute = '\uFFFF'; |
|
6078 var tmp = pattern; |
|
6079 var self = this; |
|
6080 if (flags.indexOf('u') >= 0) { |
|
6081 tmp = tmp |
|
6082 .replace(/\\u\{([0-9a-fA-F]+)\}|\\u([a-fA-F0-9]{4})/g, function ($0, $1, $2) { |
|
6083 var codePoint = parseInt($1 || $2, 16); |
|
6084 if (codePoint > 0x10FFFF) { |
|
6085 self.throwUnexpectedToken(messages_1.Messages.InvalidRegExp); |
|
6086 } |
|
6087 if (codePoint <= 0xFFFF) { |
|
6088 return String.fromCharCode(codePoint); |
|
6089 } |
|
6090 return astralSubstitute; |
|
6091 }) |
|
6092 .replace(/[\uD800-\uDBFF][\uDC00-\uDFFF]/g, astralSubstitute); |
|
6093 } |
|
6094 // First, detect invalid regular expressions. |
|
6095 try { |
|
6096 RegExp(tmp); |
|
6097 } |
|
6098 catch (e) { |
|
6099 this.throwUnexpectedToken(messages_1.Messages.InvalidRegExp); |
|
6100 } |
|
6101 // Return a regular expression object for this pattern-flag pair, or |
|
6102 // `null` in case the current environment doesn't support the flags it |
|
6103 // uses. |
|
6104 try { |
|
6105 return new RegExp(pattern, flags); |
|
6106 } |
|
6107 catch (exception) { |
|
6108 /* istanbul ignore next */ |
|
6109 return null; |
|
6110 } |
|
6111 }; |
|
6112 Scanner.prototype.scanRegExpBody = function () { |
|
6113 var ch = this.source[this.index]; |
|
6114 assert_1.assert(ch === '/', 'Regular expression literal must start with a slash'); |
|
6115 var str = this.source[this.index++]; |
|
6116 var classMarker = false; |
|
6117 var terminated = false; |
|
6118 while (!this.eof()) { |
|
6119 ch = this.source[this.index++]; |
|
6120 str += ch; |
|
6121 if (ch === '\\') { |
|
6122 ch = this.source[this.index++]; |
|
6123 // https://tc39.github.io/ecma262/#sec-literals-regular-expression-literals |
|
6124 if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
6125 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); |
|
6126 } |
|
6127 str += ch; |
|
6128 } |
|
6129 else if (character_1.Character.isLineTerminator(ch.charCodeAt(0))) { |
|
6130 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); |
|
6131 } |
|
6132 else if (classMarker) { |
|
6133 if (ch === ']') { |
|
6134 classMarker = false; |
|
6135 } |
|
6136 } |
|
6137 else { |
|
6138 if (ch === '/') { |
|
6139 terminated = true; |
|
6140 break; |
|
6141 } |
|
6142 else if (ch === '[') { |
|
6143 classMarker = true; |
|
6144 } |
|
6145 } |
|
6146 } |
|
6147 if (!terminated) { |
|
6148 this.throwUnexpectedToken(messages_1.Messages.UnterminatedRegExp); |
|
6149 } |
|
6150 // Exclude leading and trailing slash. |
|
6151 return str.substr(1, str.length - 2); |
|
6152 }; |
|
6153 Scanner.prototype.scanRegExpFlags = function () { |
|
6154 var str = ''; |
|
6155 var flags = ''; |
|
6156 while (!this.eof()) { |
|
6157 var ch = this.source[this.index]; |
|
6158 if (!character_1.Character.isIdentifierPart(ch.charCodeAt(0))) { |
|
6159 break; |
|
6160 } |
|
6161 ++this.index; |
|
6162 if (ch === '\\' && !this.eof()) { |
|
6163 ch = this.source[this.index]; |
|
6164 if (ch === 'u') { |
|
6165 ++this.index; |
|
6166 var restore = this.index; |
|
6167 var char = this.scanHexEscape('u'); |
|
6168 if (char !== null) { |
|
6169 flags += char; |
|
6170 for (str += '\\u'; restore < this.index; ++restore) { |
|
6171 str += this.source[restore]; |
|
6172 } |
|
6173 } |
|
6174 else { |
|
6175 this.index = restore; |
|
6176 flags += 'u'; |
|
6177 str += '\\u'; |
|
6178 } |
|
6179 this.tolerateUnexpectedToken(); |
|
6180 } |
|
6181 else { |
|
6182 str += '\\'; |
|
6183 this.tolerateUnexpectedToken(); |
|
6184 } |
|
6185 } |
|
6186 else { |
|
6187 flags += ch; |
|
6188 str += ch; |
|
6189 } |
|
6190 } |
|
6191 return flags; |
|
6192 }; |
|
6193 Scanner.prototype.scanRegExp = function () { |
|
6194 var start = this.index; |
|
6195 var pattern = this.scanRegExpBody(); |
|
6196 var flags = this.scanRegExpFlags(); |
|
6197 var value = this.testRegExp(pattern, flags); |
|
6198 return { |
|
6199 type: 9 /* RegularExpression */, |
|
6200 value: '', |
|
6201 pattern: pattern, |
|
6202 flags: flags, |
|
6203 regex: value, |
|
6204 lineNumber: this.lineNumber, |
|
6205 lineStart: this.lineStart, |
|
6206 start: start, |
|
6207 end: this.index |
|
6208 }; |
|
6209 }; |
|
6210 Scanner.prototype.lex = function () { |
|
6211 if (this.eof()) { |
|
6212 return { |
|
6213 type: 2 /* EOF */, |
|
6214 value: '', |
|
6215 lineNumber: this.lineNumber, |
|
6216 lineStart: this.lineStart, |
|
6217 start: this.index, |
|
6218 end: this.index |
|
6219 }; |
|
6220 } |
|
6221 var cp = this.source.charCodeAt(this.index); |
|
6222 if (character_1.Character.isIdentifierStart(cp)) { |
|
6223 return this.scanIdentifier(); |
|
6224 } |
|
6225 // Very common: ( and ) and ; |
|
6226 if (cp === 0x28 || cp === 0x29 || cp === 0x3B) { |
|
6227 return this.scanPunctuator(); |
|
6228 } |
|
6229 // String literal starts with single quote (U+0027) or double quote (U+0022). |
|
6230 if (cp === 0x27 || cp === 0x22) { |
|
6231 return this.scanStringLiteral(); |
|
6232 } |
|
6233 // Dot (.) U+002E can also start a floating-point number, hence the need |
|
6234 // to check the next character. |
|
6235 if (cp === 0x2E) { |
|
6236 if (character_1.Character.isDecimalDigit(this.source.charCodeAt(this.index + 1))) { |
|
6237 return this.scanNumericLiteral(); |
|
6238 } |
|
6239 return this.scanPunctuator(); |
|
6240 } |
|
6241 if (character_1.Character.isDecimalDigit(cp)) { |
|
6242 return this.scanNumericLiteral(); |
|
6243 } |
|
6244 // Template literals start with ` (U+0060) for template head |
|
6245 // or } (U+007D) for template middle or template tail. |
|
6246 if (cp === 0x60 || (cp === 0x7D && this.curlyStack[this.curlyStack.length - 1] === '${')) { |
|
6247 return this.scanTemplate(); |
|
6248 } |
|
6249 // Possible identifier start in a surrogate pair. |
|
6250 if (cp >= 0xD800 && cp < 0xDFFF) { |
|
6251 if (character_1.Character.isIdentifierStart(this.codePointAt(this.index))) { |
|
6252 return this.scanIdentifier(); |
|
6253 } |
|
6254 } |
|
6255 return this.scanPunctuator(); |
|
6256 }; |
|
6257 return Scanner; |
|
6258 }()); |
|
6259 exports.Scanner = Scanner; |
|
6260 |
|
6261 |
|
6262 /***/ }, |
|
6263 /* 13 */ |
|
6264 /***/ function(module, exports) { |
|
6265 |
|
6266 "use strict"; |
|
6267 Object.defineProperty(exports, "__esModule", { value: true }); |
|
6268 exports.TokenName = {}; |
|
6269 exports.TokenName[1 /* BooleanLiteral */] = 'Boolean'; |
|
6270 exports.TokenName[2 /* EOF */] = '<end>'; |
|
6271 exports.TokenName[3 /* Identifier */] = 'Identifier'; |
|
6272 exports.TokenName[4 /* Keyword */] = 'Keyword'; |
|
6273 exports.TokenName[5 /* NullLiteral */] = 'Null'; |
|
6274 exports.TokenName[6 /* NumericLiteral */] = 'Numeric'; |
|
6275 exports.TokenName[7 /* Punctuator */] = 'Punctuator'; |
|
6276 exports.TokenName[8 /* StringLiteral */] = 'String'; |
|
6277 exports.TokenName[9 /* RegularExpression */] = 'RegularExpression'; |
|
6278 exports.TokenName[10 /* Template */] = 'Template'; |
|
6279 |
|
6280 |
|
6281 /***/ }, |
|
6282 /* 14 */ |
|
6283 /***/ function(module, exports) { |
|
6284 |
|
6285 "use strict"; |
|
6286 // Generated by generate-xhtml-entities.js. DO NOT MODIFY! |
|
6287 Object.defineProperty(exports, "__esModule", { value: true }); |
|
6288 exports.XHTMLEntities = { |
|
6289 quot: '\u0022', |
|
6290 amp: '\u0026', |
|
6291 apos: '\u0027', |
|
6292 gt: '\u003E', |
|
6293 nbsp: '\u00A0', |
|
6294 iexcl: '\u00A1', |
|
6295 cent: '\u00A2', |
|
6296 pound: '\u00A3', |
|
6297 curren: '\u00A4', |
|
6298 yen: '\u00A5', |
|
6299 brvbar: '\u00A6', |
|
6300 sect: '\u00A7', |
|
6301 uml: '\u00A8', |
|
6302 copy: '\u00A9', |
|
6303 ordf: '\u00AA', |
|
6304 laquo: '\u00AB', |
|
6305 not: '\u00AC', |
|
6306 shy: '\u00AD', |
|
6307 reg: '\u00AE', |
|
6308 macr: '\u00AF', |
|
6309 deg: '\u00B0', |
|
6310 plusmn: '\u00B1', |
|
6311 sup2: '\u00B2', |
|
6312 sup3: '\u00B3', |
|
6313 acute: '\u00B4', |
|
6314 micro: '\u00B5', |
|
6315 para: '\u00B6', |
|
6316 middot: '\u00B7', |
|
6317 cedil: '\u00B8', |
|
6318 sup1: '\u00B9', |
|
6319 ordm: '\u00BA', |
|
6320 raquo: '\u00BB', |
|
6321 frac14: '\u00BC', |
|
6322 frac12: '\u00BD', |
|
6323 frac34: '\u00BE', |
|
6324 iquest: '\u00BF', |
|
6325 Agrave: '\u00C0', |
|
6326 Aacute: '\u00C1', |
|
6327 Acirc: '\u00C2', |
|
6328 Atilde: '\u00C3', |
|
6329 Auml: '\u00C4', |
|
6330 Aring: '\u00C5', |
|
6331 AElig: '\u00C6', |
|
6332 Ccedil: '\u00C7', |
|
6333 Egrave: '\u00C8', |
|
6334 Eacute: '\u00C9', |
|
6335 Ecirc: '\u00CA', |
|
6336 Euml: '\u00CB', |
|
6337 Igrave: '\u00CC', |
|
6338 Iacute: '\u00CD', |
|
6339 Icirc: '\u00CE', |
|
6340 Iuml: '\u00CF', |
|
6341 ETH: '\u00D0', |
|
6342 Ntilde: '\u00D1', |
|
6343 Ograve: '\u00D2', |
|
6344 Oacute: '\u00D3', |
|
6345 Ocirc: '\u00D4', |
|
6346 Otilde: '\u00D5', |
|
6347 Ouml: '\u00D6', |
|
6348 times: '\u00D7', |
|
6349 Oslash: '\u00D8', |
|
6350 Ugrave: '\u00D9', |
|
6351 Uacute: '\u00DA', |
|
6352 Ucirc: '\u00DB', |
|
6353 Uuml: '\u00DC', |
|
6354 Yacute: '\u00DD', |
|
6355 THORN: '\u00DE', |
|
6356 szlig: '\u00DF', |
|
6357 agrave: '\u00E0', |
|
6358 aacute: '\u00E1', |
|
6359 acirc: '\u00E2', |
|
6360 atilde: '\u00E3', |
|
6361 auml: '\u00E4', |
|
6362 aring: '\u00E5', |
|
6363 aelig: '\u00E6', |
|
6364 ccedil: '\u00E7', |
|
6365 egrave: '\u00E8', |
|
6366 eacute: '\u00E9', |
|
6367 ecirc: '\u00EA', |
|
6368 euml: '\u00EB', |
|
6369 igrave: '\u00EC', |
|
6370 iacute: '\u00ED', |
|
6371 icirc: '\u00EE', |
|
6372 iuml: '\u00EF', |
|
6373 eth: '\u00F0', |
|
6374 ntilde: '\u00F1', |
|
6375 ograve: '\u00F2', |
|
6376 oacute: '\u00F3', |
|
6377 ocirc: '\u00F4', |
|
6378 otilde: '\u00F5', |
|
6379 ouml: '\u00F6', |
|
6380 divide: '\u00F7', |
|
6381 oslash: '\u00F8', |
|
6382 ugrave: '\u00F9', |
|
6383 uacute: '\u00FA', |
|
6384 ucirc: '\u00FB', |
|
6385 uuml: '\u00FC', |
|
6386 yacute: '\u00FD', |
|
6387 thorn: '\u00FE', |
|
6388 yuml: '\u00FF', |
|
6389 OElig: '\u0152', |
|
6390 oelig: '\u0153', |
|
6391 Scaron: '\u0160', |
|
6392 scaron: '\u0161', |
|
6393 Yuml: '\u0178', |
|
6394 fnof: '\u0192', |
|
6395 circ: '\u02C6', |
|
6396 tilde: '\u02DC', |
|
6397 Alpha: '\u0391', |
|
6398 Beta: '\u0392', |
|
6399 Gamma: '\u0393', |
|
6400 Delta: '\u0394', |
|
6401 Epsilon: '\u0395', |
|
6402 Zeta: '\u0396', |
|
6403 Eta: '\u0397', |
|
6404 Theta: '\u0398', |
|
6405 Iota: '\u0399', |
|
6406 Kappa: '\u039A', |
|
6407 Lambda: '\u039B', |
|
6408 Mu: '\u039C', |
|
6409 Nu: '\u039D', |
|
6410 Xi: '\u039E', |
|
6411 Omicron: '\u039F', |
|
6412 Pi: '\u03A0', |
|
6413 Rho: '\u03A1', |
|
6414 Sigma: '\u03A3', |
|
6415 Tau: '\u03A4', |
|
6416 Upsilon: '\u03A5', |
|
6417 Phi: '\u03A6', |
|
6418 Chi: '\u03A7', |
|
6419 Psi: '\u03A8', |
|
6420 Omega: '\u03A9', |
|
6421 alpha: '\u03B1', |
|
6422 beta: '\u03B2', |
|
6423 gamma: '\u03B3', |
|
6424 delta: '\u03B4', |
|
6425 epsilon: '\u03B5', |
|
6426 zeta: '\u03B6', |
|
6427 eta: '\u03B7', |
|
6428 theta: '\u03B8', |
|
6429 iota: '\u03B9', |
|
6430 kappa: '\u03BA', |
|
6431 lambda: '\u03BB', |
|
6432 mu: '\u03BC', |
|
6433 nu: '\u03BD', |
|
6434 xi: '\u03BE', |
|
6435 omicron: '\u03BF', |
|
6436 pi: '\u03C0', |
|
6437 rho: '\u03C1', |
|
6438 sigmaf: '\u03C2', |
|
6439 sigma: '\u03C3', |
|
6440 tau: '\u03C4', |
|
6441 upsilon: '\u03C5', |
|
6442 phi: '\u03C6', |
|
6443 chi: '\u03C7', |
|
6444 psi: '\u03C8', |
|
6445 omega: '\u03C9', |
|
6446 thetasym: '\u03D1', |
|
6447 upsih: '\u03D2', |
|
6448 piv: '\u03D6', |
|
6449 ensp: '\u2002', |
|
6450 emsp: '\u2003', |
|
6451 thinsp: '\u2009', |
|
6452 zwnj: '\u200C', |
|
6453 zwj: '\u200D', |
|
6454 lrm: '\u200E', |
|
6455 rlm: '\u200F', |
|
6456 ndash: '\u2013', |
|
6457 mdash: '\u2014', |
|
6458 lsquo: '\u2018', |
|
6459 rsquo: '\u2019', |
|
6460 sbquo: '\u201A', |
|
6461 ldquo: '\u201C', |
|
6462 rdquo: '\u201D', |
|
6463 bdquo: '\u201E', |
|
6464 dagger: '\u2020', |
|
6465 Dagger: '\u2021', |
|
6466 bull: '\u2022', |
|
6467 hellip: '\u2026', |
|
6468 permil: '\u2030', |
|
6469 prime: '\u2032', |
|
6470 Prime: '\u2033', |
|
6471 lsaquo: '\u2039', |
|
6472 rsaquo: '\u203A', |
|
6473 oline: '\u203E', |
|
6474 frasl: '\u2044', |
|
6475 euro: '\u20AC', |
|
6476 image: '\u2111', |
|
6477 weierp: '\u2118', |
|
6478 real: '\u211C', |
|
6479 trade: '\u2122', |
|
6480 alefsym: '\u2135', |
|
6481 larr: '\u2190', |
|
6482 uarr: '\u2191', |
|
6483 rarr: '\u2192', |
|
6484 darr: '\u2193', |
|
6485 harr: '\u2194', |
|
6486 crarr: '\u21B5', |
|
6487 lArr: '\u21D0', |
|
6488 uArr: '\u21D1', |
|
6489 rArr: '\u21D2', |
|
6490 dArr: '\u21D3', |
|
6491 hArr: '\u21D4', |
|
6492 forall: '\u2200', |
|
6493 part: '\u2202', |
|
6494 exist: '\u2203', |
|
6495 empty: '\u2205', |
|
6496 nabla: '\u2207', |
|
6497 isin: '\u2208', |
|
6498 notin: '\u2209', |
|
6499 ni: '\u220B', |
|
6500 prod: '\u220F', |
|
6501 sum: '\u2211', |
|
6502 minus: '\u2212', |
|
6503 lowast: '\u2217', |
|
6504 radic: '\u221A', |
|
6505 prop: '\u221D', |
|
6506 infin: '\u221E', |
|
6507 ang: '\u2220', |
|
6508 and: '\u2227', |
|
6509 or: '\u2228', |
|
6510 cap: '\u2229', |
|
6511 cup: '\u222A', |
|
6512 int: '\u222B', |
|
6513 there4: '\u2234', |
|
6514 sim: '\u223C', |
|
6515 cong: '\u2245', |
|
6516 asymp: '\u2248', |
|
6517 ne: '\u2260', |
|
6518 equiv: '\u2261', |
|
6519 le: '\u2264', |
|
6520 ge: '\u2265', |
|
6521 sub: '\u2282', |
|
6522 sup: '\u2283', |
|
6523 nsub: '\u2284', |
|
6524 sube: '\u2286', |
|
6525 supe: '\u2287', |
|
6526 oplus: '\u2295', |
|
6527 otimes: '\u2297', |
|
6528 perp: '\u22A5', |
|
6529 sdot: '\u22C5', |
|
6530 lceil: '\u2308', |
|
6531 rceil: '\u2309', |
|
6532 lfloor: '\u230A', |
|
6533 rfloor: '\u230B', |
|
6534 loz: '\u25CA', |
|
6535 spades: '\u2660', |
|
6536 clubs: '\u2663', |
|
6537 hearts: '\u2665', |
|
6538 diams: '\u2666', |
|
6539 lang: '\u27E8', |
|
6540 rang: '\u27E9' |
|
6541 }; |
|
6542 |
|
6543 |
|
6544 /***/ }, |
|
6545 /* 15 */ |
|
6546 /***/ function(module, exports, __webpack_require__) { |
|
6547 |
|
6548 "use strict"; |
|
6549 Object.defineProperty(exports, "__esModule", { value: true }); |
|
6550 var error_handler_1 = __webpack_require__(10); |
|
6551 var scanner_1 = __webpack_require__(12); |
|
6552 var token_1 = __webpack_require__(13); |
|
6553 var Reader = (function () { |
|
6554 function Reader() { |
|
6555 this.values = []; |
|
6556 this.curly = this.paren = -1; |
|
6557 } |
|
6558 // A function following one of those tokens is an expression. |
|
6559 Reader.prototype.beforeFunctionExpression = function (t) { |
|
6560 return ['(', '{', '[', 'in', 'typeof', 'instanceof', 'new', |
|
6561 'return', 'case', 'delete', 'throw', 'void', |
|
6562 // assignment operators |
|
6563 '=', '+=', '-=', '*=', '**=', '/=', '%=', '<<=', '>>=', '>>>=', |
|
6564 '&=', '|=', '^=', ',', |
|
6565 // binary/unary operators |
|
6566 '+', '-', '*', '**', '/', '%', '++', '--', '<<', '>>', '>>>', '&', |
|
6567 '|', '^', '!', '~', '&&', '||', '?', ':', '===', '==', '>=', |
|
6568 '<=', '<', '>', '!=', '!=='].indexOf(t) >= 0; |
|
6569 }; |
|
6570 // Determine if forward slash (/) is an operator or part of a regular expression |
|
6571 // https://github.com/mozilla/sweet.js/wiki/design |
|
6572 Reader.prototype.isRegexStart = function () { |
|
6573 var previous = this.values[this.values.length - 1]; |
|
6574 var regex = (previous !== null); |
|
6575 switch (previous) { |
|
6576 case 'this': |
|
6577 case ']': |
|
6578 regex = false; |
|
6579 break; |
|
6580 case ')': |
|
6581 var keyword = this.values[this.paren - 1]; |
|
6582 regex = (keyword === 'if' || keyword === 'while' || keyword === 'for' || keyword === 'with'); |
|
6583 break; |
|
6584 case '}': |
|
6585 // Dividing a function by anything makes little sense, |
|
6586 // but we have to check for that. |
|
6587 regex = false; |
|
6588 if (this.values[this.curly - 3] === 'function') { |
|
6589 // Anonymous function, e.g. function(){} /42 |
|
6590 var check = this.values[this.curly - 4]; |
|
6591 regex = check ? !this.beforeFunctionExpression(check) : false; |
|
6592 } |
|
6593 else if (this.values[this.curly - 4] === 'function') { |
|
6594 // Named function, e.g. function f(){} /42/ |
|
6595 var check = this.values[this.curly - 5]; |
|
6596 regex = check ? !this.beforeFunctionExpression(check) : true; |
|
6597 } |
|
6598 break; |
|
6599 default: |
|
6600 break; |
|
6601 } |
|
6602 return regex; |
|
6603 }; |
|
6604 Reader.prototype.push = function (token) { |
|
6605 if (token.type === 7 /* Punctuator */ || token.type === 4 /* Keyword */) { |
|
6606 if (token.value === '{') { |
|
6607 this.curly = this.values.length; |
|
6608 } |
|
6609 else if (token.value === '(') { |
|
6610 this.paren = this.values.length; |
|
6611 } |
|
6612 this.values.push(token.value); |
|
6613 } |
|
6614 else { |
|
6615 this.values.push(null); |
|
6616 } |
|
6617 }; |
|
6618 return Reader; |
|
6619 }()); |
|
6620 var Tokenizer = (function () { |
|
6621 function Tokenizer(code, config) { |
|
6622 this.errorHandler = new error_handler_1.ErrorHandler(); |
|
6623 this.errorHandler.tolerant = config ? (typeof config.tolerant === 'boolean' && config.tolerant) : false; |
|
6624 this.scanner = new scanner_1.Scanner(code, this.errorHandler); |
|
6625 this.scanner.trackComment = config ? (typeof config.comment === 'boolean' && config.comment) : false; |
|
6626 this.trackRange = config ? (typeof config.range === 'boolean' && config.range) : false; |
|
6627 this.trackLoc = config ? (typeof config.loc === 'boolean' && config.loc) : false; |
|
6628 this.buffer = []; |
|
6629 this.reader = new Reader(); |
|
6630 } |
|
6631 Tokenizer.prototype.errors = function () { |
|
6632 return this.errorHandler.errors; |
|
6633 }; |
|
6634 Tokenizer.prototype.getNextToken = function () { |
|
6635 if (this.buffer.length === 0) { |
|
6636 var comments = this.scanner.scanComments(); |
|
6637 if (this.scanner.trackComment) { |
|
6638 for (var i = 0; i < comments.length; ++i) { |
|
6639 var e = comments[i]; |
|
6640 var value = this.scanner.source.slice(e.slice[0], e.slice[1]); |
|
6641 var comment = { |
|
6642 type: e.multiLine ? 'BlockComment' : 'LineComment', |
|
6643 value: value |
|
6644 }; |
|
6645 if (this.trackRange) { |
|
6646 comment.range = e.range; |
|
6647 } |
|
6648 if (this.trackLoc) { |
|
6649 comment.loc = e.loc; |
|
6650 } |
|
6651 this.buffer.push(comment); |
|
6652 } |
|
6653 } |
|
6654 if (!this.scanner.eof()) { |
|
6655 var loc = void 0; |
|
6656 if (this.trackLoc) { |
|
6657 loc = { |
|
6658 start: { |
|
6659 line: this.scanner.lineNumber, |
|
6660 column: this.scanner.index - this.scanner.lineStart |
|
6661 }, |
|
6662 end: {} |
|
6663 }; |
|
6664 } |
|
6665 var startRegex = (this.scanner.source[this.scanner.index] === '/') && this.reader.isRegexStart(); |
|
6666 var token = startRegex ? this.scanner.scanRegExp() : this.scanner.lex(); |
|
6667 this.reader.push(token); |
|
6668 var entry = { |
|
6669 type: token_1.TokenName[token.type], |
|
6670 value: this.scanner.source.slice(token.start, token.end) |
|
6671 }; |
|
6672 if (this.trackRange) { |
|
6673 entry.range = [token.start, token.end]; |
|
6674 } |
|
6675 if (this.trackLoc) { |
|
6676 loc.end = { |
|
6677 line: this.scanner.lineNumber, |
|
6678 column: this.scanner.index - this.scanner.lineStart |
|
6679 }; |
|
6680 entry.loc = loc; |
|
6681 } |
|
6682 if (token.type === 9 /* RegularExpression */) { |
|
6683 var pattern = token.pattern; |
|
6684 var flags = token.flags; |
|
6685 entry.regex = { pattern: pattern, flags: flags }; |
|
6686 } |
|
6687 this.buffer.push(entry); |
|
6688 } |
|
6689 } |
|
6690 return this.buffer.shift(); |
|
6691 }; |
|
6692 return Tokenizer; |
|
6693 }()); |
|
6694 exports.Tokenizer = Tokenizer; |
|
6695 |
|
6696 |
|
6697 /***/ } |
|
6698 /******/ ]) |
|
6699 }); |
|
6700 ; |
|
6701 |
|
6702 // JSHINT has some GPL Compatability issues, so we are faking it out and using esprima for validation |
|
6703 // Based on https://github.com/jquery/esprima/blob/gh-pages/demo/validate.js which is MIT licensed |
|
6704 |
|
6705 var fakeJSHINT = new function() { |
|
6706 var syntax, errors; |
|
6707 var that = this; |
|
6708 this.data = []; |
|
6709 this.convertError = function( error ){ |
|
6710 return { |
|
6711 line: error.lineNumber, |
|
6712 character: error.column, |
|
6713 reason: error.description, |
|
6714 code: 'E' |
|
6715 }; |
|
6716 }; |
|
6717 this.parse = function( code ){ |
|
6718 try { |
|
6719 syntax = window.esprima.parse(code, { tolerant: true, loc: true }); |
|
6720 errors = syntax.errors; |
|
6721 if ( errors.length > 0 ) { |
|
6722 for ( var i = 0; i < errors.length; i++) { |
|
6723 var error = errors[i]; |
|
6724 that.data.push( that.convertError( error ) ); |
|
6725 } |
|
6726 } else { |
|
6727 that.data = []; |
|
6728 } |
|
6729 } catch (e) { |
|
6730 that.data.push( that.convertError( e ) ); |
|
6731 } |
|
6732 }; |
|
6733 }; |
|
6734 |
|
6735 window.JSHINT = function( text ){ |
|
6736 fakeJSHINT.parse( text ); |
|
6737 }; |
|
6738 window.JSHINT.data = function(){ |
|
6739 return { |
|
6740 errors: fakeJSHINT.data |
|
6741 }; |
|
6742 }; |
|
6743 |
|
6744 |