xmlui 0.8.6 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{apiInterceptorWorker-fLBfPj2T.mjs → apiInterceptorWorker-B1u6prJM.mjs} +1 -1
- package/dist/{index-wd8FRzuM.mjs → index-CVvazA5D.mjs} +5849 -6109
- package/dist/index.css +274 -301
- package/dist/language-server.mjs +25 -1
- package/dist/{lint-B18Ko6Sy.mjs → lint-gX2osbkz.mjs} +920 -1120
- package/dist/scripts/bin/build.js +2 -2
- package/dist/scripts/bin/start.js +3 -9
- package/dist/scripts/bin/vite-xmlui-plugin.js +2 -2
- package/dist/scripts/bin/viteConfig.js +89 -63
- package/dist/scripts/src/abstractions/scripting/ScriptingSourceTreeExp.js +1 -2
- package/dist/scripts/src/components/Accordion/Accordion.js +6 -16
- package/dist/scripts/src/components/App/AppNative.js +8 -0
- package/dist/scripts/src/components/AppHeader/AppHeader.js +1 -5
- package/dist/scripts/src/components/AppHeader/AppHeaderNative.js +10 -4
- package/dist/scripts/src/components/AutoComplete/AutoComplete.js +13 -19
- package/dist/scripts/src/components/AutoComplete/AutoCompleteContext.js +2 -0
- package/dist/scripts/src/components/AutoComplete/AutoCompleteNative.js +7 -3
- package/dist/scripts/src/components/Avatar/Avatar.js +2 -9
- package/dist/scripts/src/components/Badge/Badge.js +2 -8
- package/dist/scripts/src/components/Button/Button.js +28 -60
- package/dist/scripts/src/components/Card/Card.js +1 -6
- package/dist/scripts/src/components/Checkbox/Checkbox.js +4 -12
- package/dist/scripts/src/components/ComponentProvider.js +4 -0
- package/dist/scripts/src/components/DatePicker/DatePicker.js +3 -10
- package/dist/scripts/src/components/DropdownMenu/DropdownMenu.js +1 -1
- package/dist/scripts/src/components/Form/Form.js +12 -28
- package/dist/scripts/src/components/Form/FormNative.js +9 -0
- package/dist/scripts/src/components/FormItem/HelperText.js +1 -1
- package/dist/scripts/src/components/FormItem/ItemWithLabel.js +2 -2
- package/dist/scripts/src/components/Heading/HeadingNative.js +0 -1
- package/dist/scripts/src/components/HtmlTags/HtmlTags.js +4 -19
- package/dist/scripts/src/components/IconProvider.js +2 -2
- package/dist/scripts/src/components/Link/Link.js +2 -8
- package/dist/scripts/src/components/Markdown/MarkdownNative.js +4 -4
- package/dist/scripts/src/components/ModalDialog/ModalDialog.js +1 -3
- package/dist/scripts/src/components/NavGroup/NavGroup.js +34 -3
- package/dist/scripts/src/components/NavGroup/NavGroupNative.js +24 -12
- package/dist/scripts/src/components/NavLink/NavLink.js +4 -11
- package/dist/scripts/src/components/NavPanel/NavPanel.js +1 -6
- package/dist/scripts/src/components/ProgressBar/ProgressBar.js +2 -8
- package/dist/scripts/src/components/RadioGroup/RadioGroup.js +4 -12
- package/dist/scripts/src/components/Select/Select.js +5 -13
- package/dist/scripts/src/components/Select/SelectNative.js +7 -3
- package/dist/scripts/src/components/Slider/Slider.js +2 -8
- package/dist/scripts/src/components/Spinner/Spinner.js +1 -6
- package/dist/scripts/src/components/SubNavPanel/SubNavPanel.js +22 -0
- package/dist/scripts/src/components/SubNavPanel/SubNavPanelNative.js +9 -0
- package/dist/scripts/src/components/Switch/Switch.js +6 -16
- package/dist/scripts/src/components/Table/Table.js +8 -17
- package/dist/scripts/src/components/TableOfContents/TableOfContents.js +4 -12
- package/dist/scripts/src/components/Tabs/Tabs.js +3 -10
- package/dist/scripts/src/components/Text/Text.js +10 -24
- package/dist/scripts/src/components/TextBox/TextBoxNative.js +1 -1
- package/dist/scripts/src/components/Theme/ThemeNative.js +1 -1
- package/dist/scripts/src/components/ValidationSummary/ValidationSummary.js +3 -3
- package/dist/scripts/src/components-core/DevTools.js +5 -4
- package/dist/scripts/src/components-core/RestApiProxy.js +7 -3
- package/dist/scripts/src/components-core/action/APICall.js +2 -1
- package/dist/scripts/src/components-core/rendering/Container.js +15 -11
- package/dist/scripts/src/components-core/rendering/StateContainer.js +3 -2
- package/dist/scripts/src/components-core/script-runner/BindingTreeEvaluationContext.js +0 -2
- package/dist/scripts/src/components-core/script-runner/ParameterParser.js +1 -1
- package/dist/scripts/src/components-core/script-runner/asyncProxy.js +11 -64
- package/dist/scripts/src/components-core/script-runner/eval-tree-async.js +177 -175
- package/dist/scripts/src/components-core/script-runner/eval-tree-common.js +173 -231
- package/dist/scripts/src/components-core/script-runner/eval-tree-sync.js +129 -100
- package/dist/scripts/src/components-core/script-runner/process-statement-async.js +170 -175
- package/dist/scripts/src/components-core/script-runner/process-statement-common.js +48 -33
- package/dist/scripts/src/components-core/script-runner/process-statement-sync.js +164 -170
- package/dist/scripts/src/components-core/script-runner/statement-queue.js +5 -4
- package/dist/scripts/src/components-core/script-runner/visitors.js +124 -116
- package/dist/scripts/src/components-core/theming/themes/palette.js +1 -0
- package/dist/scripts/src/components-core/theming/themes/root.js +300 -154
- package/dist/scripts/src/components-core/theming/themes/theme-colors.js +510 -510
- package/dist/scripts/src/components-core/theming/themes/xmlui.js +0 -1
- package/dist/scripts/src/components-core/theming/transformThemeVars.js +11 -11
- package/dist/scripts/src/components-core/utils/misc.js +13 -0
- package/dist/scripts/src/components-core/utils/statementUtils.js +56 -53
- package/dist/scripts/src/components-core/xmlui-parser.js +1 -1
- package/dist/scripts/src/parsers/scripting-exp/Lexer.js +1092 -0
- package/dist/scripts/src/parsers/scripting-exp/Parser.js +2635 -0
- package/dist/scripts/src/parsers/scripting-exp/ParserError.js +47 -0
- package/dist/scripts/src/parsers/scripting-exp/TokenTrait.js +109 -0
- package/dist/scripts/src/parsers/scripting-exp/TokenType.js +2 -4
- package/dist/scripts/src/parsers/scripting-exp/code-behind-collect.js +101 -0
- package/dist/scripts/src/parsers/scripting-exp/modules.js +107 -0
- package/dist/scripts/src/parsers/{scripting → scripting-exp}/tree-visitor.js +103 -107
- package/dist/scripts/src/parsers/xmlui-parser/transform.js +12 -12
- package/dist/style.css +245 -286
- package/dist/xmlui-metadata.mjs +2741 -2211
- package/dist/xmlui-metadata.umd.js +2740 -2212
- package/dist/xmlui-parser.d.ts +320 -232
- package/dist/xmlui-parser.mjs +19 -19
- package/dist/xmlui-standalone.umd.js +6754 -7220
- package/dist/xmlui.d.ts +322 -230
- package/dist/xmlui.mjs +1 -1
- package/package.json +10 -6
- package/dist/_commonjsHelpers-CcAunmGO.mjs +0 -33
- package/dist/scripts/src/components-core/script-runner/ICustomOperations.js +0 -34
- package/dist/scripts/src/components-core/script-runner/custom-operations-registry.js +0 -40
- package/dist/scripts/src/components-core/script-runner/custom-ui-data.js +0 -40
- package/dist/scripts/src/components-core/script-runner/syncProxy.js +0 -31
- package/dist/scripts/src/parsers/scripting/code-behind-collect.js +0 -153
- package/dist/scripts/src/parsers/scripting/modules.js +0 -284
- /package/dist/scripts/src/abstractions/scripting/{LogicalThread.js → LogicalThreadExp.js} +0 -0
- /package/dist/scripts/src/abstractions/scripting/{TryScope.js → TryScopeExp.js} +0 -0
|
@@ -233,6 +233,98 @@ const httpMethodNames = [
|
|
|
233
233
|
"trace",
|
|
234
234
|
"connect"
|
|
235
235
|
];
|
|
236
|
+
const T_BLOCK_STATEMENT = 1;
|
|
237
|
+
const T_EMPTY_STATEMENT = 2;
|
|
238
|
+
const T_EXPRESSION_STATEMENT = 3;
|
|
239
|
+
const T_ARROW_EXPRESSION_STATEMENT = 4;
|
|
240
|
+
const T_LET_STATEMENT = 5;
|
|
241
|
+
const T_CONST_STATEMENT = 6;
|
|
242
|
+
const T_VAR_STATEMENT = 7;
|
|
243
|
+
const T_IF_STATEMENT = 8;
|
|
244
|
+
const T_RETURN_STATEMENT = 9;
|
|
245
|
+
const T_BREAK_STATEMENT = 10;
|
|
246
|
+
const T_CONTINUE_STATEMENT = 11;
|
|
247
|
+
const T_WHILE_STATEMENT = 12;
|
|
248
|
+
const T_DO_WHILE_STATEMENT = 13;
|
|
249
|
+
const T_FOR_STATEMENT = 14;
|
|
250
|
+
const T_FOR_IN_STATEMENT = 15;
|
|
251
|
+
const T_FOR_OF_STATEMENT = 16;
|
|
252
|
+
const T_THROW_STATEMENT = 17;
|
|
253
|
+
const T_TRY_STATEMENT = 18;
|
|
254
|
+
const T_SWITCH_STATEMENT = 19;
|
|
255
|
+
const T_FUNCTION_DECLARATION = 20;
|
|
256
|
+
const T_UNARY_EXPRESSION = 100;
|
|
257
|
+
const T_BINARY_EXPRESSION = 101;
|
|
258
|
+
const T_SEQUENCE_EXPRESSION = 102;
|
|
259
|
+
const T_CONDITIONAL_EXPRESSION = 103;
|
|
260
|
+
const T_FUNCTION_INVOCATION_EXPRESSION = 104;
|
|
261
|
+
const T_MEMBER_ACCESS_EXPRESSION = 105;
|
|
262
|
+
const T_CALCULATED_MEMBER_ACCESS_EXPRESSION = 106;
|
|
263
|
+
const T_IDENTIFIER = 107;
|
|
264
|
+
const T_TEMPLATE_LITERAL_EXPRESSION = 108;
|
|
265
|
+
const T_LITERAL = 109;
|
|
266
|
+
const T_ARRAY_LITERAL = 110;
|
|
267
|
+
const T_OBJECT_LITERAL = 111;
|
|
268
|
+
const T_SPREAD_EXPRESSION = 112;
|
|
269
|
+
const T_ASSIGNMENT_EXPRESSION = 113;
|
|
270
|
+
const T_NO_ARG_EXPRESSION = 114;
|
|
271
|
+
const T_ARROW_EXPRESSION = 115;
|
|
272
|
+
const T_PREFIX_OP_EXPRESSION = 116;
|
|
273
|
+
const T_POSTFIX_OP_EXPRESSION = 117;
|
|
274
|
+
const T_REACTIVE_VAR_DECLARATION = 118;
|
|
275
|
+
const T_VAR_DECLARATION = 200;
|
|
276
|
+
const T_DESTRUCTURE = 201;
|
|
277
|
+
const T_ARRAY_DESTRUCTURE = 202;
|
|
278
|
+
const T_OBJECT_DESTRUCTURE = 203;
|
|
279
|
+
const T_SWITCH_CASE = 204;
|
|
280
|
+
class InputStream {
|
|
281
|
+
// Creates a stream that uses the specified source code
|
|
282
|
+
constructor(source) {
|
|
283
|
+
this.source = source;
|
|
284
|
+
this._pos = 0;
|
|
285
|
+
this._line = 1;
|
|
286
|
+
this._column = 0;
|
|
287
|
+
}
|
|
288
|
+
// Gets the current position in the stream. Starts from 0.
|
|
289
|
+
get position() {
|
|
290
|
+
return this._pos;
|
|
291
|
+
}
|
|
292
|
+
// Gets the current line number. Starts from 1.
|
|
293
|
+
get line() {
|
|
294
|
+
return this._line;
|
|
295
|
+
}
|
|
296
|
+
// Gets the current column number. Starts from 0.
|
|
297
|
+
get column() {
|
|
298
|
+
return this._column;
|
|
299
|
+
}
|
|
300
|
+
// Peeks the next character in the stream. Returns null, if EOF; otherwise the current source code character
|
|
301
|
+
peek() {
|
|
302
|
+
return this.ahead(0);
|
|
303
|
+
}
|
|
304
|
+
// Looks ahead with `n` characters in the stream. Returns null, if EOF; otherwise the look-ahead character
|
|
305
|
+
ahead(n = 1) {
|
|
306
|
+
return this._pos + n > this.source.length - 1 ? null : this.source[this._pos + n];
|
|
307
|
+
}
|
|
308
|
+
// Gets the next character from the stream
|
|
309
|
+
get() {
|
|
310
|
+
if (this._pos >= this.source.length) {
|
|
311
|
+
return null;
|
|
312
|
+
}
|
|
313
|
+
const ch = this.source[this._pos++];
|
|
314
|
+
if (ch === "\n") {
|
|
315
|
+
this._line++;
|
|
316
|
+
this._column = 0;
|
|
317
|
+
} else {
|
|
318
|
+
this._column++;
|
|
319
|
+
}
|
|
320
|
+
return ch;
|
|
321
|
+
}
|
|
322
|
+
// Gets the tail of the input stream
|
|
323
|
+
getTail(start) {
|
|
324
|
+
var _a;
|
|
325
|
+
return ((_a = this.source) == null ? void 0 : _a.substring(start)) ?? "";
|
|
326
|
+
}
|
|
327
|
+
}
|
|
236
328
|
var TokenType = /* @__PURE__ */ ((TokenType2) => {
|
|
237
329
|
TokenType2[TokenType2["Eof"] = -1] = "Eof";
|
|
238
330
|
TokenType2[TokenType2["Ws"] = -2] = "Ws";
|
|
@@ -334,166 +426,10 @@ var TokenType = /* @__PURE__ */ ((TokenType2) => {
|
|
|
334
426
|
TokenType2[TokenType2["Default"] = 93] = "Default";
|
|
335
427
|
TokenType2[TokenType2["Delete"] = 94] = "Delete";
|
|
336
428
|
TokenType2[TokenType2["Function"] = 95] = "Function";
|
|
337
|
-
TokenType2[TokenType2["
|
|
338
|
-
TokenType2[TokenType2["
|
|
339
|
-
TokenType2[TokenType2["As"] = 98] = "As";
|
|
340
|
-
TokenType2[TokenType2["From"] = 99] = "From";
|
|
429
|
+
TokenType2[TokenType2["As"] = 96] = "As";
|
|
430
|
+
TokenType2[TokenType2["From"] = 97] = "From";
|
|
341
431
|
return TokenType2;
|
|
342
432
|
})(TokenType || {});
|
|
343
|
-
class InputStream {
|
|
344
|
-
// Creates a stream that uses the specified source code
|
|
345
|
-
constructor(source) {
|
|
346
|
-
this.source = source;
|
|
347
|
-
this._pos = 0;
|
|
348
|
-
this._line = 1;
|
|
349
|
-
this._column = 0;
|
|
350
|
-
}
|
|
351
|
-
// Gets the current position in the stream. Starts from 0.
|
|
352
|
-
get position() {
|
|
353
|
-
return this._pos;
|
|
354
|
-
}
|
|
355
|
-
// Gets the current line number. Starts from 1.
|
|
356
|
-
get line() {
|
|
357
|
-
return this._line;
|
|
358
|
-
}
|
|
359
|
-
// Gets the current column number. Starts from 0.
|
|
360
|
-
get column() {
|
|
361
|
-
return this._column;
|
|
362
|
-
}
|
|
363
|
-
// Peeks the next character in the stream. Returns null, if EOF; otherwise the current source code character
|
|
364
|
-
peek() {
|
|
365
|
-
return this.ahead(0);
|
|
366
|
-
}
|
|
367
|
-
// Looks ahead with `n` characters in the stream. Returns null, if EOF; otherwise the look-ahead character
|
|
368
|
-
ahead(n = 1) {
|
|
369
|
-
return this._pos + n > this.source.length - 1 ? null : this.source[this._pos + n];
|
|
370
|
-
}
|
|
371
|
-
// Gets the next character from the stream
|
|
372
|
-
get() {
|
|
373
|
-
if (this._pos >= this.source.length) {
|
|
374
|
-
return null;
|
|
375
|
-
}
|
|
376
|
-
const ch = this.source[this._pos++];
|
|
377
|
-
if (ch === "\n") {
|
|
378
|
-
this._line++;
|
|
379
|
-
this._column = 0;
|
|
380
|
-
} else {
|
|
381
|
-
this._column++;
|
|
382
|
-
}
|
|
383
|
-
return ch;
|
|
384
|
-
}
|
|
385
|
-
// Gets the tail of the input stream
|
|
386
|
-
getTail(start) {
|
|
387
|
-
var _a;
|
|
388
|
-
return ((_a = this.source) == null ? void 0 : _a.substring(start)) ?? "";
|
|
389
|
-
}
|
|
390
|
-
}
|
|
391
|
-
const tokenTraits = {
|
|
392
|
-
[TokenType.Eof]: {},
|
|
393
|
-
[TokenType.Ws]: {},
|
|
394
|
-
[TokenType.DollarLBrace]: {},
|
|
395
|
-
[TokenType.Backtick]: { expressionStart: true },
|
|
396
|
-
[TokenType.BlockComment]: {},
|
|
397
|
-
[TokenType.EolComment]: {},
|
|
398
|
-
[TokenType.Unknown]: {},
|
|
399
|
-
[TokenType.LParent]: { expressionStart: true },
|
|
400
|
-
[TokenType.RParent]: {},
|
|
401
|
-
[TokenType.Identifier]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
402
|
-
[TokenType.Exponent]: {},
|
|
403
|
-
[TokenType.Divide]: {},
|
|
404
|
-
[TokenType.Multiply]: {},
|
|
405
|
-
[TokenType.Remainder]: {},
|
|
406
|
-
[TokenType.Plus]: { expressionStart: true, canBeUnary: true },
|
|
407
|
-
[TokenType.Minus]: { expressionStart: true, canBeUnary: true },
|
|
408
|
-
[TokenType.BitwiseXor]: {},
|
|
409
|
-
[TokenType.BitwiseOr]: {},
|
|
410
|
-
[TokenType.LogicalOr]: {},
|
|
411
|
-
[TokenType.BitwiseAnd]: {},
|
|
412
|
-
[TokenType.LogicalAnd]: {},
|
|
413
|
-
[TokenType.Assignment]: { isAssignment: true },
|
|
414
|
-
[TokenType.AddAssignment]: { isAssignment: true },
|
|
415
|
-
[TokenType.SubtractAssignment]: { isAssignment: true },
|
|
416
|
-
[TokenType.ExponentAssignment]: { isAssignment: true },
|
|
417
|
-
[TokenType.MultiplyAssignment]: { isAssignment: true },
|
|
418
|
-
[TokenType.DivideAssignment]: { isAssignment: true },
|
|
419
|
-
[TokenType.RemainderAssignment]: { isAssignment: true },
|
|
420
|
-
[TokenType.ShiftLeftAssignment]: { isAssignment: true },
|
|
421
|
-
[TokenType.ShiftRightAssignment]: { isAssignment: true },
|
|
422
|
-
[TokenType.SignedShiftRightAssignment]: { isAssignment: true },
|
|
423
|
-
[TokenType.BitwiseAndAssignment]: { isAssignment: true },
|
|
424
|
-
[TokenType.BitwiseXorAssignment]: { isAssignment: true },
|
|
425
|
-
[TokenType.BitwiseOrAssignment]: { isAssignment: true },
|
|
426
|
-
[TokenType.LogicalAndAssignment]: { isAssignment: true },
|
|
427
|
-
[TokenType.LogicalOrAssignment]: { isAssignment: true },
|
|
428
|
-
[TokenType.NullCoalesceAssignment]: { isAssignment: true },
|
|
429
|
-
[TokenType.Semicolon]: {},
|
|
430
|
-
[TokenType.Comma]: {},
|
|
431
|
-
[TokenType.Colon]: {},
|
|
432
|
-
[TokenType.LSquare]: { expressionStart: true },
|
|
433
|
-
[TokenType.RSquare]: {},
|
|
434
|
-
[TokenType.QuestionMark]: {},
|
|
435
|
-
[TokenType.NullCoalesce]: {},
|
|
436
|
-
[TokenType.OptionalChaining]: {},
|
|
437
|
-
[TokenType.BinaryNot]: { expressionStart: true, canBeUnary: true },
|
|
438
|
-
[TokenType.LBrace]: { expressionStart: true },
|
|
439
|
-
[TokenType.RBrace]: {},
|
|
440
|
-
[TokenType.Equal]: {},
|
|
441
|
-
[TokenType.StrictEqual]: {},
|
|
442
|
-
[TokenType.LogicalNot]: { expressionStart: true, canBeUnary: true },
|
|
443
|
-
[TokenType.NotEqual]: {},
|
|
444
|
-
[TokenType.StrictNotEqual]: {},
|
|
445
|
-
[TokenType.LessThan]: {},
|
|
446
|
-
[TokenType.LessThanOrEqual]: {},
|
|
447
|
-
[TokenType.ShiftLeft]: {},
|
|
448
|
-
[TokenType.GreaterThan]: {},
|
|
449
|
-
[TokenType.GreaterThanOrEqual]: {},
|
|
450
|
-
[TokenType.ShiftRight]: {},
|
|
451
|
-
[TokenType.SignedShiftRight]: {},
|
|
452
|
-
[TokenType.Dot]: {},
|
|
453
|
-
[TokenType.Spread]: { expressionStart: true, isPropLiteral: true },
|
|
454
|
-
[TokenType.Global]: { expressionStart: true },
|
|
455
|
-
[TokenType.DecimalLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
456
|
-
[TokenType.HexadecimalLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
457
|
-
[TokenType.BinaryLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
458
|
-
[TokenType.RealLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
459
|
-
[TokenType.StringLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
460
|
-
[TokenType.IncOp]: { expressionStart: true },
|
|
461
|
-
[TokenType.DecOp]: { expressionStart: true },
|
|
462
|
-
[TokenType.Infinity]: { expressionStart: true, keywordLike: true },
|
|
463
|
-
[TokenType.NaN]: { expressionStart: true, keywordLike: true },
|
|
464
|
-
[TokenType.True]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
465
|
-
[TokenType.False]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
466
|
-
[TokenType.Typeof]: { expressionStart: true, canBeUnary: true, keywordLike: true },
|
|
467
|
-
[TokenType.Null]: { expressionStart: true, keywordLike: true },
|
|
468
|
-
[TokenType.Undefined]: { expressionStart: true, keywordLike: true },
|
|
469
|
-
[TokenType.In]: { keywordLike: true },
|
|
470
|
-
[TokenType.Let]: { keywordLike: true },
|
|
471
|
-
[TokenType.Const]: { keywordLike: true },
|
|
472
|
-
[TokenType.Var]: { keywordLike: true },
|
|
473
|
-
[TokenType.If]: { keywordLike: true },
|
|
474
|
-
[TokenType.Else]: { keywordLike: true },
|
|
475
|
-
[TokenType.Arrow]: { keywordLike: true },
|
|
476
|
-
[TokenType.Return]: { keywordLike: true },
|
|
477
|
-
[TokenType.Break]: { keywordLike: true },
|
|
478
|
-
[TokenType.Continue]: { keywordLike: true },
|
|
479
|
-
[TokenType.Do]: { keywordLike: true },
|
|
480
|
-
[TokenType.While]: { keywordLike: true },
|
|
481
|
-
[TokenType.For]: { keywordLike: true },
|
|
482
|
-
[TokenType.Of]: { keywordLike: true },
|
|
483
|
-
[TokenType.Throw]: { keywordLike: true },
|
|
484
|
-
[TokenType.Try]: { keywordLike: true },
|
|
485
|
-
[TokenType.Catch]: { keywordLike: true },
|
|
486
|
-
[TokenType.Finally]: { keywordLike: true },
|
|
487
|
-
[TokenType.Switch]: { keywordLike: true },
|
|
488
|
-
[TokenType.Case]: { keywordLike: true },
|
|
489
|
-
[TokenType.Default]: { keywordLike: true },
|
|
490
|
-
[TokenType.Delete]: { expressionStart: true, canBeUnary: true, keywordLike: true },
|
|
491
|
-
[TokenType.Function]: { keywordLike: true, expressionStart: true },
|
|
492
|
-
[TokenType.Export]: { keywordLike: true },
|
|
493
|
-
[TokenType.Import]: { keywordLike: true },
|
|
494
|
-
[TokenType.As]: { keywordLike: true },
|
|
495
|
-
[TokenType.From]: { keywordLike: true }
|
|
496
|
-
};
|
|
497
433
|
class Lexer {
|
|
498
434
|
/**
|
|
499
435
|
* Initializes the tokenizer with the input stream
|
|
@@ -564,15 +500,14 @@ class Lexer {
|
|
|
564
500
|
* Gets the remaining characters after the parsing phase
|
|
565
501
|
*/
|
|
566
502
|
getTail() {
|
|
567
|
-
return this._ahead.length > 0 ? this.input.getTail(this._ahead[0].
|
|
503
|
+
return this._ahead.length > 0 ? this.input.getTail(this._ahead[0].startPosition) : this.input.getTail(this._lastFetchPosition);
|
|
568
504
|
}
|
|
569
|
-
/**
|
|
570
|
-
* Parsing template literals requires a context sensitive lexer.
|
|
505
|
+
/** Parsing template literals requires a context sensitive lexer.
|
|
571
506
|
* This method has to be called by the parser when the lexer needs to scan a string inside a template literal.
|
|
572
507
|
* Call this after the first opening backing and after the parser is done with parsing a placeholder, after the right brace.
|
|
573
508
|
*/
|
|
574
509
|
setStartingPhaseToTemplateLiteral() {
|
|
575
|
-
this._phaseExternallySet =
|
|
510
|
+
this._phaseExternallySet = 34;
|
|
576
511
|
}
|
|
577
512
|
/**
|
|
578
513
|
* Fetches the next character from the input stream
|
|
@@ -728,17 +663,6 @@ class Lexer {
|
|
|
728
663
|
break;
|
|
729
664
|
}
|
|
730
665
|
break;
|
|
731
|
-
case 6:
|
|
732
|
-
if (ch === "{") {
|
|
733
|
-
return completeToken(TokenType.DollarLBrace);
|
|
734
|
-
}
|
|
735
|
-
phase = 17;
|
|
736
|
-
useResolver = true;
|
|
737
|
-
tokenType = TokenType.Identifier;
|
|
738
|
-
if (!isIdContinuation(ch)) {
|
|
739
|
-
makeToken();
|
|
740
|
-
}
|
|
741
|
-
break;
|
|
742
666
|
case 1:
|
|
743
667
|
if (ch !== " " && ch !== " " && ch !== "\r" && ch !== "\n") {
|
|
744
668
|
return makeToken();
|
|
@@ -1012,8 +936,19 @@ class Lexer {
|
|
|
1012
936
|
return makeToken();
|
|
1013
937
|
}
|
|
1014
938
|
break;
|
|
1015
|
-
case
|
|
1016
|
-
|
|
939
|
+
case 6:
|
|
940
|
+
if (ch === "{") {
|
|
941
|
+
return completeToken(TokenType.DollarLBrace);
|
|
942
|
+
}
|
|
943
|
+
phase = 17;
|
|
944
|
+
useResolver = true;
|
|
945
|
+
tokenType = TokenType.Identifier;
|
|
946
|
+
if (!isIdContinuation(ch)) {
|
|
947
|
+
makeToken();
|
|
948
|
+
}
|
|
949
|
+
break;
|
|
950
|
+
case 33: {
|
|
951
|
+
phase = 34;
|
|
1017
952
|
const charAhead12 = this.input.ahead(0);
|
|
1018
953
|
const charAhead22 = this.input.ahead(1);
|
|
1019
954
|
if (charAhead12 === "`" || charAhead12 === "$" && charAhead22 === "{") {
|
|
@@ -1021,10 +956,10 @@ class Lexer {
|
|
|
1021
956
|
}
|
|
1022
957
|
break;
|
|
1023
958
|
}
|
|
1024
|
-
case
|
|
959
|
+
case 34:
|
|
1025
960
|
switch (ch) {
|
|
1026
961
|
case "\\":
|
|
1027
|
-
phase =
|
|
962
|
+
phase = 33;
|
|
1028
963
|
tokenType = TokenType.Unknown;
|
|
1029
964
|
break phaseSwitch;
|
|
1030
965
|
case "`":
|
|
@@ -1205,14 +1140,12 @@ class Lexer {
|
|
|
1205
1140
|
return {
|
|
1206
1141
|
text,
|
|
1207
1142
|
type: tokenType,
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
endColumn: lastEndColumn
|
|
1215
|
-
}
|
|
1143
|
+
startPosition: startPos,
|
|
1144
|
+
endPosition: lastEndPos,
|
|
1145
|
+
startLine: line,
|
|
1146
|
+
endLine: line,
|
|
1147
|
+
startColumn,
|
|
1148
|
+
endColumn: lastEndColumn
|
|
1216
1149
|
};
|
|
1217
1150
|
}
|
|
1218
1151
|
function completeToken(suggestedType) {
|
|
@@ -1235,7 +1168,7 @@ class Lexer {
|
|
|
1235
1168
|
* Fetches the next RegEx token from the input stream
|
|
1236
1169
|
*/
|
|
1237
1170
|
fetchRegEx() {
|
|
1238
|
-
const tailPosition = this._ahead.length > 0 ? this._ahead[0].
|
|
1171
|
+
const tailPosition = this._ahead.length > 0 ? this._ahead[0].startPosition : this._lastFetchPosition;
|
|
1239
1172
|
const tail = this.input.getTail(tailPosition);
|
|
1240
1173
|
try {
|
|
1241
1174
|
const regexpResult = parseRegExpLiteral(tail);
|
|
@@ -1322,8 +1255,6 @@ resolverHash.set("case", TokenType.Case);
|
|
|
1322
1255
|
resolverHash.set("default", TokenType.Default);
|
|
1323
1256
|
resolverHash.set("delete", TokenType.Delete);
|
|
1324
1257
|
resolverHash.set("function", TokenType.Function);
|
|
1325
|
-
resolverHash.set("export", TokenType.Export);
|
|
1326
|
-
resolverHash.set("import", TokenType.Import);
|
|
1327
1258
|
resolverHash.set("as", TokenType.As);
|
|
1328
1259
|
resolverHash.set("from", TokenType.From);
|
|
1329
1260
|
function isEof(t) {
|
|
@@ -1381,24 +1312,138 @@ const errorMessages$1 = {
|
|
|
1381
1312
|
W021: "'{0}' is already exported from the module",
|
|
1382
1313
|
W022: "Cannot find module '{0}'",
|
|
1383
1314
|
W023: "Module '{0}' does not export '{1}'",
|
|
1384
|
-
W024: "'function'
|
|
1315
|
+
W024: "'function' expected",
|
|
1385
1316
|
W025: "'from' expected",
|
|
1386
1317
|
W026: "A string literal expected",
|
|
1387
|
-
W027: "
|
|
1388
|
-
W028: "Invalid statement used in a module",
|
|
1318
|
+
W027: "Cannot declare var ('{0}') in an imported module",
|
|
1319
|
+
W028: "Invalid statement used in a module.",
|
|
1389
1320
|
W029: "An imported module can contain only exported functions",
|
|
1390
1321
|
W030: "Nested declarations cannot be exported",
|
|
1391
1322
|
W031: "An identifier in a declaration cannot start with '$'"
|
|
1392
1323
|
};
|
|
1324
|
+
const tokenTraits = {
|
|
1325
|
+
[TokenType.Eof]: {},
|
|
1326
|
+
[TokenType.Ws]: {},
|
|
1327
|
+
[TokenType.DollarLBrace]: {},
|
|
1328
|
+
[TokenType.Backtick]: { expressionStart: true },
|
|
1329
|
+
[TokenType.BlockComment]: {},
|
|
1330
|
+
[TokenType.EolComment]: {},
|
|
1331
|
+
[TokenType.Unknown]: {},
|
|
1332
|
+
[TokenType.LParent]: { expressionStart: true },
|
|
1333
|
+
[TokenType.RParent]: {},
|
|
1334
|
+
[TokenType.Identifier]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
1335
|
+
[TokenType.Exponent]: {},
|
|
1336
|
+
[TokenType.Divide]: {},
|
|
1337
|
+
[TokenType.Multiply]: {},
|
|
1338
|
+
[TokenType.Remainder]: {},
|
|
1339
|
+
[TokenType.Plus]: { expressionStart: true, canBeUnary: true },
|
|
1340
|
+
[TokenType.Minus]: { expressionStart: true, canBeUnary: true },
|
|
1341
|
+
[TokenType.BitwiseXor]: {},
|
|
1342
|
+
[TokenType.BitwiseOr]: {},
|
|
1343
|
+
[TokenType.LogicalOr]: {},
|
|
1344
|
+
[TokenType.BitwiseAnd]: {},
|
|
1345
|
+
[TokenType.LogicalAnd]: {},
|
|
1346
|
+
[TokenType.Assignment]: { isAssignment: true },
|
|
1347
|
+
[TokenType.AddAssignment]: { isAssignment: true },
|
|
1348
|
+
[TokenType.SubtractAssignment]: { isAssignment: true },
|
|
1349
|
+
[TokenType.ExponentAssignment]: { isAssignment: true },
|
|
1350
|
+
[TokenType.MultiplyAssignment]: { isAssignment: true },
|
|
1351
|
+
[TokenType.DivideAssignment]: { isAssignment: true },
|
|
1352
|
+
[TokenType.RemainderAssignment]: { isAssignment: true },
|
|
1353
|
+
[TokenType.ShiftLeftAssignment]: { isAssignment: true },
|
|
1354
|
+
[TokenType.ShiftRightAssignment]: { isAssignment: true },
|
|
1355
|
+
[TokenType.SignedShiftRightAssignment]: { isAssignment: true },
|
|
1356
|
+
[TokenType.BitwiseAndAssignment]: { isAssignment: true },
|
|
1357
|
+
[TokenType.BitwiseXorAssignment]: { isAssignment: true },
|
|
1358
|
+
[TokenType.BitwiseOrAssignment]: { isAssignment: true },
|
|
1359
|
+
[TokenType.LogicalAndAssignment]: { isAssignment: true },
|
|
1360
|
+
[TokenType.LogicalOrAssignment]: { isAssignment: true },
|
|
1361
|
+
[TokenType.NullCoalesceAssignment]: { isAssignment: true },
|
|
1362
|
+
[TokenType.Semicolon]: {},
|
|
1363
|
+
[TokenType.Comma]: {},
|
|
1364
|
+
[TokenType.Colon]: {},
|
|
1365
|
+
[TokenType.LSquare]: { expressionStart: true },
|
|
1366
|
+
[TokenType.RSquare]: {},
|
|
1367
|
+
[TokenType.QuestionMark]: {},
|
|
1368
|
+
[TokenType.NullCoalesce]: {},
|
|
1369
|
+
[TokenType.OptionalChaining]: {},
|
|
1370
|
+
[TokenType.BinaryNot]: { expressionStart: true, canBeUnary: true },
|
|
1371
|
+
[TokenType.LBrace]: { expressionStart: true },
|
|
1372
|
+
[TokenType.RBrace]: {},
|
|
1373
|
+
[TokenType.Equal]: {},
|
|
1374
|
+
[TokenType.StrictEqual]: {},
|
|
1375
|
+
[TokenType.LogicalNot]: { expressionStart: true, canBeUnary: true },
|
|
1376
|
+
[TokenType.NotEqual]: {},
|
|
1377
|
+
[TokenType.StrictNotEqual]: {},
|
|
1378
|
+
[TokenType.LessThan]: {},
|
|
1379
|
+
[TokenType.LessThanOrEqual]: {},
|
|
1380
|
+
[TokenType.ShiftLeft]: {},
|
|
1381
|
+
[TokenType.GreaterThan]: {},
|
|
1382
|
+
[TokenType.GreaterThanOrEqual]: {},
|
|
1383
|
+
[TokenType.ShiftRight]: {},
|
|
1384
|
+
[TokenType.SignedShiftRight]: {},
|
|
1385
|
+
[TokenType.Dot]: {},
|
|
1386
|
+
[TokenType.Spread]: { expressionStart: true, isPropLiteral: true },
|
|
1387
|
+
[TokenType.Global]: { expressionStart: true },
|
|
1388
|
+
[TokenType.DecimalLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
1389
|
+
[TokenType.HexadecimalLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
1390
|
+
[TokenType.BinaryLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
1391
|
+
[TokenType.RealLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
1392
|
+
[TokenType.StringLiteral]: { expressionStart: true, isPropLiteral: true },
|
|
1393
|
+
[TokenType.IncOp]: { expressionStart: true },
|
|
1394
|
+
[TokenType.DecOp]: { expressionStart: true },
|
|
1395
|
+
[TokenType.Infinity]: { expressionStart: true, keywordLike: true },
|
|
1396
|
+
[TokenType.NaN]: { expressionStart: true, keywordLike: true },
|
|
1397
|
+
[TokenType.True]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
1398
|
+
[TokenType.False]: { expressionStart: true, keywordLike: true, isPropLiteral: true },
|
|
1399
|
+
[TokenType.Typeof]: { expressionStart: true, canBeUnary: true, keywordLike: true },
|
|
1400
|
+
[TokenType.Null]: { expressionStart: true, keywordLike: true },
|
|
1401
|
+
[TokenType.Undefined]: { expressionStart: true, keywordLike: true },
|
|
1402
|
+
[TokenType.In]: { keywordLike: true },
|
|
1403
|
+
[TokenType.Let]: { keywordLike: true },
|
|
1404
|
+
[TokenType.Const]: { keywordLike: true },
|
|
1405
|
+
[TokenType.Var]: { keywordLike: true },
|
|
1406
|
+
[TokenType.If]: { keywordLike: true },
|
|
1407
|
+
[TokenType.Else]: { keywordLike: true },
|
|
1408
|
+
[TokenType.Arrow]: { keywordLike: true },
|
|
1409
|
+
[TokenType.Return]: { keywordLike: true },
|
|
1410
|
+
[TokenType.Break]: { keywordLike: true },
|
|
1411
|
+
[TokenType.Continue]: { keywordLike: true },
|
|
1412
|
+
[TokenType.Do]: { keywordLike: true },
|
|
1413
|
+
[TokenType.While]: { keywordLike: true },
|
|
1414
|
+
[TokenType.For]: { keywordLike: true },
|
|
1415
|
+
[TokenType.Of]: { keywordLike: true },
|
|
1416
|
+
[TokenType.Throw]: { keywordLike: true },
|
|
1417
|
+
[TokenType.Try]: { keywordLike: true },
|
|
1418
|
+
[TokenType.Catch]: { keywordLike: true },
|
|
1419
|
+
[TokenType.Finally]: { keywordLike: true },
|
|
1420
|
+
[TokenType.Switch]: { keywordLike: true },
|
|
1421
|
+
[TokenType.Case]: { keywordLike: true },
|
|
1422
|
+
[TokenType.Default]: { keywordLike: true },
|
|
1423
|
+
[TokenType.Delete]: { expressionStart: true, canBeUnary: true, keywordLike: true },
|
|
1424
|
+
[TokenType.Function]: { keywordLike: true, expressionStart: true },
|
|
1425
|
+
[TokenType.As]: { keywordLike: true },
|
|
1426
|
+
[TokenType.From]: { keywordLike: true }
|
|
1427
|
+
};
|
|
1428
|
+
let lastNodeId = 0;
|
|
1429
|
+
function createXmlUiTreeNodeId() {
|
|
1430
|
+
return ++lastNodeId;
|
|
1431
|
+
}
|
|
1393
1432
|
class Parser {
|
|
1394
1433
|
/**
|
|
1395
1434
|
* Initializes the parser with the specified source code
|
|
1396
1435
|
* @param source Source code to parse
|
|
1397
1436
|
*/
|
|
1398
1437
|
constructor(source) {
|
|
1399
|
-
this.source = source;
|
|
1400
1438
|
this._parseErrors = [];
|
|
1401
1439
|
this._statementLevel = 0;
|
|
1440
|
+
this._lexer = new Lexer(new InputStream(source ?? ""));
|
|
1441
|
+
}
|
|
1442
|
+
/**
|
|
1443
|
+
* Sets the source code to parse
|
|
1444
|
+
* @param source Source code to parse
|
|
1445
|
+
*/
|
|
1446
|
+
setSource(source) {
|
|
1402
1447
|
this._lexer = new Lexer(new InputStream(source));
|
|
1403
1448
|
}
|
|
1404
1449
|
/**
|
|
@@ -1448,7 +1493,7 @@ class Parser {
|
|
|
1448
1493
|
const statement = this.parseStatement();
|
|
1449
1494
|
if (!statement) return null;
|
|
1450
1495
|
statements.push(statement);
|
|
1451
|
-
if (statement.type !==
|
|
1496
|
+
if (statement.type !== T_EMPTY_STATEMENT) {
|
|
1452
1497
|
this.skipToken(TokenType.Semicolon);
|
|
1453
1498
|
}
|
|
1454
1499
|
}
|
|
@@ -1482,10 +1527,20 @@ class Parser {
|
|
|
1482
1527
|
return this.parseReturnStatement();
|
|
1483
1528
|
case TokenType.Break:
|
|
1484
1529
|
this._lexer.get();
|
|
1485
|
-
return this.createStatementNode(
|
|
1530
|
+
return this.createStatementNode(
|
|
1531
|
+
T_BREAK_STATEMENT,
|
|
1532
|
+
{},
|
|
1533
|
+
startToken,
|
|
1534
|
+
startToken
|
|
1535
|
+
);
|
|
1486
1536
|
case TokenType.Continue:
|
|
1487
1537
|
this._lexer.get();
|
|
1488
|
-
return this.createStatementNode(
|
|
1538
|
+
return this.createStatementNode(
|
|
1539
|
+
T_CONTINUE_STATEMENT,
|
|
1540
|
+
{},
|
|
1541
|
+
startToken,
|
|
1542
|
+
startToken
|
|
1543
|
+
);
|
|
1489
1544
|
case TokenType.For:
|
|
1490
1545
|
return this.parseForStatement();
|
|
1491
1546
|
case TokenType.Throw:
|
|
@@ -1496,20 +1551,8 @@ class Parser {
|
|
|
1496
1551
|
return this.parseSwitchStatement();
|
|
1497
1552
|
case TokenType.Function:
|
|
1498
1553
|
return this.parseFunctionDeclaration();
|
|
1499
|
-
case TokenType.Export:
|
|
1500
|
-
return this.parseExport();
|
|
1501
|
-
case TokenType.Import:
|
|
1502
|
-
return this.parseImport();
|
|
1503
1554
|
default:
|
|
1504
|
-
|
|
1505
|
-
this.reportError("W002", startToken, "EOF");
|
|
1506
|
-
return null;
|
|
1507
|
-
}
|
|
1508
|
-
if (this.isExpressionStart(startToken)) {
|
|
1509
|
-
return this.parseExpressionStatement(allowSequence);
|
|
1510
|
-
}
|
|
1511
|
-
this.reportError("W002", startToken, startToken.text);
|
|
1512
|
-
return null;
|
|
1555
|
+
return this.isExpressionStart(startToken) ? this.parseExpressionStatement(allowSequence) : null;
|
|
1513
1556
|
}
|
|
1514
1557
|
} finally {
|
|
1515
1558
|
this._statementLevel--;
|
|
@@ -1524,7 +1567,7 @@ class Parser {
|
|
|
1524
1567
|
*/
|
|
1525
1568
|
parseEmptyStatement() {
|
|
1526
1569
|
const startToken = this._lexer.get();
|
|
1527
|
-
return this.createStatementNode(
|
|
1570
|
+
return this.createStatementNode(T_EMPTY_STATEMENT, {}, startToken, startToken);
|
|
1528
1571
|
}
|
|
1529
1572
|
/**
|
|
1530
1573
|
* Parses an expression statement
|
|
@@ -1535,14 +1578,14 @@ class Parser {
|
|
|
1535
1578
|
*/
|
|
1536
1579
|
parseExpressionStatement(allowSequence = true) {
|
|
1537
1580
|
const startToken = this._lexer.peek();
|
|
1538
|
-
const
|
|
1539
|
-
return
|
|
1540
|
-
|
|
1581
|
+
const expr = this.getExpression(allowSequence);
|
|
1582
|
+
return expr ? this.createStatementNode(
|
|
1583
|
+
T_EXPRESSION_STATEMENT,
|
|
1541
1584
|
{
|
|
1542
|
-
|
|
1585
|
+
expr
|
|
1543
1586
|
},
|
|
1544
1587
|
startToken,
|
|
1545
|
-
|
|
1588
|
+
expr.endToken
|
|
1546
1589
|
) : null;
|
|
1547
1590
|
}
|
|
1548
1591
|
/**
|
|
@@ -1555,26 +1598,26 @@ class Parser {
|
|
|
1555
1598
|
parseLetStatement() {
|
|
1556
1599
|
const startToken = this._lexer.get();
|
|
1557
1600
|
let endToken = startToken;
|
|
1558
|
-
const
|
|
1601
|
+
const decls = [];
|
|
1559
1602
|
while (true) {
|
|
1560
1603
|
const declStart = this._lexer.peek();
|
|
1561
1604
|
let declarationProps = {};
|
|
1562
1605
|
if (declStart.type === TokenType.LBrace) {
|
|
1563
1606
|
endToken = this._lexer.ahead(1);
|
|
1564
|
-
const
|
|
1565
|
-
if (
|
|
1607
|
+
const oDestr = this.parseObjectDestructure();
|
|
1608
|
+
if (oDestr === null) return null;
|
|
1566
1609
|
declarationProps = {
|
|
1567
|
-
|
|
1610
|
+
oDestr
|
|
1568
1611
|
};
|
|
1569
|
-
endToken =
|
|
1612
|
+
endToken = oDestr.length > 0 ? oDestr[oDestr.length - 1].endToken : endToken;
|
|
1570
1613
|
} else if (declStart.type === TokenType.LSquare) {
|
|
1571
1614
|
endToken = this._lexer.ahead(1);
|
|
1572
|
-
const
|
|
1573
|
-
if (
|
|
1615
|
+
const aDestr = this.parseArrayDestructure();
|
|
1616
|
+
if (aDestr === null) return null;
|
|
1574
1617
|
declarationProps = {
|
|
1575
|
-
|
|
1618
|
+
aDestr
|
|
1576
1619
|
};
|
|
1577
|
-
endToken =
|
|
1620
|
+
endToken = aDestr.length > 0 ? aDestr[aDestr.length - 1].endToken : endToken;
|
|
1578
1621
|
} else if (declStart.type === TokenType.Identifier) {
|
|
1579
1622
|
if (declStart.text.startsWith("$")) {
|
|
1580
1623
|
this.reportError("W031");
|
|
@@ -1589,27 +1632,32 @@ class Parser {
|
|
|
1589
1632
|
return null;
|
|
1590
1633
|
}
|
|
1591
1634
|
const initToken = this._lexer.peek();
|
|
1592
|
-
let
|
|
1635
|
+
let expr = null;
|
|
1593
1636
|
if (initToken.type === TokenType.Assignment) {
|
|
1594
1637
|
this._lexer.get();
|
|
1595
|
-
|
|
1596
|
-
if (
|
|
1597
|
-
declarationProps.
|
|
1598
|
-
endToken =
|
|
1599
|
-
} else if (declarationProps.
|
|
1638
|
+
expr = this.getExpression(false);
|
|
1639
|
+
if (expr === null) return null;
|
|
1640
|
+
declarationProps.expr = expr;
|
|
1641
|
+
endToken = expr.endToken;
|
|
1642
|
+
} else if (declarationProps.aDestr || declarationProps.oDestr) {
|
|
1600
1643
|
this.reportError("W009", initToken);
|
|
1601
1644
|
return null;
|
|
1602
1645
|
}
|
|
1603
|
-
|
|
1604
|
-
this.createExpressionNode(
|
|
1646
|
+
decls.push(
|
|
1647
|
+
this.createExpressionNode(
|
|
1648
|
+
T_VAR_DECLARATION,
|
|
1649
|
+
declarationProps,
|
|
1650
|
+
declStart,
|
|
1651
|
+
endToken
|
|
1652
|
+
)
|
|
1605
1653
|
);
|
|
1606
1654
|
if (this._lexer.peek().type !== TokenType.Comma) break;
|
|
1607
1655
|
this._lexer.get();
|
|
1608
1656
|
}
|
|
1609
1657
|
return this.createStatementNode(
|
|
1610
|
-
|
|
1658
|
+
T_LET_STATEMENT,
|
|
1611
1659
|
{
|
|
1612
|
-
|
|
1660
|
+
decls
|
|
1613
1661
|
},
|
|
1614
1662
|
startToken,
|
|
1615
1663
|
endToken
|
|
@@ -1625,26 +1673,26 @@ class Parser {
|
|
|
1625
1673
|
parseConstStatement() {
|
|
1626
1674
|
const startToken = this._lexer.get();
|
|
1627
1675
|
let endToken = startToken;
|
|
1628
|
-
const
|
|
1676
|
+
const decls = [];
|
|
1629
1677
|
while (true) {
|
|
1630
1678
|
const declStart = this._lexer.peek();
|
|
1631
1679
|
let declarationProps = {};
|
|
1632
1680
|
if (declStart.type === TokenType.LBrace) {
|
|
1633
1681
|
endToken = this._lexer.ahead(1);
|
|
1634
|
-
const
|
|
1635
|
-
if (
|
|
1682
|
+
const oDestr = this.parseObjectDestructure();
|
|
1683
|
+
if (oDestr === null) return null;
|
|
1636
1684
|
declarationProps = {
|
|
1637
|
-
|
|
1685
|
+
oDestr
|
|
1638
1686
|
};
|
|
1639
|
-
endToken =
|
|
1687
|
+
endToken = oDestr.length > 0 ? oDestr[oDestr.length - 1].endToken : endToken;
|
|
1640
1688
|
} else if (declStart.type === TokenType.LSquare) {
|
|
1641
1689
|
endToken = this._lexer.ahead(1);
|
|
1642
|
-
const
|
|
1643
|
-
if (
|
|
1690
|
+
const aDestr = this.parseArrayDestructure();
|
|
1691
|
+
if (aDestr === null) return null;
|
|
1644
1692
|
declarationProps = {
|
|
1645
|
-
|
|
1693
|
+
aDestr
|
|
1646
1694
|
};
|
|
1647
|
-
endToken =
|
|
1695
|
+
endToken = aDestr.length > 0 ? aDestr[aDestr.length - 1].endToken : endToken;
|
|
1648
1696
|
} else if (declStart.type === TokenType.Identifier) {
|
|
1649
1697
|
if (declStart.text.startsWith("$")) {
|
|
1650
1698
|
this.reportError("W031");
|
|
@@ -1659,27 +1707,32 @@ class Parser {
|
|
|
1659
1707
|
return null;
|
|
1660
1708
|
}
|
|
1661
1709
|
this.expectToken(TokenType.Assignment);
|
|
1662
|
-
const
|
|
1663
|
-
if (
|
|
1664
|
-
declarationProps.
|
|
1665
|
-
endToken =
|
|
1666
|
-
|
|
1667
|
-
this.createExpressionNode(
|
|
1710
|
+
const expr = this.getExpression(false);
|
|
1711
|
+
if (expr === null) return null;
|
|
1712
|
+
declarationProps.expr = expr;
|
|
1713
|
+
endToken = expr.endToken;
|
|
1714
|
+
decls.push(
|
|
1715
|
+
this.createExpressionNode(
|
|
1716
|
+
T_VAR_DECLARATION,
|
|
1717
|
+
declarationProps,
|
|
1718
|
+
declStart,
|
|
1719
|
+
endToken
|
|
1720
|
+
)
|
|
1668
1721
|
);
|
|
1669
1722
|
if (this._lexer.peek().type !== TokenType.Comma) break;
|
|
1670
1723
|
this._lexer.get();
|
|
1671
1724
|
}
|
|
1672
1725
|
return this.createStatementNode(
|
|
1673
|
-
|
|
1726
|
+
T_CONST_STATEMENT,
|
|
1674
1727
|
{
|
|
1675
|
-
|
|
1728
|
+
decls
|
|
1676
1729
|
},
|
|
1677
1730
|
startToken,
|
|
1678
1731
|
endToken
|
|
1679
1732
|
);
|
|
1680
1733
|
}
|
|
1681
1734
|
/**
|
|
1682
|
-
* Parses a
|
|
1735
|
+
* Parses a var statement
|
|
1683
1736
|
*
|
|
1684
1737
|
* constStatement
|
|
1685
1738
|
* : "var" id "=" expression
|
|
@@ -1688,7 +1741,7 @@ class Parser {
|
|
|
1688
1741
|
parseVarStatement() {
|
|
1689
1742
|
const startToken = this._lexer.get();
|
|
1690
1743
|
let endToken = startToken;
|
|
1691
|
-
const
|
|
1744
|
+
const decls = [];
|
|
1692
1745
|
while (true) {
|
|
1693
1746
|
const declStart = this._lexer.peek();
|
|
1694
1747
|
let declarationProps = {};
|
|
@@ -1699,20 +1752,25 @@ class Parser {
|
|
|
1699
1752
|
}
|
|
1700
1753
|
endToken = this._lexer.get();
|
|
1701
1754
|
declarationProps = {
|
|
1702
|
-
id:
|
|
1755
|
+
id: {
|
|
1756
|
+
type: T_IDENTIFIER,
|
|
1757
|
+
name: declStart.text,
|
|
1758
|
+
startToken: declStart,
|
|
1759
|
+
endToken
|
|
1760
|
+
}
|
|
1703
1761
|
};
|
|
1704
1762
|
} else {
|
|
1705
1763
|
this.reportError("W003");
|
|
1706
1764
|
return null;
|
|
1707
1765
|
}
|
|
1708
1766
|
this.expectToken(TokenType.Assignment);
|
|
1709
|
-
const
|
|
1710
|
-
if (
|
|
1711
|
-
declarationProps.
|
|
1712
|
-
endToken =
|
|
1713
|
-
|
|
1767
|
+
const expr = this.getExpression(false);
|
|
1768
|
+
if (expr === null) return null;
|
|
1769
|
+
declarationProps.expr = expr;
|
|
1770
|
+
endToken = expr.endToken;
|
|
1771
|
+
decls.push(
|
|
1714
1772
|
this.createExpressionNode(
|
|
1715
|
-
|
|
1773
|
+
T_REACTIVE_VAR_DECLARATION,
|
|
1716
1774
|
declarationProps,
|
|
1717
1775
|
declStart,
|
|
1718
1776
|
endToken
|
|
@@ -1722,9 +1780,9 @@ class Parser {
|
|
|
1722
1780
|
this._lexer.get();
|
|
1723
1781
|
}
|
|
1724
1782
|
return this.createStatementNode(
|
|
1725
|
-
|
|
1783
|
+
T_VAR_STATEMENT,
|
|
1726
1784
|
{
|
|
1727
|
-
|
|
1785
|
+
decls
|
|
1728
1786
|
},
|
|
1729
1787
|
startToken,
|
|
1730
1788
|
endToken
|
|
@@ -1745,8 +1803,8 @@ class Parser {
|
|
|
1745
1803
|
return null;
|
|
1746
1804
|
}
|
|
1747
1805
|
let alias;
|
|
1748
|
-
let
|
|
1749
|
-
let
|
|
1806
|
+
let aDestr;
|
|
1807
|
+
let oDestr;
|
|
1750
1808
|
this._lexer.get();
|
|
1751
1809
|
nextToken = this._lexer.peek();
|
|
1752
1810
|
if (nextToken.type === TokenType.Colon) {
|
|
@@ -1757,21 +1815,21 @@ class Parser {
|
|
|
1757
1815
|
endToken = nextToken;
|
|
1758
1816
|
this._lexer.get();
|
|
1759
1817
|
} else if (nextToken.type === TokenType.LSquare) {
|
|
1760
|
-
|
|
1761
|
-
if (
|
|
1762
|
-
endToken =
|
|
1818
|
+
aDestr = this.parseArrayDestructure();
|
|
1819
|
+
if (aDestr === null) return null;
|
|
1820
|
+
endToken = aDestr[aDestr.length - 1].endToken;
|
|
1763
1821
|
} else if (nextToken.type === TokenType.LBrace) {
|
|
1764
|
-
|
|
1765
|
-
if (
|
|
1766
|
-
endToken =
|
|
1822
|
+
oDestr = this.parseObjectDestructure();
|
|
1823
|
+
if (oDestr === null) return null;
|
|
1824
|
+
endToken = oDestr[oDestr.length - 1].endToken;
|
|
1767
1825
|
}
|
|
1768
1826
|
}
|
|
1769
1827
|
nextToken = this._lexer.peek();
|
|
1770
1828
|
if (nextToken.type === TokenType.Comma || nextToken.type === TokenType.RBrace) {
|
|
1771
1829
|
result.push(
|
|
1772
1830
|
this.createExpressionNode(
|
|
1773
|
-
|
|
1774
|
-
{ id, alias,
|
|
1831
|
+
T_OBJECT_DESTRUCTURE,
|
|
1832
|
+
{ id, alias, aDestr, oDestr },
|
|
1775
1833
|
startToken,
|
|
1776
1834
|
endToken
|
|
1777
1835
|
)
|
|
@@ -1792,8 +1850,8 @@ class Parser {
|
|
|
1792
1850
|
do {
|
|
1793
1851
|
let nextToken = this._lexer.peek();
|
|
1794
1852
|
let id;
|
|
1795
|
-
let
|
|
1796
|
-
let
|
|
1853
|
+
let aDestr;
|
|
1854
|
+
let oDestr;
|
|
1797
1855
|
if (nextToken.type === TokenType.Identifier) {
|
|
1798
1856
|
id = nextToken.text;
|
|
1799
1857
|
if (id.startsWith("$")) {
|
|
@@ -1803,31 +1861,31 @@ class Parser {
|
|
|
1803
1861
|
endToken = nextToken;
|
|
1804
1862
|
nextToken = this._lexer.get();
|
|
1805
1863
|
} else if (nextToken.type === TokenType.LSquare) {
|
|
1806
|
-
|
|
1807
|
-
if (
|
|
1808
|
-
endToken =
|
|
1864
|
+
aDestr = this.parseArrayDestructure();
|
|
1865
|
+
if (aDestr === null) return null;
|
|
1866
|
+
endToken = aDestr[aDestr.length - 1].endToken;
|
|
1809
1867
|
} else if (nextToken.type === TokenType.LBrace) {
|
|
1810
|
-
|
|
1811
|
-
if (
|
|
1812
|
-
endToken =
|
|
1868
|
+
oDestr = this.parseObjectDestructure();
|
|
1869
|
+
if (oDestr === null) return null;
|
|
1870
|
+
endToken = oDestr[oDestr.length - 1].endToken;
|
|
1813
1871
|
}
|
|
1814
1872
|
nextToken = this._lexer.peek();
|
|
1815
1873
|
if (nextToken.type === TokenType.Comma) {
|
|
1816
1874
|
result.push(
|
|
1817
1875
|
this.createExpressionNode(
|
|
1818
|
-
|
|
1819
|
-
{ id,
|
|
1876
|
+
T_ARRAY_DESTRUCTURE,
|
|
1877
|
+
{ id, aDestr, oDestr },
|
|
1820
1878
|
startToken,
|
|
1821
1879
|
endToken
|
|
1822
1880
|
)
|
|
1823
1881
|
);
|
|
1824
1882
|
this._lexer.get();
|
|
1825
1883
|
} else if (nextToken.type === TokenType.RSquare) {
|
|
1826
|
-
if (id ||
|
|
1884
|
+
if (id || aDestr || oDestr) {
|
|
1827
1885
|
result.push(
|
|
1828
1886
|
this.createExpressionNode(
|
|
1829
|
-
|
|
1830
|
-
{ id,
|
|
1887
|
+
T_ARRAY_DESTRUCTURE,
|
|
1888
|
+
{ id, aDestr, oDestr },
|
|
1831
1889
|
startToken,
|
|
1832
1890
|
endToken
|
|
1833
1891
|
)
|
|
@@ -1851,17 +1909,22 @@ class Parser {
|
|
|
1851
1909
|
*/
|
|
1852
1910
|
parseBlockStatement() {
|
|
1853
1911
|
const startToken = this._lexer.get();
|
|
1854
|
-
const
|
|
1912
|
+
const stmts = [];
|
|
1855
1913
|
while (this._lexer.peek().type !== TokenType.RBrace) {
|
|
1856
1914
|
const statement = this.parseStatement();
|
|
1857
1915
|
if (!statement) return null;
|
|
1858
|
-
|
|
1859
|
-
if (statement.type !==
|
|
1916
|
+
stmts.push(statement);
|
|
1917
|
+
if (statement.type !== T_EMPTY_STATEMENT) {
|
|
1860
1918
|
this.skipToken(TokenType.Semicolon);
|
|
1861
1919
|
}
|
|
1862
1920
|
}
|
|
1863
1921
|
const endToken = this._lexer.get();
|
|
1864
|
-
return this.createStatementNode(
|
|
1922
|
+
return this.createStatementNode(
|
|
1923
|
+
T_BLOCK_STATEMENT,
|
|
1924
|
+
{ stmts },
|
|
1925
|
+
startToken,
|
|
1926
|
+
endToken
|
|
1927
|
+
);
|
|
1865
1928
|
}
|
|
1866
1929
|
/**
|
|
1867
1930
|
* Parses an if statement
|
|
@@ -1874,33 +1937,33 @@ class Parser {
|
|
|
1874
1937
|
const startToken = this._lexer.get();
|
|
1875
1938
|
let endToken = startToken;
|
|
1876
1939
|
this.expectToken(TokenType.LParent, "W014");
|
|
1877
|
-
const
|
|
1878
|
-
if (!
|
|
1940
|
+
const cond = this.getExpression();
|
|
1941
|
+
if (!cond) return null;
|
|
1879
1942
|
this.expectToken(TokenType.RParent, "W006");
|
|
1880
|
-
const
|
|
1881
|
-
if (!
|
|
1882
|
-
endToken =
|
|
1943
|
+
const thenB = this.parseStatement();
|
|
1944
|
+
if (!thenB) return null;
|
|
1945
|
+
endToken = thenB.endToken;
|
|
1883
1946
|
let elseCanFollow = true;
|
|
1884
|
-
if (
|
|
1947
|
+
if (thenB.type !== T_BLOCK_STATEMENT) {
|
|
1885
1948
|
if (this._lexer.peek().type === TokenType.Semicolon) {
|
|
1886
1949
|
this._lexer.get();
|
|
1887
1950
|
} else {
|
|
1888
1951
|
elseCanFollow = false;
|
|
1889
1952
|
}
|
|
1890
1953
|
}
|
|
1891
|
-
let
|
|
1954
|
+
let elseB = null;
|
|
1892
1955
|
if (elseCanFollow && this._lexer.peek().type === TokenType.Else) {
|
|
1893
1956
|
this._lexer.get();
|
|
1894
|
-
|
|
1895
|
-
if (!
|
|
1896
|
-
endToken =
|
|
1957
|
+
elseB = this.parseStatement();
|
|
1958
|
+
if (!elseB) return null;
|
|
1959
|
+
endToken = elseB.endToken;
|
|
1897
1960
|
}
|
|
1898
1961
|
return this.createStatementNode(
|
|
1899
|
-
|
|
1962
|
+
T_IF_STATEMENT,
|
|
1900
1963
|
{
|
|
1901
|
-
|
|
1902
|
-
|
|
1903
|
-
|
|
1964
|
+
cond,
|
|
1965
|
+
thenB,
|
|
1966
|
+
elseB
|
|
1904
1967
|
},
|
|
1905
1968
|
startToken,
|
|
1906
1969
|
endToken
|
|
@@ -1916,15 +1979,15 @@ class Parser {
|
|
|
1916
1979
|
parseWhileStatement() {
|
|
1917
1980
|
const startToken = this._lexer.get();
|
|
1918
1981
|
this.expectToken(TokenType.LParent, "W014");
|
|
1919
|
-
const
|
|
1920
|
-
if (!
|
|
1982
|
+
const cond = this.getExpression();
|
|
1983
|
+
if (!cond) return null;
|
|
1921
1984
|
this.expectToken(TokenType.RParent, "W006");
|
|
1922
1985
|
const body = this.parseStatement();
|
|
1923
1986
|
if (!body) return null;
|
|
1924
1987
|
return this.createStatementNode(
|
|
1925
|
-
|
|
1988
|
+
T_WHILE_STATEMENT,
|
|
1926
1989
|
{
|
|
1927
|
-
|
|
1990
|
+
cond,
|
|
1928
1991
|
body
|
|
1929
1992
|
},
|
|
1930
1993
|
startToken,
|
|
@@ -1942,19 +2005,19 @@ class Parser {
|
|
|
1942
2005
|
const startToken = this._lexer.get();
|
|
1943
2006
|
const body = this.parseStatement();
|
|
1944
2007
|
if (!body) return null;
|
|
1945
|
-
if (body.type !==
|
|
2008
|
+
if (body.type !== T_BLOCK_STATEMENT && body.type !== T_EMPTY_STATEMENT) {
|
|
1946
2009
|
this.expectToken(TokenType.Semicolon);
|
|
1947
2010
|
}
|
|
1948
2011
|
this.expectToken(TokenType.While);
|
|
1949
2012
|
this.expectToken(TokenType.LParent, "W014");
|
|
1950
|
-
const
|
|
1951
|
-
if (!
|
|
2013
|
+
const cond = this.getExpression();
|
|
2014
|
+
if (!cond) return null;
|
|
1952
2015
|
const endToken = this._lexer.peek();
|
|
1953
2016
|
this.expectToken(TokenType.RParent, "W006");
|
|
1954
2017
|
return this.createStatementNode(
|
|
1955
|
-
|
|
2018
|
+
T_DO_WHILE_STATEMENT,
|
|
1956
2019
|
{
|
|
1957
|
-
|
|
2020
|
+
cond,
|
|
1958
2021
|
body
|
|
1959
2022
|
},
|
|
1960
2023
|
startToken,
|
|
@@ -1971,16 +2034,16 @@ class Parser {
|
|
|
1971
2034
|
parseReturnStatement() {
|
|
1972
2035
|
const startToken = this._lexer.peek();
|
|
1973
2036
|
let endToken = this._lexer.get();
|
|
1974
|
-
let
|
|
2037
|
+
let expr;
|
|
1975
2038
|
if (tokenTraits[this._lexer.peek().type].expressionStart) {
|
|
1976
|
-
|
|
1977
|
-
if (
|
|
1978
|
-
endToken =
|
|
2039
|
+
expr = this.getExpression();
|
|
2040
|
+
if (expr === null) return null;
|
|
2041
|
+
endToken = expr.endToken;
|
|
1979
2042
|
}
|
|
1980
2043
|
return this.createStatementNode(
|
|
1981
|
-
|
|
2044
|
+
T_RETURN_STATEMENT,
|
|
1982
2045
|
{
|
|
1983
|
-
|
|
2046
|
+
expr
|
|
1984
2047
|
},
|
|
1985
2048
|
startToken,
|
|
1986
2049
|
endToken
|
|
@@ -1999,18 +2062,18 @@ class Parser {
|
|
|
1999
2062
|
let nextToken = this._lexer.peek();
|
|
2000
2063
|
if (nextToken.type === TokenType.Identifier) {
|
|
2001
2064
|
if (this._lexer.ahead(1).type === TokenType.In) {
|
|
2002
|
-
return this.parseForInOfStatement(startToken, "none", nextToken
|
|
2065
|
+
return this.parseForInOfStatement(startToken, "none", nextToken, T_FOR_IN_STATEMENT);
|
|
2003
2066
|
} else if (this._lexer.ahead(1).type === TokenType.Of) {
|
|
2004
|
-
return this.parseForInOfStatement(startToken, "none", nextToken
|
|
2067
|
+
return this.parseForInOfStatement(startToken, "none", nextToken, T_FOR_OF_STATEMENT);
|
|
2005
2068
|
}
|
|
2006
2069
|
} else if (nextToken.type === TokenType.Let) {
|
|
2007
2070
|
const idToken = this._lexer.ahead(1);
|
|
2008
2071
|
if (idToken.type === TokenType.Identifier) {
|
|
2009
2072
|
const inOfToken = this._lexer.ahead(2);
|
|
2010
2073
|
if (inOfToken.type === TokenType.In) {
|
|
2011
|
-
return this.parseForInOfStatement(startToken, "let", idToken
|
|
2074
|
+
return this.parseForInOfStatement(startToken, "let", idToken, T_FOR_IN_STATEMENT);
|
|
2012
2075
|
} else if (inOfToken.type === TokenType.Of) {
|
|
2013
|
-
return this.parseForInOfStatement(startToken, "let", idToken
|
|
2076
|
+
return this.parseForInOfStatement(startToken, "let", idToken, T_FOR_OF_STATEMENT);
|
|
2014
2077
|
}
|
|
2015
2078
|
}
|
|
2016
2079
|
} else if (nextToken.type === TokenType.Const) {
|
|
@@ -2018,9 +2081,9 @@ class Parser {
|
|
|
2018
2081
|
if (idToken.type === TokenType.Identifier) {
|
|
2019
2082
|
const inOfToken = this._lexer.ahead(2);
|
|
2020
2083
|
if (inOfToken.type === TokenType.In) {
|
|
2021
|
-
return this.parseForInOfStatement(startToken, "const", idToken
|
|
2084
|
+
return this.parseForInOfStatement(startToken, "const", idToken, T_FOR_IN_STATEMENT);
|
|
2022
2085
|
} else if (inOfToken.type === TokenType.Of) {
|
|
2023
|
-
return this.parseForInOfStatement(startToken, "const", idToken
|
|
2086
|
+
return this.parseForInOfStatement(startToken, "const", idToken, T_FOR_OF_STATEMENT);
|
|
2024
2087
|
}
|
|
2025
2088
|
}
|
|
2026
2089
|
}
|
|
@@ -2034,7 +2097,7 @@ class Parser {
|
|
|
2034
2097
|
return null;
|
|
2035
2098
|
}
|
|
2036
2099
|
init = letStmt;
|
|
2037
|
-
if (init.
|
|
2100
|
+
if (init.decls.some((d) => !d.expr)) {
|
|
2038
2101
|
this.reportError("W011");
|
|
2039
2102
|
return null;
|
|
2040
2103
|
}
|
|
@@ -2047,22 +2110,22 @@ class Parser {
|
|
|
2047
2110
|
init = exprStmt;
|
|
2048
2111
|
this.expectToken(TokenType.Semicolon);
|
|
2049
2112
|
}
|
|
2050
|
-
let
|
|
2113
|
+
let cond;
|
|
2051
2114
|
nextToken = this._lexer.peek();
|
|
2052
2115
|
if (nextToken.type === TokenType.Semicolon) {
|
|
2053
2116
|
this._lexer.get();
|
|
2054
2117
|
} else {
|
|
2055
|
-
|
|
2056
|
-
if (
|
|
2118
|
+
cond = this.getExpression();
|
|
2119
|
+
if (cond === null) {
|
|
2057
2120
|
return null;
|
|
2058
2121
|
}
|
|
2059
2122
|
this.expectToken(TokenType.Semicolon);
|
|
2060
2123
|
}
|
|
2061
|
-
let
|
|
2124
|
+
let upd;
|
|
2062
2125
|
nextToken = this._lexer.peek();
|
|
2063
2126
|
if (nextToken.type !== TokenType.RParent) {
|
|
2064
|
-
|
|
2065
|
-
if (
|
|
2127
|
+
upd = this.getExpression();
|
|
2128
|
+
if (upd === null) {
|
|
2066
2129
|
return null;
|
|
2067
2130
|
}
|
|
2068
2131
|
}
|
|
@@ -2070,11 +2133,11 @@ class Parser {
|
|
|
2070
2133
|
const body = this.parseStatement();
|
|
2071
2134
|
if (!body) return null;
|
|
2072
2135
|
return this.createStatementNode(
|
|
2073
|
-
|
|
2136
|
+
T_FOR_STATEMENT,
|
|
2074
2137
|
{
|
|
2075
2138
|
init,
|
|
2076
|
-
|
|
2077
|
-
|
|
2139
|
+
cond,
|
|
2140
|
+
upd,
|
|
2078
2141
|
body
|
|
2079
2142
|
},
|
|
2080
2143
|
startToken,
|
|
@@ -2088,13 +2151,13 @@ class Parser {
|
|
|
2088
2151
|
* ;
|
|
2089
2152
|
*
|
|
2090
2153
|
* @param startToken Statement start token
|
|
2091
|
-
* @param
|
|
2154
|
+
* @param varB Variable binding of the for..in/of statement
|
|
2092
2155
|
* @param id ID name
|
|
2093
2156
|
* @param type Is it a for..in or a for..of?
|
|
2094
2157
|
*/
|
|
2095
|
-
parseForInOfStatement(startToken,
|
|
2096
|
-
if (
|
|
2097
|
-
if (
|
|
2158
|
+
parseForInOfStatement(startToken, varB, idToken, type) {
|
|
2159
|
+
if (varB !== "none") {
|
|
2160
|
+
if (idToken.text.startsWith("$")) {
|
|
2098
2161
|
this.reportError("W031");
|
|
2099
2162
|
return null;
|
|
2100
2163
|
}
|
|
@@ -2102,26 +2165,36 @@ class Parser {
|
|
|
2102
2165
|
}
|
|
2103
2166
|
this._lexer.get();
|
|
2104
2167
|
this._lexer.get();
|
|
2105
|
-
const
|
|
2168
|
+
const expr = this.getExpression(true);
|
|
2106
2169
|
this.expectToken(TokenType.RParent, "W006");
|
|
2107
2170
|
const body = this.parseStatement();
|
|
2108
2171
|
if (!body) return null;
|
|
2109
|
-
return type ===
|
|
2110
|
-
|
|
2172
|
+
return type === T_FOR_IN_STATEMENT ? this.createStatementNode(
|
|
2173
|
+
T_FOR_IN_STATEMENT,
|
|
2111
2174
|
{
|
|
2112
|
-
|
|
2113
|
-
id
|
|
2114
|
-
|
|
2175
|
+
varB,
|
|
2176
|
+
id: {
|
|
2177
|
+
type: T_IDENTIFIER,
|
|
2178
|
+
name: idToken.text,
|
|
2179
|
+
startToken: idToken,
|
|
2180
|
+
endToken: idToken
|
|
2181
|
+
},
|
|
2182
|
+
expr,
|
|
2115
2183
|
body
|
|
2116
2184
|
},
|
|
2117
2185
|
startToken,
|
|
2118
2186
|
body.endToken
|
|
2119
2187
|
) : this.createStatementNode(
|
|
2120
|
-
|
|
2188
|
+
T_FOR_OF_STATEMENT,
|
|
2121
2189
|
{
|
|
2122
|
-
|
|
2123
|
-
id
|
|
2124
|
-
|
|
2190
|
+
varB,
|
|
2191
|
+
id: {
|
|
2192
|
+
type: T_IDENTIFIER,
|
|
2193
|
+
name: idToken.text,
|
|
2194
|
+
startToken: idToken,
|
|
2195
|
+
endToken: idToken
|
|
2196
|
+
},
|
|
2197
|
+
expr,
|
|
2125
2198
|
body
|
|
2126
2199
|
},
|
|
2127
2200
|
startToken,
|
|
@@ -2138,16 +2211,16 @@ class Parser {
|
|
|
2138
2211
|
parseThrowStatement() {
|
|
2139
2212
|
const startToken = this._lexer.peek();
|
|
2140
2213
|
this._lexer.get();
|
|
2141
|
-
let
|
|
2142
|
-
|
|
2143
|
-
if (
|
|
2214
|
+
let expr;
|
|
2215
|
+
expr = this.getExpression();
|
|
2216
|
+
if (expr === null) return null;
|
|
2144
2217
|
return this.createStatementNode(
|
|
2145
|
-
|
|
2218
|
+
T_THROW_STATEMENT,
|
|
2146
2219
|
{
|
|
2147
|
-
|
|
2220
|
+
expr
|
|
2148
2221
|
},
|
|
2149
2222
|
startToken,
|
|
2150
|
-
|
|
2223
|
+
expr.endToken
|
|
2151
2224
|
);
|
|
2152
2225
|
}
|
|
2153
2226
|
/**
|
|
@@ -2169,10 +2242,10 @@ class Parser {
|
|
|
2169
2242
|
const startToken = this._lexer.peek();
|
|
2170
2243
|
let endToken = this._lexer.get();
|
|
2171
2244
|
const parser = this;
|
|
2172
|
-
const
|
|
2173
|
-
let
|
|
2174
|
-
let
|
|
2175
|
-
let
|
|
2245
|
+
const tryB = getBlock();
|
|
2246
|
+
let catchB;
|
|
2247
|
+
let catchV;
|
|
2248
|
+
let finallyB;
|
|
2176
2249
|
let nextToken = this._lexer.peek();
|
|
2177
2250
|
if (nextToken.type === TokenType.Catch) {
|
|
2178
2251
|
this._lexer.get();
|
|
@@ -2184,32 +2257,38 @@ class Parser {
|
|
|
2184
2257
|
this.reportError("W003", nextToken);
|
|
2185
2258
|
return null;
|
|
2186
2259
|
}
|
|
2187
|
-
|
|
2260
|
+
catchV = {
|
|
2261
|
+
type: T_IDENTIFIER,
|
|
2262
|
+
nodeId: createXmlUiTreeNodeId(),
|
|
2263
|
+
name: nextToken.text,
|
|
2264
|
+
startToken: nextToken,
|
|
2265
|
+
endToken: nextToken
|
|
2266
|
+
};
|
|
2188
2267
|
this._lexer.get();
|
|
2189
2268
|
this.expectToken(TokenType.RParent, "W006");
|
|
2190
2269
|
}
|
|
2191
|
-
|
|
2192
|
-
endToken =
|
|
2270
|
+
catchB = getBlock();
|
|
2271
|
+
endToken = catchB.endToken;
|
|
2193
2272
|
if (this._lexer.peek().type === TokenType.Finally) {
|
|
2194
2273
|
this._lexer.get();
|
|
2195
|
-
|
|
2196
|
-
endToken =
|
|
2274
|
+
finallyB = getBlock();
|
|
2275
|
+
endToken = finallyB.endToken;
|
|
2197
2276
|
}
|
|
2198
2277
|
} else if (nextToken.type === TokenType.Finally) {
|
|
2199
2278
|
this._lexer.get();
|
|
2200
|
-
|
|
2201
|
-
endToken =
|
|
2279
|
+
finallyB = getBlock();
|
|
2280
|
+
endToken = finallyB.endToken;
|
|
2202
2281
|
} else {
|
|
2203
2282
|
this.reportError("W013", nextToken);
|
|
2204
2283
|
return null;
|
|
2205
2284
|
}
|
|
2206
2285
|
return this.createStatementNode(
|
|
2207
|
-
|
|
2286
|
+
T_TRY_STATEMENT,
|
|
2208
2287
|
{
|
|
2209
|
-
|
|
2210
|
-
|
|
2211
|
-
|
|
2212
|
-
|
|
2288
|
+
tryB,
|
|
2289
|
+
catchB,
|
|
2290
|
+
catchV,
|
|
2291
|
+
finallyB
|
|
2213
2292
|
},
|
|
2214
2293
|
startToken,
|
|
2215
2294
|
endToken
|
|
@@ -2238,19 +2317,19 @@ class Parser {
|
|
|
2238
2317
|
parseSwitchStatement() {
|
|
2239
2318
|
const startToken = this._lexer.get();
|
|
2240
2319
|
this.expectToken(TokenType.LParent, "W014");
|
|
2241
|
-
const
|
|
2242
|
-
if (!
|
|
2320
|
+
const expr = this.getExpression();
|
|
2321
|
+
if (!expr) return null;
|
|
2243
2322
|
this.expectToken(TokenType.RParent, "W006");
|
|
2244
2323
|
this.expectToken(TokenType.LBrace, "W012");
|
|
2245
2324
|
const cases = [];
|
|
2246
2325
|
let defaultCaseFound = false;
|
|
2247
2326
|
while (true) {
|
|
2248
2327
|
let nextToken = this._lexer.peek();
|
|
2249
|
-
let
|
|
2328
|
+
let caseE;
|
|
2250
2329
|
if (nextToken.type === TokenType.Case) {
|
|
2251
2330
|
this._lexer.get();
|
|
2252
|
-
|
|
2253
|
-
if (!
|
|
2331
|
+
caseE = this.getExpression();
|
|
2332
|
+
if (!caseE) return null;
|
|
2254
2333
|
} else if (nextToken.type === TokenType.Default) {
|
|
2255
2334
|
if (defaultCaseFound) {
|
|
2256
2335
|
this.reportError("W016");
|
|
@@ -2265,7 +2344,7 @@ class Parser {
|
|
|
2265
2344
|
return null;
|
|
2266
2345
|
}
|
|
2267
2346
|
this.expectToken(TokenType.Colon, "W008");
|
|
2268
|
-
let
|
|
2347
|
+
let stmts = [];
|
|
2269
2348
|
let collected = false;
|
|
2270
2349
|
while (!collected) {
|
|
2271
2350
|
const stmtToken = this._lexer.peek();
|
|
@@ -2281,18 +2360,18 @@ class Parser {
|
|
|
2281
2360
|
collected = true;
|
|
2282
2361
|
break;
|
|
2283
2362
|
}
|
|
2284
|
-
|
|
2285
|
-
if (stmt.type !==
|
|
2363
|
+
stmts.push(stmt);
|
|
2364
|
+
if (stmt.type !== T_EMPTY_STATEMENT) {
|
|
2286
2365
|
this.skipToken(TokenType.Semicolon);
|
|
2287
2366
|
}
|
|
2288
2367
|
}
|
|
2289
2368
|
}
|
|
2290
2369
|
cases.push(
|
|
2291
2370
|
this.createNode(
|
|
2292
|
-
|
|
2371
|
+
T_SWITCH_CASE,
|
|
2293
2372
|
{
|
|
2294
|
-
|
|
2295
|
-
|
|
2373
|
+
caseE,
|
|
2374
|
+
stmts
|
|
2296
2375
|
},
|
|
2297
2376
|
startToken
|
|
2298
2377
|
)
|
|
@@ -2301,9 +2380,9 @@ class Parser {
|
|
|
2301
2380
|
const endToken = this._lexer.peek();
|
|
2302
2381
|
this.expectToken(TokenType.RBrace, "W004");
|
|
2303
2382
|
return this.createStatementNode(
|
|
2304
|
-
|
|
2383
|
+
T_SWITCH_STATEMENT,
|
|
2305
2384
|
{
|
|
2306
|
-
|
|
2385
|
+
expr,
|
|
2307
2386
|
cases
|
|
2308
2387
|
},
|
|
2309
2388
|
startToken,
|
|
@@ -2347,28 +2426,28 @@ class Parser {
|
|
|
2347
2426
|
let isValid;
|
|
2348
2427
|
const args = [];
|
|
2349
2428
|
switch (exprList.type) {
|
|
2350
|
-
case
|
|
2429
|
+
case T_NO_ARG_EXPRESSION:
|
|
2351
2430
|
isValid = true;
|
|
2352
2431
|
break;
|
|
2353
|
-
case
|
|
2432
|
+
case T_IDENTIFIER:
|
|
2354
2433
|
isValid = (exprList.parenthesized ?? 0) <= 1;
|
|
2355
2434
|
args.push(exprList);
|
|
2356
2435
|
break;
|
|
2357
|
-
case
|
|
2436
|
+
case T_SEQUENCE_EXPRESSION:
|
|
2358
2437
|
isValid = exprList.parenthesized === 1;
|
|
2359
2438
|
let spreadFound = false;
|
|
2360
2439
|
if (isValid) {
|
|
2361
|
-
for (const expr of exprList.
|
|
2440
|
+
for (const expr of exprList.exprs) {
|
|
2362
2441
|
if (spreadFound) {
|
|
2363
2442
|
isValid = false;
|
|
2364
2443
|
break;
|
|
2365
2444
|
}
|
|
2366
2445
|
switch (expr.type) {
|
|
2367
|
-
case
|
|
2446
|
+
case T_IDENTIFIER:
|
|
2368
2447
|
isValid = !expr.parenthesized;
|
|
2369
2448
|
args.push(expr);
|
|
2370
2449
|
break;
|
|
2371
|
-
case
|
|
2450
|
+
case T_OBJECT_LITERAL: {
|
|
2372
2451
|
isValid = !expr.parenthesized;
|
|
2373
2452
|
if (isValid) {
|
|
2374
2453
|
const des = this.convertToObjectDestructure(expr);
|
|
@@ -2376,7 +2455,7 @@ class Parser {
|
|
|
2376
2455
|
}
|
|
2377
2456
|
break;
|
|
2378
2457
|
}
|
|
2379
|
-
case
|
|
2458
|
+
case T_ARRAY_LITERAL: {
|
|
2380
2459
|
isValid = !expr.parenthesized;
|
|
2381
2460
|
if (isValid) {
|
|
2382
2461
|
const des = this.convertToArrayDestructure(expr);
|
|
@@ -2384,9 +2463,9 @@ class Parser {
|
|
|
2384
2463
|
}
|
|
2385
2464
|
break;
|
|
2386
2465
|
}
|
|
2387
|
-
case
|
|
2466
|
+
case T_SPREAD_EXPRESSION: {
|
|
2388
2467
|
spreadFound = true;
|
|
2389
|
-
if (expr.
|
|
2468
|
+
if (expr.expr.type !== T_IDENTIFIER) {
|
|
2390
2469
|
isValid = false;
|
|
2391
2470
|
break;
|
|
2392
2471
|
}
|
|
@@ -2400,22 +2479,22 @@ class Parser {
|
|
|
2400
2479
|
}
|
|
2401
2480
|
}
|
|
2402
2481
|
break;
|
|
2403
|
-
case
|
|
2482
|
+
case T_OBJECT_LITERAL:
|
|
2404
2483
|
isValid = exprList.parenthesized === 1;
|
|
2405
2484
|
if (isValid) {
|
|
2406
2485
|
const des = this.convertToObjectDestructure(exprList);
|
|
2407
2486
|
if (des) args.push(des);
|
|
2408
2487
|
}
|
|
2409
2488
|
break;
|
|
2410
|
-
case
|
|
2489
|
+
case T_ARRAY_LITERAL:
|
|
2411
2490
|
isValid = exprList.parenthesized === 1;
|
|
2412
2491
|
if (isValid) {
|
|
2413
2492
|
const des = this.convertToArrayDestructure(exprList);
|
|
2414
2493
|
if (des) args.push(des);
|
|
2415
2494
|
}
|
|
2416
2495
|
break;
|
|
2417
|
-
case
|
|
2418
|
-
if (exprList.
|
|
2496
|
+
case T_SPREAD_EXPRESSION:
|
|
2497
|
+
if (exprList.expr.type !== T_IDENTIFIER) {
|
|
2419
2498
|
isValid = false;
|
|
2420
2499
|
break;
|
|
2421
2500
|
}
|
|
@@ -2433,114 +2512,17 @@ class Parser {
|
|
|
2433
2512
|
this.reportError("W012", this._lexer.peek());
|
|
2434
2513
|
return null;
|
|
2435
2514
|
}
|
|
2436
|
-
const
|
|
2437
|
-
if (!
|
|
2515
|
+
const stmt = this.parseBlockStatement();
|
|
2516
|
+
if (!stmt) return null;
|
|
2438
2517
|
return this.createStatementNode(
|
|
2439
|
-
|
|
2518
|
+
T_FUNCTION_DECLARATION,
|
|
2440
2519
|
{
|
|
2441
|
-
name: functionName,
|
|
2520
|
+
id: { type: T_IDENTIFIER, name: functionName },
|
|
2442
2521
|
args,
|
|
2443
|
-
|
|
2444
|
-
},
|
|
2445
|
-
startToken,
|
|
2446
|
-
body.endToken
|
|
2447
|
-
);
|
|
2448
|
-
}
|
|
2449
|
-
/**
|
|
2450
|
-
* Parses an export statement
|
|
2451
|
-
*
|
|
2452
|
-
* exportStatement
|
|
2453
|
-
* : "export" (constStatement | functionDeclaration)
|
|
2454
|
-
* ;
|
|
2455
|
-
*/
|
|
2456
|
-
parseExport() {
|
|
2457
|
-
this._lexer.get();
|
|
2458
|
-
const nextToken = this._lexer.peek();
|
|
2459
|
-
if (nextToken.type === TokenType.Const) {
|
|
2460
|
-
if (this._statementLevel > 1) {
|
|
2461
|
-
this.reportError("W030", nextToken);
|
|
2462
|
-
return null;
|
|
2463
|
-
}
|
|
2464
|
-
const constStmt = this.parseConstStatement();
|
|
2465
|
-
return constStmt === null ? null : { ...constStmt, isExported: true };
|
|
2466
|
-
} else if (nextToken.type === TokenType.Function) {
|
|
2467
|
-
if (this._statementLevel > 1) {
|
|
2468
|
-
this.reportError("W030", nextToken);
|
|
2469
|
-
return null;
|
|
2470
|
-
}
|
|
2471
|
-
const funcDecl = this.parseFunctionDeclaration();
|
|
2472
|
-
return funcDecl === null ? null : { ...funcDecl, isExported: true };
|
|
2473
|
-
}
|
|
2474
|
-
this.reportError("W024", nextToken);
|
|
2475
|
-
return null;
|
|
2476
|
-
}
|
|
2477
|
-
/**
|
|
2478
|
-
* Parse an import declaration
|
|
2479
|
-
*
|
|
2480
|
-
* importDeclaration
|
|
2481
|
-
* : "import" "{" importItem ("," importItem)* [ "," ] "}" from module
|
|
2482
|
-
* ;
|
|
2483
|
-
*
|
|
2484
|
-
* importItem
|
|
2485
|
-
* : identifier [ "as" identifier ]
|
|
2486
|
-
* ;
|
|
2487
|
-
*/
|
|
2488
|
-
parseImport() {
|
|
2489
|
-
const startToken = this._lexer.get();
|
|
2490
|
-
this.expectToken(TokenType.LBrace, "W012");
|
|
2491
|
-
const imports = {};
|
|
2492
|
-
let nextToken = this._lexer.peek();
|
|
2493
|
-
while (nextToken.type !== TokenType.RBrace) {
|
|
2494
|
-
if (nextToken.type !== TokenType.Identifier) {
|
|
2495
|
-
this.reportError("W003", nextToken);
|
|
2496
|
-
return null;
|
|
2497
|
-
}
|
|
2498
|
-
const id = nextToken.text;
|
|
2499
|
-
this._lexer.get();
|
|
2500
|
-
nextToken = this._lexer.peek();
|
|
2501
|
-
if (nextToken.type === TokenType.As) {
|
|
2502
|
-
this._lexer.get();
|
|
2503
|
-
nextToken = this._lexer.peek();
|
|
2504
|
-
if (nextToken.type !== TokenType.Identifier) {
|
|
2505
|
-
this.reportError("W003", nextToken);
|
|
2506
|
-
return null;
|
|
2507
|
-
}
|
|
2508
|
-
if (imports[nextToken.text]) {
|
|
2509
|
-
this.reportError("W019", nextToken, nextToken.text);
|
|
2510
|
-
return null;
|
|
2511
|
-
}
|
|
2512
|
-
imports[nextToken.text] = id;
|
|
2513
|
-
this._lexer.get();
|
|
2514
|
-
} else {
|
|
2515
|
-
if (imports[id]) {
|
|
2516
|
-
this.reportError("W019", nextToken, id);
|
|
2517
|
-
return null;
|
|
2518
|
-
}
|
|
2519
|
-
imports[id] = id;
|
|
2520
|
-
}
|
|
2521
|
-
nextToken = this._lexer.peek();
|
|
2522
|
-
if (nextToken.type === TokenType.Comma) {
|
|
2523
|
-
this._lexer.get();
|
|
2524
|
-
nextToken = this._lexer.peek();
|
|
2525
|
-
}
|
|
2526
|
-
}
|
|
2527
|
-
this._lexer.get();
|
|
2528
|
-
this.expectToken(TokenType.From, "W025");
|
|
2529
|
-
const moduleToken = this._lexer.peek();
|
|
2530
|
-
if (moduleToken.type !== TokenType.StringLiteral) {
|
|
2531
|
-
this.reportError("W026", moduleToken);
|
|
2532
|
-
return null;
|
|
2533
|
-
}
|
|
2534
|
-
this._lexer.get();
|
|
2535
|
-
const literal = this.parseStringLiteral(moduleToken);
|
|
2536
|
-
return this.createStatementNode(
|
|
2537
|
-
"ImportD",
|
|
2538
|
-
{
|
|
2539
|
-
imports,
|
|
2540
|
-
moduleFile: literal.value
|
|
2522
|
+
stmt
|
|
2541
2523
|
},
|
|
2542
2524
|
startToken,
|
|
2543
|
-
|
|
2525
|
+
stmt.endToken
|
|
2544
2526
|
);
|
|
2545
2527
|
}
|
|
2546
2528
|
// ==========================================================================
|
|
@@ -2567,16 +2549,16 @@ class Parser {
|
|
|
2567
2549
|
return null;
|
|
2568
2550
|
}
|
|
2569
2551
|
endToken = leftExpr.endToken;
|
|
2570
|
-
const
|
|
2552
|
+
const exprs = [];
|
|
2571
2553
|
let loose = false;
|
|
2572
2554
|
if (this._lexer.peek().type === TokenType.Comma) {
|
|
2573
|
-
|
|
2555
|
+
exprs.push(leftExpr);
|
|
2574
2556
|
while (this.skipToken(TokenType.Comma)) {
|
|
2575
2557
|
if (this._lexer.peek().type === TokenType.Comma) {
|
|
2576
2558
|
loose = true;
|
|
2577
2559
|
endToken = this._lexer.peek();
|
|
2578
|
-
|
|
2579
|
-
this.createExpressionNode(
|
|
2560
|
+
exprs.push(
|
|
2561
|
+
this.createExpressionNode(T_NO_ARG_EXPRESSION, {}, endToken, endToken)
|
|
2580
2562
|
);
|
|
2581
2563
|
} else {
|
|
2582
2564
|
const nextExpr = this.parseCondOrSpreadOrAsgnOrArrowExpr();
|
|
@@ -2584,17 +2566,17 @@ class Parser {
|
|
|
2584
2566
|
break;
|
|
2585
2567
|
}
|
|
2586
2568
|
endToken = nextExpr.endToken;
|
|
2587
|
-
|
|
2569
|
+
exprs.push(nextExpr);
|
|
2588
2570
|
}
|
|
2589
2571
|
}
|
|
2590
2572
|
}
|
|
2591
|
-
if (!
|
|
2573
|
+
if (!exprs.length) {
|
|
2592
2574
|
return leftExpr;
|
|
2593
2575
|
}
|
|
2594
2576
|
leftExpr = this.createExpressionNode(
|
|
2595
|
-
|
|
2577
|
+
T_SEQUENCE_EXPRESSION,
|
|
2596
2578
|
{
|
|
2597
|
-
|
|
2579
|
+
exprs,
|
|
2598
2580
|
loose
|
|
2599
2581
|
},
|
|
2600
2582
|
start,
|
|
@@ -2618,9 +2600,9 @@ class Parser {
|
|
|
2618
2600
|
this._lexer.get();
|
|
2619
2601
|
const spreadOperand = this.parseNullCoalescingExpr();
|
|
2620
2602
|
return spreadOperand ? this.createExpressionNode(
|
|
2621
|
-
|
|
2603
|
+
T_SPREAD_EXPRESSION,
|
|
2622
2604
|
{
|
|
2623
|
-
|
|
2605
|
+
expr: spreadOperand
|
|
2624
2606
|
},
|
|
2625
2607
|
startToken,
|
|
2626
2608
|
spreadOperand.endToken
|
|
@@ -2629,11 +2611,11 @@ class Parser {
|
|
|
2629
2611
|
if (startToken.type === TokenType.Function) {
|
|
2630
2612
|
const funcDecl = this.parseFunctionDeclaration(true);
|
|
2631
2613
|
return funcDecl ? this.createExpressionNode(
|
|
2632
|
-
|
|
2614
|
+
T_ARROW_EXPRESSION,
|
|
2633
2615
|
{
|
|
2634
|
-
name: funcDecl.name,
|
|
2616
|
+
name: funcDecl.id.name,
|
|
2635
2617
|
args: funcDecl.args,
|
|
2636
|
-
statement: funcDecl.
|
|
2618
|
+
statement: funcDecl.stmt
|
|
2637
2619
|
},
|
|
2638
2620
|
startToken,
|
|
2639
2621
|
funcDecl.endToken
|
|
@@ -2653,11 +2635,11 @@ class Parser {
|
|
|
2653
2635
|
this.expectToken(TokenType.Colon);
|
|
2654
2636
|
const falseExpr = this.getExpression(false);
|
|
2655
2637
|
return this.createExpressionNode(
|
|
2656
|
-
|
|
2638
|
+
T_CONDITIONAL_EXPRESSION,
|
|
2657
2639
|
{
|
|
2658
|
-
|
|
2659
|
-
|
|
2660
|
-
|
|
2640
|
+
cond: otherExpr,
|
|
2641
|
+
thenE: trueExpr,
|
|
2642
|
+
elseE: falseExpr
|
|
2661
2643
|
},
|
|
2662
2644
|
startToken,
|
|
2663
2645
|
falseExpr.endToken
|
|
@@ -2665,16 +2647,16 @@ class Parser {
|
|
|
2665
2647
|
}
|
|
2666
2648
|
if (tokenTraits[nextToken.type].isAssignment) {
|
|
2667
2649
|
this._lexer.get();
|
|
2668
|
-
const
|
|
2669
|
-
return
|
|
2670
|
-
|
|
2650
|
+
const expr = this.getExpression();
|
|
2651
|
+
return expr ? this.createExpressionNode(
|
|
2652
|
+
T_ASSIGNMENT_EXPRESSION,
|
|
2671
2653
|
{
|
|
2672
2654
|
leftValue: otherExpr,
|
|
2673
|
-
|
|
2674
|
-
|
|
2655
|
+
op: nextToken.text,
|
|
2656
|
+
expr
|
|
2675
2657
|
},
|
|
2676
2658
|
startToken,
|
|
2677
|
-
|
|
2659
|
+
expr.endToken
|
|
2678
2660
|
) : null;
|
|
2679
2661
|
}
|
|
2680
2662
|
return otherExpr;
|
|
@@ -2688,28 +2670,28 @@ class Parser {
|
|
|
2688
2670
|
let isValid;
|
|
2689
2671
|
const args = [];
|
|
2690
2672
|
switch (left.type) {
|
|
2691
|
-
case
|
|
2673
|
+
case T_NO_ARG_EXPRESSION:
|
|
2692
2674
|
isValid = true;
|
|
2693
2675
|
break;
|
|
2694
|
-
case
|
|
2676
|
+
case T_IDENTIFIER:
|
|
2695
2677
|
isValid = (left.parenthesized ?? 0) <= 1;
|
|
2696
2678
|
args.push(left);
|
|
2697
2679
|
break;
|
|
2698
|
-
case
|
|
2680
|
+
case T_SEQUENCE_EXPRESSION:
|
|
2699
2681
|
isValid = left.parenthesized === 1;
|
|
2700
2682
|
let spreadFound = false;
|
|
2701
2683
|
if (isValid) {
|
|
2702
|
-
for (const expr of left.
|
|
2684
|
+
for (const expr of left.exprs) {
|
|
2703
2685
|
if (spreadFound) {
|
|
2704
2686
|
isValid = false;
|
|
2705
2687
|
break;
|
|
2706
2688
|
}
|
|
2707
2689
|
switch (expr.type) {
|
|
2708
|
-
case
|
|
2690
|
+
case T_IDENTIFIER:
|
|
2709
2691
|
isValid = !expr.parenthesized;
|
|
2710
2692
|
args.push(expr);
|
|
2711
2693
|
break;
|
|
2712
|
-
case
|
|
2694
|
+
case T_OBJECT_LITERAL: {
|
|
2713
2695
|
isValid = !expr.parenthesized;
|
|
2714
2696
|
if (isValid) {
|
|
2715
2697
|
const des = this.convertToObjectDestructure(expr);
|
|
@@ -2717,7 +2699,7 @@ class Parser {
|
|
|
2717
2699
|
}
|
|
2718
2700
|
break;
|
|
2719
2701
|
}
|
|
2720
|
-
case
|
|
2702
|
+
case T_ARRAY_LITERAL: {
|
|
2721
2703
|
isValid = !expr.parenthesized;
|
|
2722
2704
|
if (isValid) {
|
|
2723
2705
|
const des = this.convertToArrayDestructure(expr);
|
|
@@ -2725,9 +2707,9 @@ class Parser {
|
|
|
2725
2707
|
}
|
|
2726
2708
|
break;
|
|
2727
2709
|
}
|
|
2728
|
-
case
|
|
2710
|
+
case T_SPREAD_EXPRESSION: {
|
|
2729
2711
|
spreadFound = true;
|
|
2730
|
-
if (expr.
|
|
2712
|
+
if (expr.expr.type !== T_IDENTIFIER) {
|
|
2731
2713
|
isValid = false;
|
|
2732
2714
|
break;
|
|
2733
2715
|
}
|
|
@@ -2741,22 +2723,22 @@ class Parser {
|
|
|
2741
2723
|
}
|
|
2742
2724
|
}
|
|
2743
2725
|
break;
|
|
2744
|
-
case
|
|
2726
|
+
case T_OBJECT_LITERAL:
|
|
2745
2727
|
isValid = left.parenthesized === 1;
|
|
2746
2728
|
if (isValid) {
|
|
2747
2729
|
const des = this.convertToObjectDestructure(left);
|
|
2748
2730
|
if (des) args.push(des);
|
|
2749
2731
|
}
|
|
2750
2732
|
break;
|
|
2751
|
-
case
|
|
2733
|
+
case T_ARRAY_LITERAL:
|
|
2752
2734
|
isValid = left.parenthesized === 1;
|
|
2753
2735
|
if (isValid) {
|
|
2754
2736
|
const des = this.convertToArrayDestructure(left);
|
|
2755
2737
|
if (des) args.push(des);
|
|
2756
2738
|
}
|
|
2757
2739
|
break;
|
|
2758
|
-
case
|
|
2759
|
-
isValid = left.
|
|
2740
|
+
case T_SPREAD_EXPRESSION:
|
|
2741
|
+
isValid = left.expr.type === T_IDENTIFIER;
|
|
2760
2742
|
if (isValid) {
|
|
2761
2743
|
args.push(left);
|
|
2762
2744
|
}
|
|
@@ -2771,7 +2753,7 @@ class Parser {
|
|
|
2771
2753
|
this._lexer.get();
|
|
2772
2754
|
const statement = this.parseStatement(false);
|
|
2773
2755
|
return statement ? this.createExpressionNode(
|
|
2774
|
-
|
|
2756
|
+
T_ARROW_EXPRESSION,
|
|
2775
2757
|
{
|
|
2776
2758
|
args,
|
|
2777
2759
|
statement
|
|
@@ -2799,9 +2781,9 @@ class Parser {
|
|
|
2799
2781
|
}
|
|
2800
2782
|
let endToken = rightExpr.endToken;
|
|
2801
2783
|
leftExpr = this.createExpressionNode(
|
|
2802
|
-
|
|
2784
|
+
T_BINARY_EXPRESSION,
|
|
2803
2785
|
{
|
|
2804
|
-
|
|
2786
|
+
op: "??",
|
|
2805
2787
|
left: leftExpr,
|
|
2806
2788
|
right: rightExpr
|
|
2807
2789
|
},
|
|
@@ -2830,9 +2812,9 @@ class Parser {
|
|
|
2830
2812
|
}
|
|
2831
2813
|
let endToken = rightExpr.endToken;
|
|
2832
2814
|
leftExpr = this.createExpressionNode(
|
|
2833
|
-
|
|
2815
|
+
T_BINARY_EXPRESSION,
|
|
2834
2816
|
{
|
|
2835
|
-
|
|
2817
|
+
op: "||",
|
|
2836
2818
|
left: leftExpr,
|
|
2837
2819
|
right: rightExpr
|
|
2838
2820
|
},
|
|
@@ -2861,9 +2843,9 @@ class Parser {
|
|
|
2861
2843
|
}
|
|
2862
2844
|
let endToken = rightExpr.endToken;
|
|
2863
2845
|
leftExpr = this.createExpressionNode(
|
|
2864
|
-
|
|
2846
|
+
T_BINARY_EXPRESSION,
|
|
2865
2847
|
{
|
|
2866
|
-
|
|
2848
|
+
op: "&&",
|
|
2867
2849
|
left: leftExpr,
|
|
2868
2850
|
right: rightExpr
|
|
2869
2851
|
},
|
|
@@ -2892,9 +2874,9 @@ class Parser {
|
|
|
2892
2874
|
}
|
|
2893
2875
|
let endToken = rightExpr.endToken;
|
|
2894
2876
|
leftExpr = this.createExpressionNode(
|
|
2895
|
-
|
|
2877
|
+
T_BINARY_EXPRESSION,
|
|
2896
2878
|
{
|
|
2897
|
-
|
|
2879
|
+
op: "|",
|
|
2898
2880
|
left: leftExpr,
|
|
2899
2881
|
right: rightExpr
|
|
2900
2882
|
},
|
|
@@ -2923,9 +2905,9 @@ class Parser {
|
|
|
2923
2905
|
}
|
|
2924
2906
|
let endToken = rightExpr.endToken;
|
|
2925
2907
|
leftExpr = this.createExpressionNode(
|
|
2926
|
-
|
|
2908
|
+
T_BINARY_EXPRESSION,
|
|
2927
2909
|
{
|
|
2928
|
-
|
|
2910
|
+
op: "^",
|
|
2929
2911
|
left: leftExpr,
|
|
2930
2912
|
right: rightExpr
|
|
2931
2913
|
},
|
|
@@ -2954,9 +2936,9 @@ class Parser {
|
|
|
2954
2936
|
}
|
|
2955
2937
|
let endToken = rightExpr.endToken;
|
|
2956
2938
|
leftExpr = this.createExpressionNode(
|
|
2957
|
-
|
|
2939
|
+
T_BINARY_EXPRESSION,
|
|
2958
2940
|
{
|
|
2959
|
-
|
|
2941
|
+
op: "&",
|
|
2960
2942
|
left: leftExpr,
|
|
2961
2943
|
right: rightExpr
|
|
2962
2944
|
},
|
|
@@ -2991,10 +2973,9 @@ class Parser {
|
|
|
2991
2973
|
}
|
|
2992
2974
|
let endToken = rightExpr.endToken;
|
|
2993
2975
|
leftExpr = this.createExpressionNode(
|
|
2994
|
-
|
|
2976
|
+
T_BINARY_EXPRESSION,
|
|
2995
2977
|
{
|
|
2996
|
-
|
|
2997
|
-
operator: opType.text,
|
|
2978
|
+
op: opType.text,
|
|
2998
2979
|
left: leftExpr,
|
|
2999
2980
|
right: rightExpr
|
|
3000
2981
|
},
|
|
@@ -3030,9 +3011,9 @@ class Parser {
|
|
|
3030
3011
|
}
|
|
3031
3012
|
let endToken = rightExpr.endToken;
|
|
3032
3013
|
leftExpr = this.createExpressionNode(
|
|
3033
|
-
|
|
3014
|
+
T_BINARY_EXPRESSION,
|
|
3034
3015
|
{
|
|
3035
|
-
|
|
3016
|
+
op: opType.text,
|
|
3036
3017
|
left: leftExpr,
|
|
3037
3018
|
right: rightExpr
|
|
3038
3019
|
},
|
|
@@ -3066,9 +3047,9 @@ class Parser {
|
|
|
3066
3047
|
}
|
|
3067
3048
|
let endToken = rightExpr.endToken;
|
|
3068
3049
|
leftExpr = this.createExpressionNode(
|
|
3069
|
-
|
|
3050
|
+
T_BINARY_EXPRESSION,
|
|
3070
3051
|
{
|
|
3071
|
-
|
|
3052
|
+
op: opType.text,
|
|
3072
3053
|
left: leftExpr,
|
|
3073
3054
|
right: rightExpr
|
|
3074
3055
|
},
|
|
@@ -3098,9 +3079,9 @@ class Parser {
|
|
|
3098
3079
|
}
|
|
3099
3080
|
let endToken = rightExpr.endToken;
|
|
3100
3081
|
leftExpr = this.createExpressionNode(
|
|
3101
|
-
|
|
3082
|
+
T_BINARY_EXPRESSION,
|
|
3102
3083
|
{
|
|
3103
|
-
|
|
3084
|
+
op: opType.text,
|
|
3104
3085
|
left: leftExpr,
|
|
3105
3086
|
right: rightExpr
|
|
3106
3087
|
},
|
|
@@ -3130,9 +3111,9 @@ class Parser {
|
|
|
3130
3111
|
}
|
|
3131
3112
|
let endToken = rightExpr.endToken;
|
|
3132
3113
|
leftExpr = this.createExpressionNode(
|
|
3133
|
-
|
|
3114
|
+
T_BINARY_EXPRESSION,
|
|
3134
3115
|
{
|
|
3135
|
-
|
|
3116
|
+
op: opType.text,
|
|
3136
3117
|
left: leftExpr,
|
|
3137
3118
|
right: rightExpr
|
|
3138
3119
|
},
|
|
@@ -3164,9 +3145,9 @@ class Parser {
|
|
|
3164
3145
|
let endToken = rightExpr.endToken;
|
|
3165
3146
|
if (count === 0) {
|
|
3166
3147
|
leftExpr = this.createExpressionNode(
|
|
3167
|
-
|
|
3148
|
+
T_BINARY_EXPRESSION,
|
|
3168
3149
|
{
|
|
3169
|
-
|
|
3150
|
+
op: opType.text,
|
|
3170
3151
|
left: leftExpr,
|
|
3171
3152
|
right: rightExpr
|
|
3172
3153
|
},
|
|
@@ -3176,13 +3157,13 @@ class Parser {
|
|
|
3176
3157
|
} else {
|
|
3177
3158
|
const prevLeft = leftExpr;
|
|
3178
3159
|
leftExpr = this.createExpressionNode(
|
|
3179
|
-
|
|
3160
|
+
T_BINARY_EXPRESSION,
|
|
3180
3161
|
{
|
|
3181
|
-
|
|
3162
|
+
op: opType.text,
|
|
3182
3163
|
left: prevLeft.left,
|
|
3183
3164
|
right: {
|
|
3184
|
-
type:
|
|
3185
|
-
|
|
3165
|
+
type: T_BINARY_EXPRESSION,
|
|
3166
|
+
op: opType.text,
|
|
3186
3167
|
left: prevLeft.right,
|
|
3187
3168
|
right: rightExpr
|
|
3188
3169
|
}
|
|
@@ -3210,10 +3191,10 @@ class Parser {
|
|
|
3210
3191
|
return null;
|
|
3211
3192
|
}
|
|
3212
3193
|
return this.createExpressionNode(
|
|
3213
|
-
|
|
3194
|
+
T_UNARY_EXPRESSION,
|
|
3214
3195
|
{
|
|
3215
|
-
|
|
3216
|
-
|
|
3196
|
+
op: startToken.text,
|
|
3197
|
+
expr: unaryOperand
|
|
3217
3198
|
},
|
|
3218
3199
|
startToken,
|
|
3219
3200
|
unaryOperand.endToken
|
|
@@ -3226,10 +3207,10 @@ class Parser {
|
|
|
3226
3207
|
return null;
|
|
3227
3208
|
}
|
|
3228
3209
|
return this.createExpressionNode(
|
|
3229
|
-
|
|
3210
|
+
T_PREFIX_OP_EXPRESSION,
|
|
3230
3211
|
{
|
|
3231
|
-
|
|
3232
|
-
|
|
3212
|
+
op: startToken.text,
|
|
3213
|
+
expr: prefixOperand
|
|
3233
3214
|
},
|
|
3234
3215
|
startToken,
|
|
3235
3216
|
prefixOperand.endToken
|
|
@@ -3264,14 +3245,14 @@ class Parser {
|
|
|
3264
3245
|
this.reportError("W001");
|
|
3265
3246
|
return null;
|
|
3266
3247
|
}
|
|
3267
|
-
args = expr.type ===
|
|
3248
|
+
args = expr.type === T_SEQUENCE_EXPRESSION ? expr.exprs : [expr];
|
|
3268
3249
|
}
|
|
3269
3250
|
const endToken2 = this._lexer.peek();
|
|
3270
3251
|
this.expectToken(TokenType.RParent, "W006");
|
|
3271
3252
|
primary = this.createExpressionNode(
|
|
3272
|
-
|
|
3253
|
+
T_FUNCTION_INVOCATION_EXPRESSION,
|
|
3273
3254
|
{
|
|
3274
|
-
|
|
3255
|
+
obj: primary,
|
|
3275
3256
|
arguments: args
|
|
3276
3257
|
},
|
|
3277
3258
|
startToken,
|
|
@@ -3289,11 +3270,11 @@ class Parser {
|
|
|
3289
3270
|
return null;
|
|
3290
3271
|
}
|
|
3291
3272
|
primary = this.createExpressionNode(
|
|
3292
|
-
|
|
3273
|
+
T_MEMBER_ACCESS_EXPRESSION,
|
|
3293
3274
|
{
|
|
3294
|
-
|
|
3275
|
+
obj: primary,
|
|
3295
3276
|
member: member.text,
|
|
3296
|
-
|
|
3277
|
+
opt: currentStart.type === TokenType.OptionalChaining
|
|
3297
3278
|
},
|
|
3298
3279
|
startToken,
|
|
3299
3280
|
member
|
|
@@ -3308,9 +3289,9 @@ class Parser {
|
|
|
3308
3289
|
const endToken = this._lexer.peek();
|
|
3309
3290
|
this.expectToken(TokenType.RSquare, "W005");
|
|
3310
3291
|
primary = this.createExpressionNode(
|
|
3311
|
-
|
|
3292
|
+
T_CALCULATED_MEMBER_ACCESS_EXPRESSION,
|
|
3312
3293
|
{
|
|
3313
|
-
|
|
3294
|
+
obj: primary,
|
|
3314
3295
|
member: memberExpr
|
|
3315
3296
|
},
|
|
3316
3297
|
startToken,
|
|
@@ -3326,10 +3307,10 @@ class Parser {
|
|
|
3326
3307
|
if (nextToken.type === TokenType.IncOp || nextToken.type === TokenType.DecOp) {
|
|
3327
3308
|
this._lexer.get();
|
|
3328
3309
|
return this.createExpressionNode(
|
|
3329
|
-
|
|
3310
|
+
T_POSTFIX_OP_EXPRESSION,
|
|
3330
3311
|
{
|
|
3331
|
-
|
|
3332
|
-
|
|
3312
|
+
op: nextToken.text,
|
|
3313
|
+
expr: primary
|
|
3333
3314
|
},
|
|
3334
3315
|
startToken,
|
|
3335
3316
|
nextToken
|
|
@@ -3353,30 +3334,29 @@ class Parser {
|
|
|
3353
3334
|
this._lexer.get();
|
|
3354
3335
|
if (this._lexer.peek().type === TokenType.RParent) {
|
|
3355
3336
|
const endToken2 = this._lexer.get();
|
|
3356
|
-
return this.createExpressionNode(
|
|
3337
|
+
return this.createExpressionNode(
|
|
3338
|
+
T_NO_ARG_EXPRESSION,
|
|
3339
|
+
{},
|
|
3340
|
+
start,
|
|
3341
|
+
endToken2
|
|
3342
|
+
);
|
|
3357
3343
|
}
|
|
3358
|
-
|
|
3344
|
+
let parenthesizedExpr = this.parseExpr();
|
|
3359
3345
|
if (!parenthesizedExpr) {
|
|
3360
3346
|
return null;
|
|
3361
3347
|
}
|
|
3362
3348
|
const endToken = this._lexer.peek();
|
|
3363
3349
|
this.expectToken(TokenType.RParent, "W006");
|
|
3364
|
-
|
|
3365
|
-
|
|
3366
|
-
|
|
3367
|
-
|
|
3368
|
-
|
|
3369
|
-
|
|
3370
|
-
parenthesizedExpr.endToken = endToken;
|
|
3371
|
-
parenthesizedExpr.endPosition = endToken.location.endPosition;
|
|
3372
|
-
parenthesizedExpr.endLine = endToken.location.endLine;
|
|
3373
|
-
parenthesizedExpr.endColumn = endToken.location.endColumn;
|
|
3374
|
-
parenthesizedExpr.source = this.getSource(start, endToken);
|
|
3375
|
-
return parenthesizedExpr;
|
|
3350
|
+
return {
|
|
3351
|
+
...parenthesizedExpr,
|
|
3352
|
+
parenthesized: (parenthesizedExpr.parenthesized ?? 0) + 1,
|
|
3353
|
+
startToken: start,
|
|
3354
|
+
endToken
|
|
3355
|
+
};
|
|
3376
3356
|
case TokenType.Identifier: {
|
|
3377
3357
|
const idToken = this._lexer.get();
|
|
3378
3358
|
return this.createExpressionNode(
|
|
3379
|
-
|
|
3359
|
+
T_IDENTIFIER,
|
|
3380
3360
|
{
|
|
3381
3361
|
name: idToken.text
|
|
3382
3362
|
},
|
|
@@ -3392,7 +3372,7 @@ class Parser {
|
|
|
3392
3372
|
return null;
|
|
3393
3373
|
}
|
|
3394
3374
|
return this.createExpressionNode(
|
|
3395
|
-
|
|
3375
|
+
T_IDENTIFIER,
|
|
3396
3376
|
{
|
|
3397
3377
|
name: idToken.text,
|
|
3398
3378
|
isGlobal: true
|
|
@@ -3407,7 +3387,7 @@ class Parser {
|
|
|
3407
3387
|
case TokenType.True:
|
|
3408
3388
|
this._lexer.get();
|
|
3409
3389
|
return this.createExpressionNode(
|
|
3410
|
-
|
|
3390
|
+
T_LITERAL,
|
|
3411
3391
|
{
|
|
3412
3392
|
value: start.type === TokenType.True
|
|
3413
3393
|
},
|
|
@@ -3432,7 +3412,7 @@ class Parser {
|
|
|
3432
3412
|
case TokenType.Infinity:
|
|
3433
3413
|
this._lexer.get();
|
|
3434
3414
|
return this.createExpressionNode(
|
|
3435
|
-
|
|
3415
|
+
T_LITERAL,
|
|
3436
3416
|
{
|
|
3437
3417
|
value: Infinity
|
|
3438
3418
|
},
|
|
@@ -3442,7 +3422,7 @@ class Parser {
|
|
|
3442
3422
|
case TokenType.NaN:
|
|
3443
3423
|
this._lexer.get();
|
|
3444
3424
|
return this.createExpressionNode(
|
|
3445
|
-
|
|
3425
|
+
T_LITERAL,
|
|
3446
3426
|
{
|
|
3447
3427
|
value: NaN
|
|
3448
3428
|
},
|
|
@@ -3452,7 +3432,7 @@ class Parser {
|
|
|
3452
3432
|
case TokenType.Null:
|
|
3453
3433
|
this._lexer.get();
|
|
3454
3434
|
return this.createExpressionNode(
|
|
3455
|
-
|
|
3435
|
+
T_LITERAL,
|
|
3456
3436
|
{
|
|
3457
3437
|
value: null
|
|
3458
3438
|
},
|
|
@@ -3462,7 +3442,7 @@ class Parser {
|
|
|
3462
3442
|
case TokenType.Undefined:
|
|
3463
3443
|
this._lexer.get();
|
|
3464
3444
|
return this.createExpressionNode(
|
|
3465
|
-
|
|
3445
|
+
T_LITERAL,
|
|
3466
3446
|
{
|
|
3467
3447
|
value: void 0
|
|
3468
3448
|
},
|
|
@@ -3505,7 +3485,7 @@ class Parser {
|
|
|
3505
3485
|
}
|
|
3506
3486
|
const endToken = this._lexer.get();
|
|
3507
3487
|
return this.createExpressionNode(
|
|
3508
|
-
|
|
3488
|
+
T_TEMPLATE_LITERAL_EXPRESSION,
|
|
3509
3489
|
{ segments },
|
|
3510
3490
|
startToken,
|
|
3511
3491
|
endToken
|
|
@@ -3520,13 +3500,13 @@ class Parser {
|
|
|
3520
3500
|
if (this._lexer.peek().type !== TokenType.RSquare) {
|
|
3521
3501
|
const expr = this.getExpression();
|
|
3522
3502
|
if (expr) {
|
|
3523
|
-
expressions = expr.type ===
|
|
3503
|
+
expressions = expr.type === T_SEQUENCE_EXPRESSION ? expr.exprs : [expr];
|
|
3524
3504
|
}
|
|
3525
3505
|
}
|
|
3526
3506
|
const endToken = this._lexer.peek();
|
|
3527
3507
|
this.expectToken(TokenType.RSquare);
|
|
3528
3508
|
return this.createExpressionNode(
|
|
3529
|
-
|
|
3509
|
+
T_ARRAY_LITERAL,
|
|
3530
3510
|
{
|
|
3531
3511
|
items: expressions
|
|
3532
3512
|
},
|
|
@@ -3554,9 +3534,9 @@ class Parser {
|
|
|
3554
3534
|
}
|
|
3555
3535
|
this.expectToken(TokenType.RSquare, "W005");
|
|
3556
3536
|
nameExpr = this.createExpressionNode(
|
|
3557
|
-
|
|
3537
|
+
T_SEQUENCE_EXPRESSION,
|
|
3558
3538
|
{
|
|
3559
|
-
|
|
3539
|
+
exprs: [nameExpr]
|
|
3560
3540
|
},
|
|
3561
3541
|
start
|
|
3562
3542
|
);
|
|
@@ -3565,7 +3545,7 @@ class Parser {
|
|
|
3565
3545
|
if (!nameExpr) {
|
|
3566
3546
|
return null;
|
|
3567
3547
|
}
|
|
3568
|
-
if (nameExpr.type !==
|
|
3548
|
+
if (nameExpr.type !== T_IDENTIFIER && nameExpr.type !== T_LITERAL && nameExpr.type !== T_SPREAD_EXPRESSION) {
|
|
3569
3549
|
this.reportError("W007");
|
|
3570
3550
|
return null;
|
|
3571
3551
|
}
|
|
@@ -3575,16 +3555,9 @@ class Parser {
|
|
|
3575
3555
|
}
|
|
3576
3556
|
} else if (traits.keywordLike) {
|
|
3577
3557
|
nameExpr = {
|
|
3578
|
-
type:
|
|
3558
|
+
type: T_IDENTIFIER,
|
|
3559
|
+
nodeId: createXmlUiTreeNodeId(),
|
|
3579
3560
|
name: nextToken.text,
|
|
3580
|
-
value: void 0,
|
|
3581
|
-
startPosition: nextToken.location.startPosition,
|
|
3582
|
-
startLine: nextToken.location.startLine,
|
|
3583
|
-
startColumn: nextToken.location.startColumn,
|
|
3584
|
-
endPosition: nextToken.location.endPosition,
|
|
3585
|
-
endLine: nextToken.location.endLine,
|
|
3586
|
-
endColumn: nextToken.location.endColumn,
|
|
3587
|
-
source: nextToken.text,
|
|
3588
3561
|
startToken: nextToken,
|
|
3589
3562
|
endToken: nextToken
|
|
3590
3563
|
};
|
|
@@ -3594,10 +3567,10 @@ class Parser {
|
|
|
3594
3567
|
return null;
|
|
3595
3568
|
}
|
|
3596
3569
|
const nameType = nameExpr.type;
|
|
3597
|
-
if (nameType ===
|
|
3570
|
+
if (nameType === T_SPREAD_EXPRESSION) {
|
|
3598
3571
|
props.push(nameExpr);
|
|
3599
3572
|
} else {
|
|
3600
|
-
if (nameType ===
|
|
3573
|
+
if (nameType === T_LITERAL) {
|
|
3601
3574
|
const val = nameExpr.value;
|
|
3602
3575
|
if (typeof val !== "number" && typeof val !== "string") {
|
|
3603
3576
|
this.expectToken(TokenType.RBrace, "W007");
|
|
@@ -3605,7 +3578,7 @@ class Parser {
|
|
|
3605
3578
|
}
|
|
3606
3579
|
}
|
|
3607
3580
|
let valueExpr = null;
|
|
3608
|
-
if (nameType ===
|
|
3581
|
+
if (nameType === T_IDENTIFIER) {
|
|
3609
3582
|
const nameFollowerToken = this._lexer.peek();
|
|
3610
3583
|
if (nameFollowerToken.type === TokenType.Comma || nameFollowerToken.type === TokenType.RBrace) {
|
|
3611
3584
|
valueExpr = { ...nameExpr };
|
|
@@ -3633,7 +3606,7 @@ class Parser {
|
|
|
3633
3606
|
const endToken = this._lexer.peek();
|
|
3634
3607
|
this.expectToken(TokenType.RBrace, "W004");
|
|
3635
3608
|
return this.createExpressionNode(
|
|
3636
|
-
|
|
3609
|
+
T_OBJECT_LITERAL,
|
|
3637
3610
|
{
|
|
3638
3611
|
props
|
|
3639
3612
|
},
|
|
@@ -3646,7 +3619,7 @@ class Parser {
|
|
|
3646
3619
|
const result = this._lexer.getRegEx();
|
|
3647
3620
|
if (result.success) {
|
|
3648
3621
|
return this.createExpressionNode(
|
|
3649
|
-
|
|
3622
|
+
T_LITERAL,
|
|
3650
3623
|
{
|
|
3651
3624
|
value: new RegExp(result.pattern, result.flags)
|
|
3652
3625
|
},
|
|
@@ -3728,10 +3701,7 @@ class Parser {
|
|
|
3728
3701
|
}
|
|
3729
3702
|
this._parseErrors.push({
|
|
3730
3703
|
code: errorCode,
|
|
3731
|
-
text: errorText
|
|
3732
|
-
line: token.location.startLine,
|
|
3733
|
-
column: token.location.startColumn,
|
|
3734
|
-
position: token.location.startPosition
|
|
3704
|
+
text: errorText
|
|
3735
3705
|
});
|
|
3736
3706
|
throw new ParserError$1(errorText, errorCode);
|
|
3737
3707
|
function replace(input, placeholder, replacement) {
|
|
@@ -3749,21 +3719,14 @@ class Parser {
|
|
|
3749
3719
|
* @param endToken The token that ends the expression
|
|
3750
3720
|
* @param source Expression source code to store to the node
|
|
3751
3721
|
*/
|
|
3752
|
-
createNode(type, stump, startToken, endToken
|
|
3722
|
+
createNode(type, stump, startToken, endToken) {
|
|
3753
3723
|
if (!endToken) {
|
|
3754
3724
|
endToken = this._lexer.peek();
|
|
3755
3725
|
}
|
|
3756
|
-
const startPosition = startToken.location.startPosition;
|
|
3757
|
-
const endPosition = endToken.location.startPosition;
|
|
3758
3726
|
return Object.assign({}, stump, {
|
|
3759
3727
|
type,
|
|
3760
|
-
|
|
3761
|
-
|
|
3762
|
-
startLine: startToken.location.startLine,
|
|
3763
|
-
startColumn: startToken.location.startColumn,
|
|
3764
|
-
endLine: endToken.location.endLine,
|
|
3765
|
-
endColumn: endToken.location.endColumn,
|
|
3766
|
-
source: source ?? this.getSource(startToken, endToken)
|
|
3728
|
+
startToken,
|
|
3729
|
+
endToken
|
|
3767
3730
|
});
|
|
3768
3731
|
}
|
|
3769
3732
|
/**
|
|
@@ -3774,24 +3737,16 @@ class Parser {
|
|
|
3774
3737
|
* @param endToken The token that ends the expression
|
|
3775
3738
|
* @param source Expression source code to store to the node
|
|
3776
3739
|
*/
|
|
3777
|
-
createExpressionNode(type, stump = {}, startToken, endToken
|
|
3740
|
+
createExpressionNode(type, stump = {}, startToken, endToken) {
|
|
3778
3741
|
if (!endToken) {
|
|
3779
3742
|
endToken = this._lexer.peek();
|
|
3780
3743
|
}
|
|
3781
3744
|
if (!startToken) {
|
|
3782
3745
|
startToken = endToken;
|
|
3783
3746
|
}
|
|
3784
|
-
const startPosition = startToken.location.startPosition;
|
|
3785
|
-
const endPosition = endToken.location.endPosition;
|
|
3786
3747
|
return Object.assign({}, stump, {
|
|
3787
3748
|
type,
|
|
3788
|
-
|
|
3789
|
-
endPosition,
|
|
3790
|
-
startLine: startToken.location.startLine,
|
|
3791
|
-
startColumn: startToken.location.startColumn,
|
|
3792
|
-
endLine: endToken.location.endLine,
|
|
3793
|
-
endColumn: endToken.location.endColumn,
|
|
3794
|
-
source: source ?? this.getSource(startToken, endToken),
|
|
3749
|
+
nodeId: createXmlUiTreeNodeId(),
|
|
3795
3750
|
startToken,
|
|
3796
3751
|
endToken
|
|
3797
3752
|
});
|
|
@@ -3804,35 +3759,13 @@ class Parser {
|
|
|
3804
3759
|
* @param endToken The token that ends the statement
|
|
3805
3760
|
*/
|
|
3806
3761
|
createStatementNode(type, stump, startToken, endToken) {
|
|
3807
|
-
var _a, _b, _c, _d, _e;
|
|
3808
|
-
const startPosition = (_a = startToken == null ? void 0 : startToken.location) == null ? void 0 : _a.startPosition;
|
|
3809
|
-
const currentToken = this._lexer.peek();
|
|
3810
|
-
const endPosition = endToken ? endToken.location.endPosition : currentToken.type === TokenType.Eof ? currentToken.location.startPosition + 1 : currentToken.location.startPosition;
|
|
3811
3762
|
return Object.assign({}, stump, {
|
|
3812
3763
|
type,
|
|
3813
|
-
|
|
3814
|
-
endPosition,
|
|
3815
|
-
startLine: (_b = startToken == null ? void 0 : startToken.location) == null ? void 0 : _b.startLine,
|
|
3816
|
-
startColumn: (_c = startToken == null ? void 0 : startToken.location) == null ? void 0 : _c.startColumn,
|
|
3817
|
-
endLine: endToken ? endToken.location.endLine : (_d = startToken == null ? void 0 : startToken.location) == null ? void 0 : _d.endLine,
|
|
3818
|
-
endColumn: endToken ? endToken.location.endColumn : (_e = startToken == null ? void 0 : startToken.location) == null ? void 0 : _e.endColumn,
|
|
3819
|
-
source: this.source && startPosition !== void 0 && endPosition !== void 0 ? this.source.substring(startPosition, endPosition) : void 0,
|
|
3764
|
+
nodeId: createXmlUiTreeNodeId(),
|
|
3820
3765
|
startToken,
|
|
3821
3766
|
endToken
|
|
3822
3767
|
});
|
|
3823
3768
|
}
|
|
3824
|
-
/**
|
|
3825
|
-
* Gets the source code for the specified token range
|
|
3826
|
-
* @param start Start token
|
|
3827
|
-
* @param end Optional end token
|
|
3828
|
-
* @returns The source code for the token range
|
|
3829
|
-
*/
|
|
3830
|
-
getSource(start, end) {
|
|
3831
|
-
return this.source.substring(
|
|
3832
|
-
start.location.startPosition,
|
|
3833
|
-
end.type === TokenType.Eof ? end.location.startPosition : end.location.endPosition
|
|
3834
|
-
);
|
|
3835
|
-
}
|
|
3836
3769
|
/**
|
|
3837
3770
|
* Parses a binary literal
|
|
3838
3771
|
* @param token Literal token
|
|
@@ -3846,7 +3779,7 @@ class Parser {
|
|
|
3846
3779
|
value = parseInt(token.text.substring(2).replace(/[_']/g, ""), 2);
|
|
3847
3780
|
}
|
|
3848
3781
|
return this.createExpressionNode(
|
|
3849
|
-
|
|
3782
|
+
T_LITERAL,
|
|
3850
3783
|
{
|
|
3851
3784
|
value
|
|
3852
3785
|
},
|
|
@@ -3867,7 +3800,7 @@ class Parser {
|
|
|
3867
3800
|
value = parseInt(token.text.replace(/[_']/g, ""), 10);
|
|
3868
3801
|
}
|
|
3869
3802
|
return this.createExpressionNode(
|
|
3870
|
-
|
|
3803
|
+
T_LITERAL,
|
|
3871
3804
|
{
|
|
3872
3805
|
value
|
|
3873
3806
|
},
|
|
@@ -3888,7 +3821,7 @@ class Parser {
|
|
|
3888
3821
|
value = parseInt(token.text.substring(2).replace(/[_']/g, ""), 16);
|
|
3889
3822
|
}
|
|
3890
3823
|
return this.createExpressionNode(
|
|
3891
|
-
|
|
3824
|
+
T_LITERAL,
|
|
3892
3825
|
{
|
|
3893
3826
|
value
|
|
3894
3827
|
},
|
|
@@ -3903,7 +3836,7 @@ class Parser {
|
|
|
3903
3836
|
parseRealLiteral(token) {
|
|
3904
3837
|
let value = parseFloat(token.text.replace(/[_']/g, ""));
|
|
3905
3838
|
return this.createExpressionNode(
|
|
3906
|
-
|
|
3839
|
+
T_LITERAL,
|
|
3907
3840
|
{
|
|
3908
3841
|
value
|
|
3909
3842
|
},
|
|
@@ -4123,7 +4056,7 @@ class Parser {
|
|
|
4123
4056
|
break;
|
|
4124
4057
|
}
|
|
4125
4058
|
return this.createExpressionNode(
|
|
4126
|
-
|
|
4059
|
+
T_LITERAL,
|
|
4127
4060
|
{
|
|
4128
4061
|
value: result
|
|
4129
4062
|
},
|
|
@@ -4136,45 +4069,45 @@ class Parser {
|
|
|
4136
4069
|
}
|
|
4137
4070
|
convertToArrayDestructure(seq) {
|
|
4138
4071
|
var _a;
|
|
4139
|
-
const items = seq.type ===
|
|
4072
|
+
const items = seq.type === T_SEQUENCE_EXPRESSION ? seq.exprs : seq.items;
|
|
4140
4073
|
const result = this.createExpressionNode(
|
|
4141
|
-
|
|
4142
|
-
{
|
|
4074
|
+
T_DESTRUCTURE,
|
|
4075
|
+
{ aDestr: [] },
|
|
4143
4076
|
seq.startToken,
|
|
4144
4077
|
seq.endToken
|
|
4145
4078
|
);
|
|
4146
4079
|
for (const item of items) {
|
|
4147
4080
|
let arrayD;
|
|
4148
4081
|
switch (item.type) {
|
|
4149
|
-
case
|
|
4082
|
+
case T_NO_ARG_EXPRESSION:
|
|
4150
4083
|
arrayD = this.createExpressionNode(
|
|
4151
|
-
|
|
4084
|
+
T_ARRAY_DESTRUCTURE,
|
|
4152
4085
|
{},
|
|
4153
4086
|
item.startToken,
|
|
4154
4087
|
item.endToken
|
|
4155
4088
|
);
|
|
4156
4089
|
break;
|
|
4157
|
-
case
|
|
4090
|
+
case T_IDENTIFIER:
|
|
4158
4091
|
arrayD = this.createExpressionNode(
|
|
4159
|
-
|
|
4092
|
+
T_ARRAY_DESTRUCTURE,
|
|
4160
4093
|
{ id: item.name },
|
|
4161
4094
|
item.startToken,
|
|
4162
4095
|
item.endToken
|
|
4163
4096
|
);
|
|
4164
4097
|
break;
|
|
4165
|
-
case
|
|
4166
|
-
result.
|
|
4098
|
+
case T_DESTRUCTURE:
|
|
4099
|
+
result.aDestr.push(...item.aDestr);
|
|
4167
4100
|
break;
|
|
4168
|
-
case
|
|
4101
|
+
case T_ARRAY_DESTRUCTURE:
|
|
4169
4102
|
arrayD = item;
|
|
4170
4103
|
break;
|
|
4171
|
-
case
|
|
4104
|
+
case T_ARRAY_LITERAL: {
|
|
4172
4105
|
const destructure = this.convertToArrayDestructure(item);
|
|
4173
4106
|
if (destructure) {
|
|
4174
4107
|
arrayD = this.createExpressionNode(
|
|
4175
|
-
|
|
4108
|
+
T_ARRAY_DESTRUCTURE,
|
|
4176
4109
|
{
|
|
4177
|
-
|
|
4110
|
+
aDestr: destructure.aDestr
|
|
4178
4111
|
},
|
|
4179
4112
|
item.startToken,
|
|
4180
4113
|
item.endToken
|
|
@@ -4182,23 +4115,23 @@ class Parser {
|
|
|
4182
4115
|
}
|
|
4183
4116
|
break;
|
|
4184
4117
|
}
|
|
4185
|
-
case
|
|
4118
|
+
case T_OBJECT_DESTRUCTURE:
|
|
4186
4119
|
arrayD = this.createExpressionNode(
|
|
4187
|
-
|
|
4120
|
+
T_ARRAY_DESTRUCTURE,
|
|
4188
4121
|
{
|
|
4189
|
-
|
|
4122
|
+
oDestr: item
|
|
4190
4123
|
},
|
|
4191
4124
|
item.startToken,
|
|
4192
4125
|
item.endToken
|
|
4193
4126
|
);
|
|
4194
4127
|
break;
|
|
4195
|
-
case
|
|
4128
|
+
case T_OBJECT_LITERAL: {
|
|
4196
4129
|
const destructure = this.convertToObjectDestructure(item);
|
|
4197
4130
|
if (destructure) {
|
|
4198
4131
|
arrayD = this.createExpressionNode(
|
|
4199
|
-
|
|
4132
|
+
T_ARRAY_DESTRUCTURE,
|
|
4200
4133
|
{
|
|
4201
|
-
|
|
4134
|
+
oDestr: destructure.oDestr
|
|
4202
4135
|
},
|
|
4203
4136
|
item.startToken,
|
|
4204
4137
|
item.endToken
|
|
@@ -4210,42 +4143,42 @@ class Parser {
|
|
|
4210
4143
|
this.reportError("W017");
|
|
4211
4144
|
return null;
|
|
4212
4145
|
}
|
|
4213
|
-
if (arrayD) (_a = result.
|
|
4146
|
+
if (arrayD) (_a = result.aDestr) == null ? void 0 : _a.push(arrayD);
|
|
4214
4147
|
}
|
|
4215
4148
|
return result;
|
|
4216
4149
|
}
|
|
4217
4150
|
convertToObjectDestructure(objLit) {
|
|
4218
4151
|
var _a;
|
|
4219
4152
|
const result = this.createExpressionNode(
|
|
4220
|
-
|
|
4221
|
-
{
|
|
4153
|
+
T_DESTRUCTURE,
|
|
4154
|
+
{ oDestr: [] },
|
|
4222
4155
|
objLit.startToken,
|
|
4223
4156
|
objLit.endToken
|
|
4224
4157
|
);
|
|
4225
4158
|
for (const prop of objLit.props) {
|
|
4226
4159
|
if (Array.isArray(prop)) ;
|
|
4227
4160
|
else {
|
|
4228
|
-
|
|
4161
|
+
reportError("W018");
|
|
4229
4162
|
return null;
|
|
4230
4163
|
}
|
|
4231
4164
|
const [propKey, propValue] = prop;
|
|
4232
|
-
if (propKey.type !==
|
|
4233
|
-
|
|
4165
|
+
if (propKey.type !== T_IDENTIFIER) {
|
|
4166
|
+
reportError("W018");
|
|
4234
4167
|
return null;
|
|
4235
4168
|
}
|
|
4236
4169
|
let objD;
|
|
4237
4170
|
switch (propValue.type) {
|
|
4238
|
-
case
|
|
4171
|
+
case T_IDENTIFIER:
|
|
4239
4172
|
if (propValue.name === propKey.name) {
|
|
4240
4173
|
objD = this.createExpressionNode(
|
|
4241
|
-
|
|
4174
|
+
T_OBJECT_DESTRUCTURE,
|
|
4242
4175
|
{ id: propKey.name },
|
|
4243
4176
|
propValue.startToken,
|
|
4244
4177
|
propValue.endToken
|
|
4245
4178
|
);
|
|
4246
4179
|
} else {
|
|
4247
4180
|
objD = this.createExpressionNode(
|
|
4248
|
-
|
|
4181
|
+
T_OBJECT_DESTRUCTURE,
|
|
4249
4182
|
{
|
|
4250
4183
|
id: propKey.name,
|
|
4251
4184
|
alias: propValue.name
|
|
@@ -4255,26 +4188,26 @@ class Parser {
|
|
|
4255
4188
|
);
|
|
4256
4189
|
}
|
|
4257
4190
|
break;
|
|
4258
|
-
case
|
|
4191
|
+
case T_ARRAY_DESTRUCTURE: {
|
|
4259
4192
|
objD = this.createExpressionNode(
|
|
4260
|
-
|
|
4193
|
+
T_OBJECT_DESTRUCTURE,
|
|
4261
4194
|
{
|
|
4262
4195
|
id: propKey.name,
|
|
4263
|
-
|
|
4196
|
+
aDestr: propValue
|
|
4264
4197
|
},
|
|
4265
4198
|
propKey.startToken,
|
|
4266
4199
|
propValue.endToken
|
|
4267
4200
|
);
|
|
4268
4201
|
break;
|
|
4269
4202
|
}
|
|
4270
|
-
case
|
|
4203
|
+
case T_ARRAY_LITERAL: {
|
|
4271
4204
|
const destructure = this.convertToArrayDestructure(propValue);
|
|
4272
4205
|
if (destructure) {
|
|
4273
4206
|
objD = this.createExpressionNode(
|
|
4274
|
-
|
|
4207
|
+
T_OBJECT_DESTRUCTURE,
|
|
4275
4208
|
{
|
|
4276
4209
|
id: propKey.name,
|
|
4277
|
-
|
|
4210
|
+
aDestr: destructure.aDestr
|
|
4278
4211
|
},
|
|
4279
4212
|
propKey.startToken,
|
|
4280
4213
|
propValue.endToken
|
|
@@ -4282,17 +4215,17 @@ class Parser {
|
|
|
4282
4215
|
}
|
|
4283
4216
|
break;
|
|
4284
4217
|
}
|
|
4285
|
-
case
|
|
4218
|
+
case T_OBJECT_DESTRUCTURE:
|
|
4286
4219
|
objD = propValue;
|
|
4287
4220
|
break;
|
|
4288
|
-
case
|
|
4221
|
+
case T_OBJECT_LITERAL: {
|
|
4289
4222
|
const destructure = this.convertToObjectDestructure(propValue);
|
|
4290
4223
|
if (destructure) {
|
|
4291
4224
|
objD = this.createExpressionNode(
|
|
4292
|
-
|
|
4225
|
+
T_OBJECT_DESTRUCTURE,
|
|
4293
4226
|
{
|
|
4294
4227
|
id: propKey.name,
|
|
4295
|
-
|
|
4228
|
+
oDestr: destructure.oDestr
|
|
4296
4229
|
},
|
|
4297
4230
|
propKey.startToken,
|
|
4298
4231
|
propValue.endToken
|
|
@@ -4304,7 +4237,7 @@ class Parser {
|
|
|
4304
4237
|
this.reportError("W018");
|
|
4305
4238
|
return null;
|
|
4306
4239
|
}
|
|
4307
|
-
if (objD) (_a = result.
|
|
4240
|
+
if (objD) (_a = result.oDestr) == null ? void 0 : _a.push(objD);
|
|
4308
4241
|
}
|
|
4309
4242
|
return result;
|
|
4310
4243
|
}
|
|
@@ -4328,11 +4261,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4328
4261
|
return state;
|
|
4329
4262
|
}
|
|
4330
4263
|
switch (subject.type) {
|
|
4331
|
-
case
|
|
4264
|
+
case T_BLOCK_STATEMENT: {
|
|
4332
4265
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4333
4266
|
if (state.cancel) return state;
|
|
4334
4267
|
if (!state.skipChildren) {
|
|
4335
|
-
for (const statement of subject.
|
|
4268
|
+
for (const statement of subject.stmts) {
|
|
4336
4269
|
state = visitNode(statement, state, stmtVisitor, exprVisitor, subject, "statements");
|
|
4337
4270
|
if (state.cancel) return state;
|
|
4338
4271
|
}
|
|
@@ -4340,28 +4273,28 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4340
4273
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4341
4274
|
return state;
|
|
4342
4275
|
}
|
|
4343
|
-
case
|
|
4276
|
+
case T_EMPTY_STATEMENT: {
|
|
4344
4277
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4345
4278
|
return state;
|
|
4346
4279
|
}
|
|
4347
|
-
case
|
|
4280
|
+
case T_EXPRESSION_STATEMENT: {
|
|
4348
4281
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4349
4282
|
if (state.cancel) return state;
|
|
4350
4283
|
if (!state.skipChildren) {
|
|
4351
|
-
state = visitNode(subject.
|
|
4284
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4352
4285
|
if (state.cancel) return state;
|
|
4353
4286
|
}
|
|
4354
4287
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4355
4288
|
return state;
|
|
4356
4289
|
}
|
|
4357
|
-
case
|
|
4290
|
+
case T_ARROW_EXPRESSION_STATEMENT: {
|
|
4358
4291
|
return state;
|
|
4359
4292
|
}
|
|
4360
|
-
case
|
|
4293
|
+
case T_LET_STATEMENT: {
|
|
4361
4294
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4362
4295
|
if (state.cancel) return state;
|
|
4363
4296
|
if (!state.skipChildren) {
|
|
4364
|
-
for (const declaration of subject.
|
|
4297
|
+
for (const declaration of subject.decls) {
|
|
4365
4298
|
state = visitNode(declaration, state, stmtVisitor, exprVisitor, subject, "declarations");
|
|
4366
4299
|
if (state.cancel) return state;
|
|
4367
4300
|
}
|
|
@@ -4369,11 +4302,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4369
4302
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4370
4303
|
return state;
|
|
4371
4304
|
}
|
|
4372
|
-
case
|
|
4305
|
+
case T_CONST_STATEMENT: {
|
|
4373
4306
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4374
4307
|
if (state.cancel) return state;
|
|
4375
4308
|
if (!state.skipChildren) {
|
|
4376
|
-
for (const declaration of subject.
|
|
4309
|
+
for (const declaration of subject.decls) {
|
|
4377
4310
|
state = visitNode(declaration, state, stmtVisitor, exprVisitor, subject, "declarations");
|
|
4378
4311
|
if (state.cancel) return state;
|
|
4379
4312
|
}
|
|
@@ -4381,11 +4314,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4381
4314
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4382
4315
|
return state;
|
|
4383
4316
|
}
|
|
4384
|
-
case
|
|
4317
|
+
case T_VAR_STATEMENT: {
|
|
4385
4318
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4386
4319
|
if (state.cancel) return state;
|
|
4387
4320
|
if (!state.skipChildren) {
|
|
4388
|
-
for (const declaration of subject.
|
|
4321
|
+
for (const declaration of subject.decls) {
|
|
4389
4322
|
state = visitNode(declaration, state, stmtVisitor, exprVisitor, subject, "declarations");
|
|
4390
4323
|
if (state.cancel) return state;
|
|
4391
4324
|
}
|
|
@@ -4393,49 +4326,49 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4393
4326
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4394
4327
|
return state;
|
|
4395
4328
|
}
|
|
4396
|
-
case
|
|
4329
|
+
case T_IF_STATEMENT: {
|
|
4397
4330
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4398
4331
|
if (state.cancel) return state;
|
|
4399
4332
|
if (!state.skipChildren) {
|
|
4400
|
-
state = visitNode(subject.
|
|
4333
|
+
state = visitNode(subject.cond, state, stmtVisitor, exprVisitor, subject, "condition");
|
|
4401
4334
|
if (state.cancel) return state;
|
|
4402
|
-
if (subject.
|
|
4403
|
-
state = visitNode(subject.
|
|
4335
|
+
if (subject.thenB) {
|
|
4336
|
+
state = visitNode(subject.thenB, state, stmtVisitor, exprVisitor, subject, "thenBranch");
|
|
4404
4337
|
}
|
|
4405
4338
|
if (state.cancel) return state;
|
|
4406
|
-
if (subject.
|
|
4407
|
-
state = visitNode(subject.
|
|
4339
|
+
if (subject.elseB) {
|
|
4340
|
+
state = visitNode(subject.elseB, state, stmtVisitor, exprVisitor, subject, "elseBranch");
|
|
4408
4341
|
}
|
|
4409
4342
|
if (state.cancel) return state;
|
|
4410
4343
|
}
|
|
4411
4344
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4412
4345
|
return state;
|
|
4413
4346
|
}
|
|
4414
|
-
case
|
|
4347
|
+
case T_RETURN_STATEMENT: {
|
|
4415
4348
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4416
4349
|
if (state.cancel) return state;
|
|
4417
4350
|
if (!state.skipChildren) {
|
|
4418
|
-
if (subject.
|
|
4419
|
-
state = visitNode(subject.
|
|
4351
|
+
if (subject.expr) {
|
|
4352
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4420
4353
|
}
|
|
4421
4354
|
if (state.cancel) return state;
|
|
4422
4355
|
}
|
|
4423
4356
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4424
4357
|
return state;
|
|
4425
4358
|
}
|
|
4426
|
-
case
|
|
4359
|
+
case T_BREAK_STATEMENT: {
|
|
4427
4360
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4428
4361
|
return state;
|
|
4429
4362
|
}
|
|
4430
|
-
case
|
|
4363
|
+
case T_CONTINUE_STATEMENT: {
|
|
4431
4364
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4432
4365
|
return state;
|
|
4433
4366
|
}
|
|
4434
|
-
case
|
|
4367
|
+
case T_WHILE_STATEMENT: {
|
|
4435
4368
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4436
4369
|
if (state.cancel) return state;
|
|
4437
4370
|
if (!state.skipChildren) {
|
|
4438
|
-
state = visitNode(subject.
|
|
4371
|
+
state = visitNode(subject.cond, state, stmtVisitor, exprVisitor, subject, "condition");
|
|
4439
4372
|
if (state.cancel) return state;
|
|
4440
4373
|
state = visitNode(subject.body, state, stmtVisitor, exprVisitor, subject, "body");
|
|
4441
4374
|
if (state.cancel) return state;
|
|
@@ -4443,19 +4376,19 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4443
4376
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4444
4377
|
return state;
|
|
4445
4378
|
}
|
|
4446
|
-
case
|
|
4379
|
+
case T_DO_WHILE_STATEMENT: {
|
|
4447
4380
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4448
4381
|
if (state.cancel) return state;
|
|
4449
4382
|
if (!state.skipChildren) {
|
|
4450
4383
|
state = visitNode(subject.body, state, stmtVisitor, exprVisitor, subject, "body");
|
|
4451
4384
|
if (state.cancel) return state;
|
|
4452
|
-
state = visitNode(subject.
|
|
4385
|
+
state = visitNode(subject.cond, state, stmtVisitor, exprVisitor, subject, "condition");
|
|
4453
4386
|
if (state.cancel) return state;
|
|
4454
4387
|
}
|
|
4455
4388
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4456
4389
|
return state;
|
|
4457
4390
|
}
|
|
4458
|
-
case
|
|
4391
|
+
case T_FOR_STATEMENT: {
|
|
4459
4392
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4460
4393
|
if (state.cancel) return state;
|
|
4461
4394
|
if (!state.skipChildren) {
|
|
@@ -4463,12 +4396,12 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4463
4396
|
state = visitNode(subject.init, state, stmtVisitor, exprVisitor, subject, "init");
|
|
4464
4397
|
}
|
|
4465
4398
|
if (state.cancel) return state;
|
|
4466
|
-
if (subject.
|
|
4467
|
-
state = visitNode(subject.
|
|
4399
|
+
if (subject.cond) {
|
|
4400
|
+
state = visitNode(subject.cond, state, stmtVisitor, exprVisitor, subject, "condition");
|
|
4468
4401
|
}
|
|
4469
4402
|
if (state.cancel) return state;
|
|
4470
|
-
if (subject.
|
|
4471
|
-
state = visitNode(subject.
|
|
4403
|
+
if (subject.upd) {
|
|
4404
|
+
state = visitNode(subject.upd, state, stmtVisitor, exprVisitor, subject, "update");
|
|
4472
4405
|
}
|
|
4473
4406
|
if (state.cancel) return state;
|
|
4474
4407
|
state = visitNode(subject.body, state, stmtVisitor, exprVisitor, subject, "body");
|
|
@@ -4477,11 +4410,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4477
4410
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4478
4411
|
return state;
|
|
4479
4412
|
}
|
|
4480
|
-
case
|
|
4413
|
+
case T_FOR_IN_STATEMENT: {
|
|
4481
4414
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4482
4415
|
if (state.cancel) return state;
|
|
4483
4416
|
if (!state.skipChildren) {
|
|
4484
|
-
state = visitNode(subject.
|
|
4417
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4485
4418
|
if (state.cancel) return state;
|
|
4486
4419
|
state = visitNode(subject.body, state, stmtVisitor, exprVisitor, subject, "body");
|
|
4487
4420
|
if (state.cancel) return state;
|
|
@@ -4489,11 +4422,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4489
4422
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4490
4423
|
return state;
|
|
4491
4424
|
}
|
|
4492
|
-
case
|
|
4425
|
+
case T_FOR_OF_STATEMENT: {
|
|
4493
4426
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4494
4427
|
if (state.cancel) return state;
|
|
4495
4428
|
if (!state.skipChildren) {
|
|
4496
|
-
state = visitNode(subject.
|
|
4429
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4497
4430
|
if (state.cancel) return state;
|
|
4498
4431
|
state = visitNode(subject.body, state, stmtVisitor, exprVisitor, subject, "body");
|
|
4499
4432
|
if (state.cancel) return state;
|
|
@@ -4501,49 +4434,70 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4501
4434
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4502
4435
|
return state;
|
|
4503
4436
|
}
|
|
4504
|
-
case
|
|
4437
|
+
case T_THROW_STATEMENT: {
|
|
4505
4438
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4506
4439
|
if (state.cancel) return state;
|
|
4507
4440
|
if (!state.skipChildren) {
|
|
4508
|
-
state = visitNode(subject.
|
|
4441
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4509
4442
|
if (state.cancel) return state;
|
|
4510
4443
|
}
|
|
4511
4444
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4512
4445
|
return state;
|
|
4513
4446
|
}
|
|
4514
|
-
case
|
|
4447
|
+
case T_TRY_STATEMENT: {
|
|
4515
4448
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4516
4449
|
if (state.cancel) return state;
|
|
4517
4450
|
if (!state.skipChildren) {
|
|
4518
|
-
if (subject.
|
|
4519
|
-
state = visitNode(subject.
|
|
4451
|
+
if (subject.tryB) {
|
|
4452
|
+
state = visitNode(subject.tryB, state, stmtVisitor, exprVisitor, subject, "tryBlock");
|
|
4520
4453
|
}
|
|
4521
4454
|
if (state.cancel) return state;
|
|
4522
|
-
if (subject.
|
|
4523
|
-
state = visitNode(subject.
|
|
4455
|
+
if (subject.catchB) {
|
|
4456
|
+
state = visitNode(subject.catchB, state, stmtVisitor, exprVisitor, subject, "catchBlock");
|
|
4524
4457
|
}
|
|
4525
4458
|
if (state.cancel) return state;
|
|
4526
|
-
if (subject.
|
|
4527
|
-
state = visitNode(
|
|
4459
|
+
if (subject.finallyB) {
|
|
4460
|
+
state = visitNode(
|
|
4461
|
+
subject.finallyB,
|
|
4462
|
+
state,
|
|
4463
|
+
stmtVisitor,
|
|
4464
|
+
exprVisitor,
|
|
4465
|
+
subject,
|
|
4466
|
+
"finallyBlock"
|
|
4467
|
+
);
|
|
4528
4468
|
}
|
|
4529
4469
|
if (state.cancel) return state;
|
|
4530
4470
|
}
|
|
4531
4471
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4532
4472
|
return state;
|
|
4533
4473
|
}
|
|
4534
|
-
case
|
|
4474
|
+
case T_SWITCH_STATEMENT: {
|
|
4535
4475
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4536
4476
|
if (state.cancel) return state;
|
|
4537
4477
|
if (!state.skipChildren) {
|
|
4538
|
-
state = visitNode(subject.
|
|
4478
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4539
4479
|
if (state.cancel) return state;
|
|
4540
4480
|
for (const switchCase of subject.cases) {
|
|
4541
|
-
if (switchCase.
|
|
4542
|
-
state = visitNode(
|
|
4481
|
+
if (switchCase.caseE)
|
|
4482
|
+
state = visitNode(
|
|
4483
|
+
switchCase.caseE,
|
|
4484
|
+
state,
|
|
4485
|
+
stmtVisitor,
|
|
4486
|
+
exprVisitor,
|
|
4487
|
+
subject,
|
|
4488
|
+
"caseExpression"
|
|
4489
|
+
);
|
|
4543
4490
|
if (state.cancel) return state;
|
|
4544
|
-
if (switchCase.
|
|
4545
|
-
for (const statement of switchCase.
|
|
4546
|
-
state = visitNode(
|
|
4491
|
+
if (switchCase.stmts === void 0) continue;
|
|
4492
|
+
for (const statement of switchCase.stmts) {
|
|
4493
|
+
state = visitNode(
|
|
4494
|
+
statement,
|
|
4495
|
+
state,
|
|
4496
|
+
stmtVisitor,
|
|
4497
|
+
exprVisitor,
|
|
4498
|
+
subject,
|
|
4499
|
+
"switchStatement"
|
|
4500
|
+
);
|
|
4547
4501
|
if (state.cancel) return state;
|
|
4548
4502
|
}
|
|
4549
4503
|
}
|
|
@@ -4551,7 +4505,7 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4551
4505
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4552
4506
|
return state;
|
|
4553
4507
|
}
|
|
4554
|
-
case
|
|
4508
|
+
case T_FUNCTION_DECLARATION: {
|
|
4555
4509
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4556
4510
|
if (state.cancel) return state;
|
|
4557
4511
|
if (!state.skipChildren) {
|
|
@@ -4559,29 +4513,23 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4559
4513
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject, "arg");
|
|
4560
4514
|
if (state.cancel) return state;
|
|
4561
4515
|
}
|
|
4562
|
-
state = visitNode(subject.
|
|
4516
|
+
state = visitNode(subject.stmt, state, stmtVisitor, exprVisitor, subject, "statement");
|
|
4563
4517
|
if (state.cancel) return state;
|
|
4564
4518
|
}
|
|
4565
4519
|
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4566
4520
|
return state;
|
|
4567
4521
|
}
|
|
4568
|
-
case
|
|
4569
|
-
state = (stmtVisitor == null ? void 0 : stmtVisitor(true, subject, state, parent, tag)) || state;
|
|
4570
|
-
if (state.cancel) return state;
|
|
4571
|
-
state = (stmtVisitor == null ? void 0 : stmtVisitor(false, subject, state, parent, tag)) || state;
|
|
4572
|
-
return state;
|
|
4573
|
-
}
|
|
4574
|
-
case "UnaryE": {
|
|
4522
|
+
case T_UNARY_EXPRESSION: {
|
|
4575
4523
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4576
4524
|
if (state.cancel) return state;
|
|
4577
4525
|
if (!state.skipChildren) {
|
|
4578
|
-
state = visitNode(subject.
|
|
4526
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "operand");
|
|
4579
4527
|
if (state.cancel) return state;
|
|
4580
4528
|
}
|
|
4581
4529
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4582
4530
|
return state;
|
|
4583
4531
|
}
|
|
4584
|
-
case
|
|
4532
|
+
case T_BINARY_EXPRESSION: {
|
|
4585
4533
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4586
4534
|
if (state.cancel) return state;
|
|
4587
4535
|
if (!state.skipChildren) {
|
|
@@ -4593,11 +4541,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4593
4541
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4594
4542
|
return state;
|
|
4595
4543
|
}
|
|
4596
|
-
case
|
|
4544
|
+
case T_SEQUENCE_EXPRESSION: {
|
|
4597
4545
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4598
4546
|
if (state.cancel) return state;
|
|
4599
4547
|
if (!state.skipChildren) {
|
|
4600
|
-
for (const expr of subject.
|
|
4548
|
+
for (const expr of subject.exprs) {
|
|
4601
4549
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4602
4550
|
if (state.cancel) return state;
|
|
4603
4551
|
}
|
|
@@ -4605,21 +4553,21 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4605
4553
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4606
4554
|
return state;
|
|
4607
4555
|
}
|
|
4608
|
-
case
|
|
4556
|
+
case T_CONDITIONAL_EXPRESSION: {
|
|
4609
4557
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4610
4558
|
if (state.cancel) return state;
|
|
4611
4559
|
if (!state.skipChildren) {
|
|
4612
|
-
state = visitNode(subject.
|
|
4560
|
+
state = visitNode(subject.cond, state, stmtVisitor, exprVisitor, subject, "condition");
|
|
4613
4561
|
if (state.cancel) return state;
|
|
4614
|
-
state = visitNode(subject.
|
|
4562
|
+
state = visitNode(subject.thenE, state, stmtVisitor, exprVisitor, subject, "consequent");
|
|
4615
4563
|
if (state.cancel) return state;
|
|
4616
|
-
state = visitNode(subject.
|
|
4564
|
+
state = visitNode(subject.elseE, state, stmtVisitor, exprVisitor, subject, "alternate");
|
|
4617
4565
|
if (state.cancel) return state;
|
|
4618
4566
|
}
|
|
4619
4567
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4620
4568
|
return state;
|
|
4621
4569
|
}
|
|
4622
|
-
case
|
|
4570
|
+
case T_FUNCTION_INVOCATION_EXPRESSION: {
|
|
4623
4571
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4624
4572
|
if (state.cancel) return state;
|
|
4625
4573
|
if (!state.skipChildren) {
|
|
@@ -4627,27 +4575,27 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4627
4575
|
state = visitNode(arg, state, stmtVisitor, exprVisitor, subject, "argument");
|
|
4628
4576
|
if (state.cancel) return state;
|
|
4629
4577
|
}
|
|
4630
|
-
state = visitNode(subject.
|
|
4578
|
+
state = visitNode(subject.obj, state, stmtVisitor, exprVisitor, subject, "object");
|
|
4631
4579
|
if (state.cancel) return state;
|
|
4632
4580
|
}
|
|
4633
4581
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4634
4582
|
return state;
|
|
4635
4583
|
}
|
|
4636
|
-
case
|
|
4584
|
+
case T_MEMBER_ACCESS_EXPRESSION: {
|
|
4637
4585
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4638
4586
|
if (state.cancel) return state;
|
|
4639
4587
|
if (!state.skipChildren) {
|
|
4640
|
-
state = visitNode(subject.
|
|
4588
|
+
state = visitNode(subject.obj, state, stmtVisitor, exprVisitor, subject, "object");
|
|
4641
4589
|
if (state.cancel) return state;
|
|
4642
4590
|
}
|
|
4643
4591
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4644
4592
|
return state;
|
|
4645
4593
|
}
|
|
4646
|
-
case
|
|
4594
|
+
case T_CALCULATED_MEMBER_ACCESS_EXPRESSION: {
|
|
4647
4595
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4648
4596
|
if (state.cancel) return state;
|
|
4649
4597
|
if (!state.skipChildren) {
|
|
4650
|
-
state = visitNode(subject.
|
|
4598
|
+
state = visitNode(subject.obj, state, stmtVisitor, exprVisitor, subject, "object");
|
|
4651
4599
|
if (state.cancel) return state;
|
|
4652
4600
|
state = visitNode(subject.member, state, stmtVisitor, exprVisitor, subject, "member");
|
|
4653
4601
|
if (state.cancel) return state;
|
|
@@ -4655,15 +4603,15 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4655
4603
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4656
4604
|
return state;
|
|
4657
4605
|
}
|
|
4658
|
-
case
|
|
4606
|
+
case T_IDENTIFIER: {
|
|
4659
4607
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4660
4608
|
return state;
|
|
4661
4609
|
}
|
|
4662
|
-
case
|
|
4610
|
+
case T_LITERAL: {
|
|
4663
4611
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4664
4612
|
return state;
|
|
4665
4613
|
}
|
|
4666
|
-
case
|
|
4614
|
+
case T_ARRAY_LITERAL: {
|
|
4667
4615
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4668
4616
|
if (state.cancel) return state;
|
|
4669
4617
|
if (!state.skipChildren) {
|
|
@@ -4675,7 +4623,7 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4675
4623
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4676
4624
|
return state;
|
|
4677
4625
|
}
|
|
4678
|
-
case
|
|
4626
|
+
case T_OBJECT_LITERAL: {
|
|
4679
4627
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4680
4628
|
if (state.cancel) return state;
|
|
4681
4629
|
if (!state.skipChildren) {
|
|
@@ -4695,21 +4643,21 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4695
4643
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4696
4644
|
return state;
|
|
4697
4645
|
}
|
|
4698
|
-
case
|
|
4646
|
+
case T_SPREAD_EXPRESSION: {
|
|
4699
4647
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4700
4648
|
if (state.cancel) return state;
|
|
4701
4649
|
if (!state.skipChildren) {
|
|
4702
|
-
state = visitNode(subject.
|
|
4650
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "operand");
|
|
4703
4651
|
if (state.cancel) return state;
|
|
4704
4652
|
}
|
|
4705
4653
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4706
4654
|
return state;
|
|
4707
4655
|
}
|
|
4708
|
-
case
|
|
4656
|
+
case T_ASSIGNMENT_EXPRESSION: {
|
|
4709
4657
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4710
4658
|
if (state.cancel) return state;
|
|
4711
4659
|
if (!state.skipChildren) {
|
|
4712
|
-
state = visitNode(subject.
|
|
4660
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "operand");
|
|
4713
4661
|
if (state.cancel) return state;
|
|
4714
4662
|
state = visitNode(subject.leftValue, state, stmtVisitor, exprVisitor, subject, "leftValue");
|
|
4715
4663
|
if (state.cancel) return state;
|
|
@@ -4717,11 +4665,11 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4717
4665
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4718
4666
|
return state;
|
|
4719
4667
|
}
|
|
4720
|
-
case
|
|
4668
|
+
case T_NO_ARG_EXPRESSION: {
|
|
4721
4669
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4722
4670
|
return state;
|
|
4723
4671
|
}
|
|
4724
|
-
case
|
|
4672
|
+
case T_ARROW_EXPRESSION: {
|
|
4725
4673
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4726
4674
|
if (state.cancel) return state;
|
|
4727
4675
|
if (!state.skipChildren) {
|
|
@@ -4735,55 +4683,55 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4735
4683
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4736
4684
|
return state;
|
|
4737
4685
|
}
|
|
4738
|
-
case
|
|
4739
|
-
case
|
|
4686
|
+
case T_PREFIX_OP_EXPRESSION:
|
|
4687
|
+
case T_POSTFIX_OP_EXPRESSION: {
|
|
4740
4688
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4741
4689
|
if (state.cancel) return state;
|
|
4742
4690
|
if (!state.skipChildren) {
|
|
4743
|
-
state = visitNode(subject.
|
|
4691
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "operand");
|
|
4744
4692
|
if (state.cancel) return state;
|
|
4745
4693
|
}
|
|
4746
4694
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4747
4695
|
return state;
|
|
4748
4696
|
}
|
|
4749
|
-
case
|
|
4697
|
+
case T_VAR_DECLARATION: {
|
|
4750
4698
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4751
4699
|
if (state.cancel) return state;
|
|
4752
4700
|
if (!state.skipChildren) {
|
|
4753
|
-
if (subject.
|
|
4754
|
-
for (const expr of subject.
|
|
4701
|
+
if (subject.aDestr !== void 0) {
|
|
4702
|
+
for (const expr of subject.aDestr) {
|
|
4755
4703
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject);
|
|
4756
4704
|
if (state.cancel) return state;
|
|
4757
4705
|
}
|
|
4758
4706
|
}
|
|
4759
|
-
if (subject.
|
|
4760
|
-
for (const expr of subject.
|
|
4707
|
+
if (subject.oDestr !== void 0) {
|
|
4708
|
+
for (const expr of subject.oDestr) {
|
|
4761
4709
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject);
|
|
4762
4710
|
if (state.cancel) return state;
|
|
4763
4711
|
}
|
|
4764
4712
|
}
|
|
4765
|
-
if (subject.
|
|
4766
|
-
state = visitNode(subject.
|
|
4713
|
+
if (subject.expr) {
|
|
4714
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4767
4715
|
}
|
|
4768
4716
|
if (state.cancel) return state;
|
|
4769
4717
|
}
|
|
4770
4718
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4771
4719
|
return state;
|
|
4772
4720
|
}
|
|
4773
|
-
case
|
|
4774
|
-
case
|
|
4775
|
-
case
|
|
4721
|
+
case T_DESTRUCTURE:
|
|
4722
|
+
case T_OBJECT_DESTRUCTURE:
|
|
4723
|
+
case T_ARRAY_DESTRUCTURE: {
|
|
4776
4724
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4777
4725
|
if (state.cancel) return state;
|
|
4778
4726
|
if (!state.skipChildren) {
|
|
4779
|
-
if (subject.
|
|
4780
|
-
for (const expr of subject.
|
|
4727
|
+
if (subject.aDestr !== void 0) {
|
|
4728
|
+
for (const expr of subject.aDestr) {
|
|
4781
4729
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject);
|
|
4782
4730
|
if (state.cancel) return state;
|
|
4783
4731
|
}
|
|
4784
4732
|
}
|
|
4785
|
-
if (subject.
|
|
4786
|
-
for (const expr of subject.
|
|
4733
|
+
if (subject.oDestr !== void 0) {
|
|
4734
|
+
for (const expr of subject.oDestr) {
|
|
4787
4735
|
state = visitNode(expr, state, stmtVisitor, exprVisitor, subject);
|
|
4788
4736
|
if (state.cancel) return state;
|
|
4789
4737
|
}
|
|
@@ -4792,19 +4740,21 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4792
4740
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4793
4741
|
return state;
|
|
4794
4742
|
}
|
|
4795
|
-
case
|
|
4743
|
+
case T_REACTIVE_VAR_DECLARATION: {
|
|
4796
4744
|
state = (exprVisitor == null ? void 0 : exprVisitor(true, subject, state, parent, tag)) || state;
|
|
4797
4745
|
if (state.cancel) return state;
|
|
4798
4746
|
if (!state.skipChildren) {
|
|
4799
|
-
if (subject.
|
|
4800
|
-
state = visitNode(subject.
|
|
4747
|
+
if (subject.expr) {
|
|
4748
|
+
state = visitNode(subject.expr, state, stmtVisitor, exprVisitor, subject, "expression");
|
|
4801
4749
|
}
|
|
4802
4750
|
if (state.cancel) return state;
|
|
4803
4751
|
}
|
|
4804
4752
|
state = (exprVisitor == null ? void 0 : exprVisitor(false, subject, state, parent, tag)) || state;
|
|
4805
4753
|
return state;
|
|
4806
4754
|
}
|
|
4807
|
-
case
|
|
4755
|
+
case T_TEMPLATE_LITERAL_EXPRESSION:
|
|
4756
|
+
return state;
|
|
4757
|
+
case T_SWITCH_CASE:
|
|
4808
4758
|
return state;
|
|
4809
4759
|
default:
|
|
4810
4760
|
return state;
|
|
@@ -4813,13 +4763,12 @@ function visitNode(subject, state, stmtVisitor, exprVisitor, parent, tag) {
|
|
|
4813
4763
|
function isModuleErrors(result) {
|
|
4814
4764
|
return result.type !== "ScriptModule";
|
|
4815
4765
|
}
|
|
4816
|
-
function parseScriptModule(moduleName, source
|
|
4766
|
+
function parseScriptModule(moduleName, source) {
|
|
4817
4767
|
const parsedModules = /* @__PURE__ */ new Map();
|
|
4818
4768
|
const moduleErrors = {};
|
|
4819
|
-
const parsedModule = doParseModule(moduleName, source
|
|
4769
|
+
const parsedModule = doParseModule(moduleName, source);
|
|
4820
4770
|
return !parsedModule || Object.keys(moduleErrors).length > 0 ? moduleErrors : parsedModule;
|
|
4821
|
-
function doParseModule(moduleName2, source2
|
|
4822
|
-
var _a;
|
|
4771
|
+
function doParseModule(moduleName2, source2) {
|
|
4823
4772
|
if (parsedModules.has(moduleName2)) {
|
|
4824
4773
|
return parsedModules.get(moduleName2);
|
|
4825
4774
|
}
|
|
@@ -4837,133 +4786,39 @@ function parseScriptModule(moduleName, source, moduleResolver, restrictiveMode =
|
|
|
4837
4786
|
moduleErrors[moduleName2].push({
|
|
4838
4787
|
code: "W002",
|
|
4839
4788
|
text: errorMessages$1["W002"].replace(/\{(\d+)}/g, () => lastToken.text),
|
|
4840
|
-
position: lastToken.
|
|
4841
|
-
line: lastToken.
|
|
4842
|
-
column: lastToken.
|
|
4789
|
+
position: lastToken.startLine,
|
|
4790
|
+
line: lastToken.startLine,
|
|
4791
|
+
column: lastToken.startColumn
|
|
4843
4792
|
});
|
|
4844
4793
|
return null;
|
|
4845
4794
|
}
|
|
4846
4795
|
const errors = [];
|
|
4847
|
-
const emptyState = {
|
|
4848
|
-
data: null,
|
|
4849
|
-
cancel: false,
|
|
4850
|
-
skipChildren: false
|
|
4851
|
-
};
|
|
4852
|
-
visitNode(statements, emptyState, (before, stmt, state, parent, tag) => {
|
|
4853
|
-
if (!before) return state;
|
|
4854
|
-
if (topLevel) {
|
|
4855
|
-
switch (stmt.type) {
|
|
4856
|
-
case "VarS":
|
|
4857
|
-
if (parent) {
|
|
4858
|
-
addErrorMessage("W027", stmt);
|
|
4859
|
-
}
|
|
4860
|
-
break;
|
|
4861
|
-
case "FuncD":
|
|
4862
|
-
case "ImportD":
|
|
4863
|
-
break;
|
|
4864
|
-
default:
|
|
4865
|
-
if (restrictiveMode && !parent) {
|
|
4866
|
-
addErrorMessage("W028", stmt, stmt.type);
|
|
4867
|
-
}
|
|
4868
|
-
break;
|
|
4869
|
-
}
|
|
4870
|
-
} else {
|
|
4871
|
-
switch (stmt.type) {
|
|
4872
|
-
case "VarS":
|
|
4873
|
-
addErrorMessage("W027", stmt);
|
|
4874
|
-
break;
|
|
4875
|
-
case "FuncD":
|
|
4876
|
-
if (restrictiveMode && !stmt.isExported) {
|
|
4877
|
-
addErrorMessage("W029", stmt);
|
|
4878
|
-
}
|
|
4879
|
-
break;
|
|
4880
|
-
case "ImportD":
|
|
4881
|
-
break;
|
|
4882
|
-
default:
|
|
4883
|
-
if (restrictiveMode && !parent) {
|
|
4884
|
-
addErrorMessage("W028", stmt, stmt.type);
|
|
4885
|
-
}
|
|
4886
|
-
break;
|
|
4887
|
-
}
|
|
4888
|
-
}
|
|
4889
|
-
return state;
|
|
4890
|
-
});
|
|
4891
4796
|
const functions = {};
|
|
4892
|
-
statements.filter((stmt) => stmt.type ===
|
|
4797
|
+
statements.filter((stmt) => stmt.type === T_FUNCTION_DECLARATION).forEach((stmt) => {
|
|
4893
4798
|
const func = stmt;
|
|
4894
|
-
if (functions[func.name]) {
|
|
4895
|
-
addErrorMessage("W020", stmt, func.name);
|
|
4799
|
+
if (functions[func.id.name]) {
|
|
4800
|
+
addErrorMessage("W020", stmt, func.id.name);
|
|
4896
4801
|
return;
|
|
4897
4802
|
}
|
|
4898
|
-
functions[func.name] = func;
|
|
4899
|
-
});
|
|
4900
|
-
const exports = /* @__PURE__ */ new Map();
|
|
4901
|
-
statements.forEach((stmt) => {
|
|
4902
|
-
if (stmt.type === "ConstS" && stmt.isExported) {
|
|
4903
|
-
visitLetConstDeclarations(stmt, (id) => {
|
|
4904
|
-
if (exports.has(id)) {
|
|
4905
|
-
addErrorMessage("W021", stmt, id);
|
|
4906
|
-
} else {
|
|
4907
|
-
exports.set(id, stmt);
|
|
4908
|
-
}
|
|
4909
|
-
});
|
|
4910
|
-
} else if (stmt.type === "FuncD" && stmt.isExported) {
|
|
4911
|
-
if (exports.has(stmt.name)) {
|
|
4912
|
-
addErrorMessage("W021", stmt, stmt.name);
|
|
4913
|
-
} else {
|
|
4914
|
-
exports.set(stmt.name, stmt);
|
|
4915
|
-
}
|
|
4916
|
-
}
|
|
4803
|
+
functions[func.id.name] = func;
|
|
4917
4804
|
});
|
|
4918
4805
|
const parsedModule2 = {
|
|
4919
4806
|
type: "ScriptModule",
|
|
4920
4807
|
name: moduleName2,
|
|
4921
4808
|
exports,
|
|
4922
|
-
importedModules: [],
|
|
4923
|
-
imports: {},
|
|
4924
4809
|
functions,
|
|
4925
4810
|
statements,
|
|
4811
|
+
sources: /* @__PURE__ */ new Map(),
|
|
4926
4812
|
executed: false
|
|
4927
4813
|
};
|
|
4928
4814
|
parsedModules.set(moduleName2, parsedModule2);
|
|
4929
|
-
const importedModules = [];
|
|
4930
|
-
const imports = {};
|
|
4931
|
-
for (let i = 0; i < statements.length; i++) {
|
|
4932
|
-
const stmt = statements[i];
|
|
4933
|
-
if (stmt.type !== "ImportD") {
|
|
4934
|
-
continue;
|
|
4935
|
-
}
|
|
4936
|
-
const source3 = moduleResolver2(moduleName2, stmt.moduleFile);
|
|
4937
|
-
if (source3 === null) {
|
|
4938
|
-
addErrorMessage("W022", stmt, stmt.moduleFile);
|
|
4939
|
-
continue;
|
|
4940
|
-
}
|
|
4941
|
-
const imported = doParseModule(stmt.moduleFile, source3, moduleResolver2);
|
|
4942
|
-
if (!imported) {
|
|
4943
|
-
return;
|
|
4944
|
-
}
|
|
4945
|
-
importedModules.push(imported);
|
|
4946
|
-
const importedItems = Object.keys(stmt.imports);
|
|
4947
|
-
if (importedItems.length > 0) {
|
|
4948
|
-
imports[_a = stmt.moduleFile] ?? (imports[_a] = {});
|
|
4949
|
-
}
|
|
4950
|
-
for (const key of importedItems) {
|
|
4951
|
-
if (imported.exports.has(stmt.imports[key])) {
|
|
4952
|
-
imports[stmt.moduleFile][key] = imported.exports.get(stmt.imports[key]);
|
|
4953
|
-
} else {
|
|
4954
|
-
addErrorMessage("W023", stmt, stmt.moduleFile, key);
|
|
4955
|
-
}
|
|
4956
|
-
}
|
|
4957
|
-
}
|
|
4958
4815
|
if (errors.length > 0) {
|
|
4959
4816
|
moduleErrors[moduleName2] = errors;
|
|
4960
4817
|
return null;
|
|
4961
4818
|
}
|
|
4962
|
-
importedModules.forEach((m) => m.parent = parsedModule2);
|
|
4963
|
-
parsedModule2.importedModules = importedModules;
|
|
4964
|
-
parsedModule2.imports = imports;
|
|
4965
4819
|
return parsedModule2;
|
|
4966
4820
|
function addErrorMessage(code, stmt, ...args) {
|
|
4821
|
+
var _a, _b, _c;
|
|
4967
4822
|
let errorText = errorMessages$1[code];
|
|
4968
4823
|
if (args) {
|
|
4969
4824
|
args.forEach(
|
|
@@ -4973,150 +4828,70 @@ function parseScriptModule(moduleName, source, moduleResolver, restrictiveMode =
|
|
|
4973
4828
|
errors.push({
|
|
4974
4829
|
code,
|
|
4975
4830
|
text: errorMessages$1[code].replace(/\{(\d+)}/g, (_, index) => args[index]),
|
|
4976
|
-
position: stmt.startPosition,
|
|
4977
|
-
line: stmt.startLine,
|
|
4978
|
-
column: stmt.startColumn
|
|
4831
|
+
position: (_a = stmt.startToken) == null ? void 0 : _a.startPosition,
|
|
4832
|
+
line: (_b = stmt.startToken) == null ? void 0 : _b.startLine,
|
|
4833
|
+
column: (_c = stmt.startToken) == null ? void 0 : _c.startColumn
|
|
4979
4834
|
});
|
|
4980
4835
|
}
|
|
4981
4836
|
}
|
|
4982
4837
|
}
|
|
4983
|
-
function obtainClosures(thread) {
|
|
4984
|
-
var _a;
|
|
4985
|
-
const closures = ((_a = thread.blocks) == null ? void 0 : _a.slice(0)) ?? [];
|
|
4986
|
-
return thread.parent ? [...obtainClosures(thread.parent), ...closures] : closures;
|
|
4987
|
-
}
|
|
4988
|
-
function visitLetConstDeclarations(declaration, visitor) {
|
|
4989
|
-
for (let i = 0; i < declaration.declarations.length; i++) {
|
|
4990
|
-
const decl = declaration.declarations[i];
|
|
4991
|
-
visitDeclaration(decl, visitor);
|
|
4992
|
-
}
|
|
4993
|
-
function visitDeclaration(varDecl, visitor2) {
|
|
4994
|
-
if (varDecl.id) {
|
|
4995
|
-
visitor2(varDecl.id);
|
|
4996
|
-
} else if (varDecl.arrayDestruct) {
|
|
4997
|
-
visitArrayDestruct(varDecl.arrayDestruct, visitor2);
|
|
4998
|
-
} else if (varDecl.objectDestruct) {
|
|
4999
|
-
visitObjectDestruct(varDecl.objectDestruct, visitor2);
|
|
5000
|
-
} else {
|
|
5001
|
-
throw new Error("Unknown declaration specifier");
|
|
5002
|
-
}
|
|
5003
|
-
}
|
|
5004
|
-
function visitArrayDestruct(arrayD, visitor2) {
|
|
5005
|
-
for (let i = 0; i < arrayD.length; i++) {
|
|
5006
|
-
const arrDecl = arrayD[i];
|
|
5007
|
-
if (arrDecl.id) {
|
|
5008
|
-
visitor2(arrDecl.id);
|
|
5009
|
-
} else if (arrDecl.arrayDestruct) {
|
|
5010
|
-
visitArrayDestruct(arrDecl.arrayDestruct, visitor2);
|
|
5011
|
-
} else if (arrDecl.objectDestruct) {
|
|
5012
|
-
visitObjectDestruct(arrDecl.objectDestruct, visitor2);
|
|
5013
|
-
}
|
|
5014
|
-
}
|
|
5015
|
-
}
|
|
5016
|
-
function visitObjectDestruct(objectD, visitor2) {
|
|
5017
|
-
for (let i = 0; i < objectD.length; i++) {
|
|
5018
|
-
const objDecl = objectD[i];
|
|
5019
|
-
if (objDecl.arrayDestruct) {
|
|
5020
|
-
visitArrayDestruct(objDecl.arrayDestruct, visitor2);
|
|
5021
|
-
} else if (objDecl.objectDestruct) {
|
|
5022
|
-
visitObjectDestruct(objDecl.objectDestruct, visitor2);
|
|
5023
|
-
} else {
|
|
5024
|
-
visitor2(objDecl.alias ?? objDecl.id);
|
|
5025
|
-
}
|
|
5026
|
-
}
|
|
5027
|
-
}
|
|
5028
|
-
}
|
|
5029
4838
|
const PARSED_MARK_PROP = "__PARSED__";
|
|
5030
|
-
function collectCodeBehindFromSource(moduleName, source
|
|
4839
|
+
function collectCodeBehindFromSource(moduleName, source) {
|
|
5031
4840
|
const result = {
|
|
5032
4841
|
vars: {},
|
|
5033
4842
|
moduleErrors: {},
|
|
5034
4843
|
functions: {}
|
|
5035
4844
|
};
|
|
5036
4845
|
const collectedFunctions = {};
|
|
5037
|
-
const parsedModule = parseScriptModule(moduleName, source
|
|
4846
|
+
const parsedModule = parseScriptModule(moduleName, source);
|
|
5038
4847
|
if (isModuleErrors(parsedModule)) {
|
|
5039
4848
|
return { ...result, moduleErrors: parsedModule };
|
|
5040
4849
|
}
|
|
5041
|
-
const mainModuleResolvedName = moduleNameResolver(parsedModule.name);
|
|
5042
4850
|
parsedModule.statements.forEach((stmt) => {
|
|
5043
4851
|
switch (stmt.type) {
|
|
5044
|
-
case
|
|
5045
|
-
stmt.
|
|
5046
|
-
if (decl.id in result.vars) {
|
|
5047
|
-
throw new Error(`Duplicated var declaration: '${decl.id}'`);
|
|
4852
|
+
case T_VAR_STATEMENT:
|
|
4853
|
+
stmt.decls.forEach((decl) => {
|
|
4854
|
+
if (decl.id.name in result.vars) {
|
|
4855
|
+
throw new Error(`Duplicated var declaration: '${decl.id.name}'`);
|
|
5048
4856
|
}
|
|
5049
|
-
result.vars[decl.id] = {
|
|
4857
|
+
result.vars[decl.id.name] = {
|
|
5050
4858
|
[PARSED_MARK_PROP]: true,
|
|
5051
|
-
|
|
5052
|
-
tree: decl.expression
|
|
4859
|
+
tree: decl.expr
|
|
5053
4860
|
};
|
|
5054
4861
|
});
|
|
5055
4862
|
break;
|
|
5056
|
-
case
|
|
5057
|
-
addFunctionDeclaration(
|
|
5058
|
-
break;
|
|
5059
|
-
case "ImportD":
|
|
4863
|
+
case T_FUNCTION_DECLARATION:
|
|
4864
|
+
addFunctionDeclaration(stmt);
|
|
5060
4865
|
break;
|
|
5061
4866
|
default:
|
|
5062
4867
|
throw new Error(`'${stmt.type}' is not allowed in a code-behind module.`);
|
|
5063
4868
|
}
|
|
5064
4869
|
});
|
|
5065
|
-
collectFuncs(parsedModule);
|
|
5066
4870
|
return result;
|
|
5067
|
-
function
|
|
5068
|
-
|
|
5069
|
-
const resolvedModuleName = moduleNameResolver(currentModule.name);
|
|
5070
|
-
if ((_a = collectedFunctions == null ? void 0 : collectedFunctions[resolvedModuleName]) == null ? void 0 : _a.collectedImportsFrom) {
|
|
5071
|
-
return;
|
|
5072
|
-
}
|
|
5073
|
-
for (const modName in currentModule.imports) {
|
|
5074
|
-
const resolvedImportedModuleName = moduleNameResolver(modName);
|
|
5075
|
-
const mod = currentModule.imports[modName];
|
|
5076
|
-
for (const obj of Object.values(mod)) {
|
|
5077
|
-
if (obj.type === "FuncD") {
|
|
5078
|
-
addFunctionDeclaration(resolvedImportedModuleName, obj);
|
|
5079
|
-
}
|
|
5080
|
-
}
|
|
5081
|
-
}
|
|
5082
|
-
collectedFunctions[resolvedModuleName] ?? (collectedFunctions[resolvedModuleName] = { collectedImportsFrom: true });
|
|
5083
|
-
collectedFunctions[resolvedModuleName].collectedImportsFrom = true;
|
|
5084
|
-
for (let nextModule of currentModule.importedModules) {
|
|
5085
|
-
collectFuncs(nextModule);
|
|
5086
|
-
}
|
|
5087
|
-
}
|
|
5088
|
-
function addFunctionDeclaration(resolvedModuleName, stmt) {
|
|
5089
|
-
var _a2, _b, _c, _d;
|
|
5090
|
-
var _a;
|
|
5091
|
-
if (((_b = (_a2 = collectedFunctions == null ? void 0 : collectedFunctions[resolvedModuleName]) == null ? void 0 : _a2.functions) == null ? void 0 : _b[stmt.name]) !== void 0) {
|
|
4871
|
+
function addFunctionDeclaration(stmt) {
|
|
4872
|
+
if ((collectedFunctions == null ? void 0 : collectedFunctions[stmt.id.name]) !== void 0) {
|
|
5092
4873
|
return;
|
|
5093
4874
|
}
|
|
5094
|
-
if (stmt.name in result.functions) {
|
|
5095
|
-
throw new Error(`Duplicated function declaration: '${stmt.name}'`);
|
|
4875
|
+
if (stmt.id.name in result.functions) {
|
|
4876
|
+
throw new Error(`Duplicated function declaration: '${stmt.id.name}'`);
|
|
5096
4877
|
}
|
|
5097
|
-
const funcSource = stmt.args.length === 1 ? `${stmt.args[0].source} => ${stmt.statement.source}` : `(${stmt.args.map((a) => a.source).join(", ")}) => ${stmt.statement.source}`;
|
|
5098
4878
|
const arrow = {
|
|
5099
|
-
type:
|
|
4879
|
+
type: T_ARROW_EXPRESSION,
|
|
5100
4880
|
args: stmt.args.slice(),
|
|
5101
|
-
statement: stmt.
|
|
5102
|
-
closureContext: obtainClosures({
|
|
5103
|
-
|
|
5104
|
-
}
|
|
4881
|
+
statement: stmt.stmt
|
|
4882
|
+
// closureContext: obtainClosures({
|
|
4883
|
+
// childThreads: [],
|
|
4884
|
+
// blocks: [{ vars: {} }],
|
|
4885
|
+
// loops: [],
|
|
4886
|
+
// breakLabelValue: -1,
|
|
4887
|
+
// }),
|
|
5105
4888
|
};
|
|
5106
|
-
|
|
5107
|
-
if (functionSelf == null ? void 0 : functionSelf.closureContext) {
|
|
5108
|
-
delete functionSelf.closureContext;
|
|
5109
|
-
}
|
|
5110
|
-
collectedFunctions[resolvedModuleName] ?? (collectedFunctions[resolvedModuleName] = { functions: {}, collectedImportsFrom: false });
|
|
5111
|
-
(_a = collectedFunctions[resolvedModuleName]).functions ?? (_a.functions = {});
|
|
5112
|
-
collectedFunctions[resolvedModuleName].functions[stmt.name] = {
|
|
4889
|
+
collectedFunctions[stmt.id.name] = {
|
|
5113
4890
|
[PARSED_MARK_PROP]: true,
|
|
5114
|
-
source: funcSource,
|
|
5115
4891
|
tree: arrow
|
|
5116
4892
|
};
|
|
5117
|
-
result.functions[stmt.name] = {
|
|
4893
|
+
result.functions[stmt.id.name] = {
|
|
5118
4894
|
[PARSED_MARK_PROP]: true,
|
|
5119
|
-
source: funcSource,
|
|
5120
4895
|
tree: arrow
|
|
5121
4896
|
};
|
|
5122
4897
|
}
|
|
@@ -5138,12 +4913,6 @@ function removeCodeBehindTokensFromTree(declarations) {
|
|
|
5138
4913
|
const nodeVisitor = (before, visited, state2) => {
|
|
5139
4914
|
if (before) {
|
|
5140
4915
|
if (visited) {
|
|
5141
|
-
delete visited.startPosition;
|
|
5142
|
-
delete visited.endPosition;
|
|
5143
|
-
delete visited.startLine;
|
|
5144
|
-
delete visited.endLine;
|
|
5145
|
-
delete visited.startColumn;
|
|
5146
|
-
delete visited.endColumn;
|
|
5147
4916
|
delete visited.startToken;
|
|
5148
4917
|
delete visited.endToken;
|
|
5149
4918
|
}
|
|
@@ -5226,7 +4995,7 @@ const HelperNode = {
|
|
|
5226
4995
|
item: "item",
|
|
5227
4996
|
field: "field"
|
|
5228
4997
|
};
|
|
5229
|
-
function nodeToComponentDef(node, originalGetText, fileId
|
|
4998
|
+
function nodeToComponentDef(node, originalGetText, fileId) {
|
|
5230
4999
|
const getText = (node2) => {
|
|
5231
5000
|
return node2.text ?? originalGetText(node2);
|
|
5232
5001
|
};
|
|
@@ -5256,7 +5025,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5256
5025
|
function transformInnerElement(usesStack2, node2) {
|
|
5257
5026
|
const name = getNamespaceResolvedComponentName(node2, getText, namespaceStack);
|
|
5258
5027
|
if (name === COMPOUND_COMP_ID) {
|
|
5259
|
-
reportError("T006");
|
|
5028
|
+
reportError$1("T006");
|
|
5260
5029
|
}
|
|
5261
5030
|
let component = {
|
|
5262
5031
|
type: name,
|
|
@@ -5275,10 +5044,10 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5275
5044
|
const attrs = getAttributes(node2).map(segmentAttr);
|
|
5276
5045
|
const compoundName = attrs.find((attr) => attr.name === "name");
|
|
5277
5046
|
if (!compoundName) {
|
|
5278
|
-
reportError("T003");
|
|
5047
|
+
reportError$1("T003");
|
|
5279
5048
|
}
|
|
5280
5049
|
if (!UCRegex.test(compoundName.value)) {
|
|
5281
|
-
reportError("T004");
|
|
5050
|
+
reportError$1("T004");
|
|
5282
5051
|
}
|
|
5283
5052
|
let api;
|
|
5284
5053
|
const apiAttrs = attrs.filter((attr) => attr.startSegment === "method");
|
|
@@ -5325,10 +5094,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5325
5094
|
attrs.filter((attr) => attr.namespace === "xmlns").forEach((attr) => {
|
|
5326
5095
|
addToNamespaces(namespaceStack, element2, attr.unsegmentedName, attr.value);
|
|
5327
5096
|
});
|
|
5328
|
-
let nestedComponent = transformInnerElement(
|
|
5329
|
-
usesStack,
|
|
5330
|
-
element2
|
|
5331
|
-
);
|
|
5097
|
+
let nestedComponent = transformInnerElement(usesStack, element2);
|
|
5332
5098
|
namespaceStack.pop();
|
|
5333
5099
|
const component = {
|
|
5334
5100
|
name: compoundName.value,
|
|
@@ -5370,7 +5136,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5370
5136
|
childNodes.forEach((child) => {
|
|
5371
5137
|
if (child.kind === SyntaxKind.Script) {
|
|
5372
5138
|
if (getAttributes(child).length > 0) {
|
|
5373
|
-
reportError("T022");
|
|
5139
|
+
reportError$1("T022");
|
|
5374
5140
|
}
|
|
5375
5141
|
const scriptText = getText(child);
|
|
5376
5142
|
const scriptContent = scriptText.slice(
|
|
@@ -5440,7 +5206,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5440
5206
|
},
|
|
5441
5207
|
(name) => {
|
|
5442
5208
|
if (onPrefixRegex.test(name)) {
|
|
5443
|
-
reportError("T008", name);
|
|
5209
|
+
reportError$1("T008", name);
|
|
5444
5210
|
}
|
|
5445
5211
|
}
|
|
5446
5212
|
);
|
|
@@ -5483,7 +5249,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5483
5249
|
);
|
|
5484
5250
|
return;
|
|
5485
5251
|
default:
|
|
5486
|
-
reportError("T009", childName);
|
|
5252
|
+
reportError$1("T009", childName);
|
|
5487
5253
|
return;
|
|
5488
5254
|
}
|
|
5489
5255
|
});
|
|
@@ -5494,12 +5260,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5494
5260
|
const parser = new Parser(comp.script);
|
|
5495
5261
|
try {
|
|
5496
5262
|
parser.parseStatements();
|
|
5497
|
-
comp.scriptCollected = collectCodeBehindFromSource(
|
|
5498
|
-
"Main",
|
|
5499
|
-
comp.script,
|
|
5500
|
-
moduleResolver,
|
|
5501
|
-
(a) => a
|
|
5502
|
-
);
|
|
5263
|
+
comp.scriptCollected = collectCodeBehindFromSource("Main", comp.script);
|
|
5503
5264
|
} catch (err) {
|
|
5504
5265
|
if (parser.errors && parser.errors.length > 0) {
|
|
5505
5266
|
comp.scriptError = parser.errors;
|
|
@@ -5520,14 +5281,14 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5520
5281
|
const isCompound = !isComponent(comp);
|
|
5521
5282
|
if (isCompound) {
|
|
5522
5283
|
if (startSegment && startSegment !== "method" && startSegment !== "var") {
|
|
5523
|
-
reportError("T021");
|
|
5284
|
+
reportError$1("T021");
|
|
5524
5285
|
return;
|
|
5525
5286
|
}
|
|
5526
5287
|
if (name === "name" && !startSegment) {
|
|
5527
5288
|
return;
|
|
5528
5289
|
}
|
|
5529
5290
|
if (!startSegment && name) {
|
|
5530
|
-
reportError("T021", name);
|
|
5291
|
+
reportError$1("T021", name);
|
|
5531
5292
|
}
|
|
5532
5293
|
return;
|
|
5533
5294
|
}
|
|
@@ -5574,7 +5335,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5574
5335
|
if (child.kind !== SyntaxKind.ElementNode) return;
|
|
5575
5336
|
const childName = getComponentName(child, getText);
|
|
5576
5337
|
if (childName !== "field" && childName !== "item") {
|
|
5577
|
-
reportError("T016");
|
|
5338
|
+
reportError$1("T016");
|
|
5578
5339
|
return;
|
|
5579
5340
|
}
|
|
5580
5341
|
if (childName === "field") {
|
|
@@ -5582,7 +5343,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5582
5343
|
nestedElementType = childName;
|
|
5583
5344
|
result = {};
|
|
5584
5345
|
} else if (nestedElementType !== childName) {
|
|
5585
|
-
reportError("T017");
|
|
5346
|
+
reportError$1("T017");
|
|
5586
5347
|
return;
|
|
5587
5348
|
}
|
|
5588
5349
|
} else if (childName === "item") {
|
|
@@ -5590,7 +5351,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5590
5351
|
nestedElementType = childName;
|
|
5591
5352
|
result = [];
|
|
5592
5353
|
} else if (nestedElementType !== childName) {
|
|
5593
|
-
reportError("T017");
|
|
5354
|
+
reportError$1("T017");
|
|
5594
5355
|
return;
|
|
5595
5356
|
}
|
|
5596
5357
|
}
|
|
@@ -5618,30 +5379,30 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5618
5379
|
const attributes = getAttributes(element2).map(segmentAttr);
|
|
5619
5380
|
const attrProps = attributes.filter((attr) => propAttrs.indexOf(attr.name) >= 0);
|
|
5620
5381
|
if (attributes.length > attrProps.length) {
|
|
5621
|
-
reportError("T011", elementName);
|
|
5382
|
+
reportError$1("T011", elementName);
|
|
5622
5383
|
return null;
|
|
5623
5384
|
}
|
|
5624
5385
|
const nameAttr = attrProps.find((attr) => attr.name === "name");
|
|
5625
5386
|
if (allowName) {
|
|
5626
5387
|
if (!(nameAttr == null ? void 0 : nameAttr.value)) {
|
|
5627
|
-
reportError("T012", elementName);
|
|
5388
|
+
reportError$1("T012", elementName);
|
|
5628
5389
|
return null;
|
|
5629
5390
|
}
|
|
5630
5391
|
} else {
|
|
5631
5392
|
if (nameAttr) {
|
|
5632
|
-
reportError("T018", elementName);
|
|
5393
|
+
reportError$1("T018", elementName);
|
|
5633
5394
|
return null;
|
|
5634
5395
|
}
|
|
5635
5396
|
}
|
|
5636
5397
|
const name = nameAttr == null ? void 0 : nameAttr.value;
|
|
5637
5398
|
const valueAttr = attrProps.find((attr) => attr.name === "value");
|
|
5638
5399
|
if (valueAttr && valueAttr.value === void 0) {
|
|
5639
|
-
reportError("T019", elementName);
|
|
5400
|
+
reportError$1("T019", elementName);
|
|
5640
5401
|
return null;
|
|
5641
5402
|
}
|
|
5642
5403
|
if (name && nestedComponents.length >= 1) {
|
|
5643
5404
|
if (nestedElements.length > 0) {
|
|
5644
|
-
reportError("T020");
|
|
5405
|
+
reportError$1("T020");
|
|
5645
5406
|
return null;
|
|
5646
5407
|
}
|
|
5647
5408
|
const nestedComps = nestedComponents.map((nc) => transformInnerElement(usesStack2, nc));
|
|
@@ -5662,7 +5423,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5662
5423
|
function collectLoadersElements(usesStack2, comp, loaders) {
|
|
5663
5424
|
var _a;
|
|
5664
5425
|
if (!isComponent(comp)) {
|
|
5665
|
-
reportError("T009", "loaders");
|
|
5426
|
+
reportError$1("T009", "loaders");
|
|
5666
5427
|
return;
|
|
5667
5428
|
}
|
|
5668
5429
|
const children = getChildNodes(loaders);
|
|
@@ -5671,29 +5432,29 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5671
5432
|
}
|
|
5672
5433
|
const hasAttribute = (_a = loaders.children) == null ? void 0 : _a.some((c) => c.kind === SyntaxKind.AttributeListNode);
|
|
5673
5434
|
if (hasAttribute) {
|
|
5674
|
-
reportError("T014", "attributes");
|
|
5435
|
+
reportError$1("T014", "attributes");
|
|
5675
5436
|
return;
|
|
5676
5437
|
}
|
|
5677
5438
|
children.forEach((loader) => {
|
|
5678
5439
|
if (loader.kind === SyntaxKind.TextNode) {
|
|
5679
|
-
reportError("T010", "loader");
|
|
5440
|
+
reportError$1("T010", "loader");
|
|
5680
5441
|
return;
|
|
5681
5442
|
}
|
|
5682
5443
|
const loaderDef = transformInnerElement(usesStack2, loader);
|
|
5683
5444
|
if (!loaderDef.uid) {
|
|
5684
|
-
reportError("T013");
|
|
5445
|
+
reportError$1("T013");
|
|
5685
5446
|
return;
|
|
5686
5447
|
}
|
|
5687
5448
|
if (loaderDef.vars) {
|
|
5688
|
-
reportError("T014", "vars");
|
|
5449
|
+
reportError$1("T014", "vars");
|
|
5689
5450
|
return;
|
|
5690
5451
|
}
|
|
5691
5452
|
if (loaderDef.loaders) {
|
|
5692
|
-
reportError("T014", "loaders");
|
|
5453
|
+
reportError$1("T014", "loaders");
|
|
5693
5454
|
return;
|
|
5694
5455
|
}
|
|
5695
5456
|
if (loaderDef.uses) {
|
|
5696
|
-
reportError("T014", "uses");
|
|
5457
|
+
reportError$1("T014", "uses");
|
|
5697
5458
|
return;
|
|
5698
5459
|
}
|
|
5699
5460
|
comp.loaders ?? (comp.loaders = []);
|
|
@@ -5720,13 +5481,13 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5720
5481
|
}
|
|
5721
5482
|
function collectUsesElements(comp, uses) {
|
|
5722
5483
|
if (!isComponent(comp)) {
|
|
5723
|
-
reportError("T009", "uses");
|
|
5484
|
+
reportError$1("T009", "uses");
|
|
5724
5485
|
return;
|
|
5725
5486
|
}
|
|
5726
5487
|
const attributes = getAttributes(uses).map(segmentAttr);
|
|
5727
5488
|
const valueAttr = attributes.find((attr) => attr.name === "value");
|
|
5728
5489
|
if (!(valueAttr == null ? void 0 : valueAttr.value) || attributes.length !== 1) {
|
|
5729
|
-
reportError("T015", "uses");
|
|
5490
|
+
reportError$1("T015", "uses");
|
|
5730
5491
|
return;
|
|
5731
5492
|
}
|
|
5732
5493
|
comp.uses ?? (comp.uses = valueAttr.value.split(",").map((v) => v.trim()));
|
|
@@ -5741,7 +5502,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5741
5502
|
let unsegmentedName = getText(key.children[key.children.length - 1]);
|
|
5742
5503
|
const segments = unsegmentedName.split(".");
|
|
5743
5504
|
if (segments.length > 2) {
|
|
5744
|
-
reportError("T007", attr, key);
|
|
5505
|
+
reportError$1("T007", attr, key);
|
|
5745
5506
|
}
|
|
5746
5507
|
let name;
|
|
5747
5508
|
let startSegment;
|
|
@@ -5749,7 +5510,7 @@ function nodeToComponentDef(node, originalGetText, fileId, moduleResolver = () =
|
|
|
5749
5510
|
startSegment = segments[0];
|
|
5750
5511
|
name = segments[1];
|
|
5751
5512
|
if (name.trim() === "") {
|
|
5752
|
-
reportError("T007", attr, name);
|
|
5513
|
+
reportError$1("T007", attr, name);
|
|
5753
5514
|
}
|
|
5754
5515
|
} else {
|
|
5755
5516
|
name = unsegmentedName;
|
|
@@ -6032,7 +5793,7 @@ function createTextNodeElement(textValue) {
|
|
|
6032
5793
|
]
|
|
6033
5794
|
};
|
|
6034
5795
|
}
|
|
6035
|
-
function reportError(errorCode, ...options) {
|
|
5796
|
+
function reportError$1(errorCode, ...options) {
|
|
6036
5797
|
let errorText = errorMessages[errorCode] ?? "Unknown error";
|
|
6037
5798
|
if (options) {
|
|
6038
5799
|
options.forEach((o, idx) => errorText = replace(errorText, `{${idx}}`, o.toString()));
|
|
@@ -6135,17 +5896,17 @@ function desugarQuotelessAttrs(attrs, getText) {
|
|
|
6135
5896
|
function addToNamespaces(namespaceStack, comp, nsKey, value) {
|
|
6136
5897
|
let nsCommaSeparated = value.split(":");
|
|
6137
5898
|
if (nsCommaSeparated.length > 2) {
|
|
6138
|
-
return reportError("T028", value, "Namespace cannot contain multiple ':' (colon).");
|
|
5899
|
+
return reportError$1("T028", value, "Namespace cannot contain multiple ':' (colon).");
|
|
6139
5900
|
}
|
|
6140
5901
|
let nsValue = value;
|
|
6141
5902
|
if (nsCommaSeparated.length === 2) {
|
|
6142
5903
|
if (nsCommaSeparated[0] != COMPONENT_NAMESPACE_SCHEME) {
|
|
6143
|
-
return reportError("T029", value, COMPONENT_NAMESPACE_SCHEME);
|
|
5904
|
+
return reportError$1("T029", value, COMPONENT_NAMESPACE_SCHEME);
|
|
6144
5905
|
}
|
|
6145
5906
|
nsValue = nsCommaSeparated[1];
|
|
6146
5907
|
}
|
|
6147
5908
|
if (nsValue.includes("#")) {
|
|
6148
|
-
return reportError("T028", nsValue, "Namespace cannot contain character '#'.");
|
|
5909
|
+
return reportError$1("T028", nsValue, "Namespace cannot contain character '#'.");
|
|
6149
5910
|
}
|
|
6150
5911
|
switch (nsValue) {
|
|
6151
5912
|
case COMPONENT_NAMESPACE_SCHEME:
|
|
@@ -6160,7 +5921,7 @@ function addToNamespaces(namespaceStack, comp, nsKey, value) {
|
|
|
6160
5921
|
}
|
|
6161
5922
|
const compNamespaces = namespaceStack[namespaceStack.length - 1];
|
|
6162
5923
|
if (compNamespaces.has(nsKey)) {
|
|
6163
|
-
return reportError("T025", nsKey);
|
|
5924
|
+
return reportError$1("T025", nsKey);
|
|
6164
5925
|
}
|
|
6165
5926
|
compNamespaces.set(nsKey, nsValue);
|
|
6166
5927
|
comp.namespaces ?? (comp.namespaces = {});
|
|
@@ -6168,11 +5929,11 @@ function addToNamespaces(namespaceStack, comp, nsKey, value) {
|
|
|
6168
5929
|
}
|
|
6169
5930
|
function getTopLvlElement(node, getText) {
|
|
6170
5931
|
if (node.children.length !== 2) {
|
|
6171
|
-
reportError("T001");
|
|
5932
|
+
reportError$1("T001");
|
|
6172
5933
|
}
|
|
6173
5934
|
const element = node.children[0];
|
|
6174
5935
|
if (element.kind !== SyntaxKind.ElementNode) {
|
|
6175
|
-
reportError("T001");
|
|
5936
|
+
reportError$1("T001");
|
|
6176
5937
|
}
|
|
6177
5938
|
return element;
|
|
6178
5939
|
}
|
|
@@ -6189,7 +5950,7 @@ function getNamespaceResolvedComponentName(node, getText, namespaceStack) {
|
|
|
6189
5950
|
}
|
|
6190
5951
|
const namespace = getText(nameTokens[0]);
|
|
6191
5952
|
if (namespaceStack.length === 0) {
|
|
6192
|
-
reportError("T026");
|
|
5953
|
+
reportError$1("T026");
|
|
6193
5954
|
}
|
|
6194
5955
|
let resolvedNamespace = void 0;
|
|
6195
5956
|
for (let i = namespaceStack.length - 1; i >= 0; --i) {
|
|
@@ -6199,7 +5960,7 @@ function getNamespaceResolvedComponentName(node, getText, namespaceStack) {
|
|
|
6199
5960
|
}
|
|
6200
5961
|
}
|
|
6201
5962
|
if (resolvedNamespace === void 0) {
|
|
6202
|
-
reportError("T027", namespace);
|
|
5963
|
+
reportError$1("T027", namespace);
|
|
6203
5964
|
}
|
|
6204
5965
|
return resolvedNamespace + "." + name;
|
|
6205
5966
|
}
|
|
@@ -6452,50 +6213,89 @@ function implicitProp(name) {
|
|
|
6452
6213
|
return implicitPropNames.includes(name);
|
|
6453
6214
|
}
|
|
6454
6215
|
export {
|
|
6455
|
-
|
|
6456
|
-
|
|
6457
|
-
|
|
6458
|
-
|
|
6459
|
-
|
|
6460
|
-
|
|
6461
|
-
|
|
6462
|
-
|
|
6463
|
-
|
|
6464
|
-
|
|
6465
|
-
|
|
6216
|
+
VariantPropsKeys as $,
|
|
6217
|
+
T_DO_WHILE_STATEMENT as A,
|
|
6218
|
+
T_WHILE_STATEMENT as B,
|
|
6219
|
+
T_RETURN_STATEMENT as C,
|
|
6220
|
+
T_IF_STATEMENT as D,
|
|
6221
|
+
T_CONST_STATEMENT as E,
|
|
6222
|
+
T_LET_STATEMENT as F,
|
|
6223
|
+
T_ARROW_EXPRESSION_STATEMENT as G,
|
|
6224
|
+
T_BLOCK_STATEMENT as H,
|
|
6225
|
+
T_VAR_STATEMENT as I,
|
|
6226
|
+
T_ASSIGNMENT_EXPRESSION as J,
|
|
6227
|
+
T_LITERAL as K,
|
|
6466
6228
|
LinkTargetMd as L,
|
|
6467
|
-
|
|
6468
|
-
|
|
6469
|
-
|
|
6229
|
+
T_SPREAD_EXPRESSION as M,
|
|
6230
|
+
T_FUNCTION_INVOCATION_EXPRESSION as N,
|
|
6231
|
+
T_POSTFIX_OP_EXPRESSION as O,
|
|
6470
6232
|
Parser as P,
|
|
6471
|
-
|
|
6472
|
-
|
|
6473
|
-
|
|
6474
|
-
|
|
6233
|
+
T_CONDITIONAL_EXPRESSION as Q,
|
|
6234
|
+
T_BINARY_EXPRESSION as R,
|
|
6235
|
+
T_UNARY_EXPRESSION as S,
|
|
6236
|
+
T_CALCULATED_MEMBER_ACCESS_EXPRESSION as T,
|
|
6237
|
+
T_OBJECT_LITERAL as U,
|
|
6238
|
+
T_ARRAY_LITERAL as V,
|
|
6239
|
+
T_SEQUENCE_EXPRESSION as W,
|
|
6240
|
+
T_TEMPLATE_LITERAL_EXPRESSION as X,
|
|
6241
|
+
T_VAR_DECLARATION as Y,
|
|
6242
|
+
T_DESTRUCTURE as Z,
|
|
6243
|
+
TextVariantElement as _,
|
|
6475
6244
|
alignmentOptionValues as a,
|
|
6245
|
+
variantOptionsMd as a0,
|
|
6246
|
+
scrollAnchoringValues as a1,
|
|
6247
|
+
buttonThemeNames as a2,
|
|
6248
|
+
iconPositionNames as a3,
|
|
6249
|
+
buttonVariantNames as a4,
|
|
6250
|
+
nodeToComponentDef as a5,
|
|
6251
|
+
triggerPositionNames as a6,
|
|
6252
|
+
statusColorMd as a7,
|
|
6253
|
+
placementMd as a8,
|
|
6254
|
+
httpMethodNames as a9,
|
|
6255
|
+
PARSED_MARK_PROP as aa,
|
|
6256
|
+
layoutOptionKeys as ab,
|
|
6257
|
+
viewportSizeNames as ac,
|
|
6258
|
+
componentFileExtension as ad,
|
|
6259
|
+
codeBehindFileExtension as ae,
|
|
6260
|
+
getLintSeverity as af,
|
|
6261
|
+
LintSeverity as ag,
|
|
6262
|
+
lintApp as ah,
|
|
6263
|
+
printComponentLints as ai,
|
|
6264
|
+
lintErrorsComponent as aj,
|
|
6265
|
+
collectCodeBehindFromSource as ak,
|
|
6266
|
+
removeCodeBehindTokensFromTree as al,
|
|
6267
|
+
COMPOUND_COMP_ID as am,
|
|
6268
|
+
moduleFileExtension as an,
|
|
6269
|
+
LintDiagKind as ao,
|
|
6270
|
+
lint as ap,
|
|
6271
|
+
ParserError2 as aq,
|
|
6272
|
+
errorMessages as ar,
|
|
6273
|
+
UCRegex as as,
|
|
6274
|
+
onPrefixRegex as at,
|
|
6275
|
+
CORE_NAMESPACE_VALUE as au,
|
|
6476
6276
|
alignmentOptionMd as b,
|
|
6477
6277
|
buttonTypesMd as c,
|
|
6478
6278
|
buttonThemeMd as d,
|
|
6479
6279
|
buttonVariantMd as e,
|
|
6480
|
-
|
|
6481
|
-
|
|
6482
|
-
|
|
6280
|
+
T_MEMBER_ACCESS_EXPRESSION as f,
|
|
6281
|
+
T_IDENTIFIER as g,
|
|
6282
|
+
T_PREFIX_OP_EXPRESSION as h,
|
|
6483
6283
|
iconPositionMd as i,
|
|
6484
|
-
|
|
6485
|
-
|
|
6284
|
+
T_FUNCTION_DECLARATION as j,
|
|
6285
|
+
T_ARROW_EXPRESSION as k,
|
|
6486
6286
|
labelPositionMd as l,
|
|
6487
|
-
|
|
6488
|
-
|
|
6287
|
+
createXmlUiTreeNodeId as m,
|
|
6288
|
+
T_EMPTY_STATEMENT as n,
|
|
6489
6289
|
orientationOptionMd as o,
|
|
6490
|
-
|
|
6491
|
-
|
|
6492
|
-
|
|
6290
|
+
T_SWITCH_STATEMENT as p,
|
|
6291
|
+
T_TRY_STATEMENT as q,
|
|
6292
|
+
T_THROW_STATEMENT as r,
|
|
6493
6293
|
sizeMd as s,
|
|
6494
|
-
|
|
6495
|
-
|
|
6294
|
+
T_FOR_OF_STATEMENT as t,
|
|
6295
|
+
T_FOR_IN_STATEMENT as u,
|
|
6496
6296
|
validationStatusMd as v,
|
|
6497
|
-
|
|
6498
|
-
|
|
6499
|
-
|
|
6500
|
-
|
|
6297
|
+
T_FOR_STATEMENT as w,
|
|
6298
|
+
T_EXPRESSION_STATEMENT as x,
|
|
6299
|
+
T_BREAK_STATEMENT as y,
|
|
6300
|
+
T_CONTINUE_STATEMENT as z
|
|
6501
6301
|
};
|