@typespec/compiler 1.10.0-dev.7 → 1.10.0-dev.8

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.
Files changed (48) hide show
  1. package/dist/manifest.js +2 -2
  2. package/dist/src/core/binder.d.ts.map +1 -1
  3. package/dist/src/core/binder.js +23 -11
  4. package/dist/src/core/binder.js.map +1 -1
  5. package/dist/src/core/checker.d.ts.map +1 -1
  6. package/dist/src/core/checker.js +77 -9
  7. package/dist/src/core/checker.js.map +1 -1
  8. package/dist/src/core/helpers/syntax-utils.d.ts.map +1 -1
  9. package/dist/src/core/helpers/syntax-utils.js +11 -3
  10. package/dist/src/core/helpers/syntax-utils.js.map +1 -1
  11. package/dist/src/core/messages.d.ts +32 -30
  12. package/dist/src/core/messages.d.ts.map +1 -1
  13. package/dist/src/core/messages.js +6 -8
  14. package/dist/src/core/messages.js.map +1 -1
  15. package/dist/src/core/modifiers.d.ts +14 -0
  16. package/dist/src/core/modifiers.d.ts.map +1 -0
  17. package/dist/src/core/modifiers.js +166 -0
  18. package/dist/src/core/modifiers.js.map +1 -0
  19. package/dist/src/core/name-resolver.d.ts.map +1 -1
  20. package/dist/src/core/name-resolver.js +2 -0
  21. package/dist/src/core/name-resolver.js.map +1 -1
  22. package/dist/src/core/parser.d.ts.map +1 -1
  23. package/dist/src/core/parser.js +120 -95
  24. package/dist/src/core/parser.js.map +1 -1
  25. package/dist/src/core/scanner.d.ts +46 -46
  26. package/dist/src/core/scanner.d.ts.map +1 -1
  27. package/dist/src/core/scanner.js +50 -51
  28. package/dist/src/core/scanner.js.map +1 -1
  29. package/dist/src/core/source-loader.d.ts.map +1 -1
  30. package/dist/src/core/source-loader.js +2 -0
  31. package/dist/src/core/source-loader.js.map +1 -1
  32. package/dist/src/core/types.d.ts +29 -10
  33. package/dist/src/core/types.d.ts.map +1 -1
  34. package/dist/src/core/types.js +2 -1
  35. package/dist/src/core/types.js.map +1 -1
  36. package/dist/src/formatter/print/printer.d.ts +2 -2
  37. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  38. package/dist/src/formatter/print/printer.js +42 -5
  39. package/dist/src/formatter/print/printer.js.map +1 -1
  40. package/dist/src/server/completion.js +1 -0
  41. package/dist/src/server/completion.js.map +1 -1
  42. package/dist/src/server/tmlanguage.d.ts +1 -1
  43. package/dist/src/server/tmlanguage.d.ts.map +1 -1
  44. package/dist/src/server/tmlanguage.js +39 -29
  45. package/dist/src/server/tmlanguage.js.map +1 -1
  46. package/dist/typespec.tmLanguage +103 -53
  47. package/lib/prototypes.tsp +2 -1
  48. package/package.json +1 -1
@@ -2,7 +2,8 @@ import { isArray, mutate } from "../utils/misc.js";
2
2
  import { codePointBefore, isIdentifierContinue, trim } from "./charcode.js";
3
3
  import { compilerAssert } from "./diagnostics.js";
4
4
  import { createDiagnostic } from "./messages.js";
5
- import { createScanner, isComment, isKeyword, isPunctuation, isReservedKeyword, isStatementKeyword, isTrivia, skipContinuousIdentifier, skipTrivia, skipTriviaBackward, Token, TokenDisplay, TokenFlags, } from "./scanner.js";
5
+ import { modifiersToFlags } from "./modifiers.js";
6
+ import { createScanner, isComment, isKeyword, isModifier, isPunctuation, isReservedKeyword, isStatementKeyword, isTrivia, skipContinuousIdentifier, skipTrivia, skipTriviaBackward, Token, TokenDisplay, TokenFlags, } from "./scanner.js";
6
7
  import { IdentifierKind, SyntaxKind, } from "./types.js";
7
8
  /**
8
9
  * The fixed set of options for each of the kinds of delimited lists in TypeSpec.
@@ -221,35 +222,6 @@ function createParser(code, options = {}) {
221
222
  reportInvalidDecorators(decorators, "import statement");
222
223
  item = parseImportStatement();
223
224
  break;
224
- case Token.ModelKeyword:
225
- item = parseModelStatement(pos, decorators);
226
- break;
227
- case Token.ScalarKeyword:
228
- item = parseScalarStatement(pos, decorators);
229
- break;
230
- case Token.NamespaceKeyword:
231
- item = parseNamespaceStatement(pos, decorators, docs, directives);
232
- break;
233
- case Token.InterfaceKeyword:
234
- item = parseInterfaceStatement(pos, decorators);
235
- break;
236
- case Token.UnionKeyword:
237
- item = parseUnionStatement(pos, decorators);
238
- break;
239
- case Token.OpKeyword:
240
- item = parseOperationStatement(pos, decorators);
241
- break;
242
- case Token.EnumKeyword:
243
- item = parseEnumStatement(pos, decorators);
244
- break;
245
- case Token.AliasKeyword:
246
- reportInvalidDecorators(decorators, "alias statement");
247
- item = parseAliasStatement(pos);
248
- break;
249
- case Token.ConstKeyword:
250
- reportInvalidDecorators(decorators, "const statement");
251
- item = parseConstStatement(pos);
252
- break;
253
225
  case Token.UsingKeyword:
254
226
  reportInvalidDecorators(decorators, "using statement");
255
227
  item = parseUsingStatement(pos);
@@ -259,10 +231,20 @@ function createParser(code, options = {}) {
259
231
  item = parseEmptyStatement(pos);
260
232
  break;
261
233
  // Start of declaration with modifiers
234
+ case Token.NamespaceKeyword:
235
+ case Token.ModelKeyword:
236
+ case Token.ScalarKeyword:
237
+ case Token.InterfaceKeyword:
238
+ case Token.UnionKeyword:
239
+ case Token.OpKeyword:
240
+ case Token.EnumKeyword:
241
+ case Token.AliasKeyword:
242
+ case Token.ConstKeyword:
262
243
  case Token.ExternKeyword:
244
+ case Token.InternalKeyword:
263
245
  case Token.FnKeyword:
264
246
  case Token.DecKeyword:
265
- item = parseDeclaration(pos);
247
+ item = parseDeclaration(pos, decorators, docs, directives);
266
248
  break;
267
249
  default:
268
250
  item = parseInvalidStatement(pos, decorators);
@@ -312,47 +294,24 @@ function createParser(code, options = {}) {
312
294
  item = parseImportStatement();
313
295
  error({ code: "import-first", messageId: "topLevel", target: item });
314
296
  break;
315
- case Token.ModelKeyword:
316
- item = parseModelStatement(pos, decorators);
297
+ case Token.UsingKeyword:
298
+ reportInvalidDecorators(decorators, "using statement");
299
+ item = parseUsingStatement(pos);
317
300
  break;
301
+ case Token.ModelKeyword:
318
302
  case Token.ScalarKeyword:
319
- item = parseScalarStatement(pos, decorators);
320
- break;
321
303
  case Token.NamespaceKeyword:
322
- const ns = parseNamespaceStatement(pos, decorators, docs, directives);
323
- if (isBlocklessNamespace(ns)) {
324
- error({ code: "blockless-namespace-first", messageId: "topLevel", target: ns });
325
- }
326
- item = ns;
327
- break;
328
304
  case Token.InterfaceKeyword:
329
- item = parseInterfaceStatement(pos, decorators);
330
- break;
331
305
  case Token.UnionKeyword:
332
- item = parseUnionStatement(pos, decorators);
333
- break;
334
306
  case Token.OpKeyword:
335
- item = parseOperationStatement(pos, decorators);
336
- break;
337
307
  case Token.EnumKeyword:
338
- item = parseEnumStatement(pos, decorators);
339
- break;
340
308
  case Token.AliasKeyword:
341
- reportInvalidDecorators(decorators, "alias statement");
342
- item = parseAliasStatement(pos);
343
- break;
344
309
  case Token.ConstKeyword:
345
- reportInvalidDecorators(decorators, "const statement");
346
- item = parseConstStatement(pos);
347
- break;
348
- case Token.UsingKeyword:
349
- reportInvalidDecorators(decorators, "using statement");
350
- item = parseUsingStatement(pos);
351
- break;
352
310
  case Token.ExternKeyword:
311
+ case Token.InternalKeyword:
353
312
  case Token.FnKeyword:
354
313
  case Token.DecKeyword:
355
- item = parseDeclaration(pos);
314
+ item = parseDeclaration(pos, decorators, docs, directives);
356
315
  break;
357
316
  case Token.EndOfFile:
358
317
  parseExpected(Token.CloseBrace);
@@ -365,6 +324,9 @@ function createParser(code, options = {}) {
365
324
  item = parseInvalidStatement(pos, decorators);
366
325
  break;
367
326
  }
327
+ if (isBlocklessNamespace(item)) {
328
+ error({ code: "blockless-namespace-first", messageId: "topLevel", target: item });
329
+ }
368
330
  mutate(item).directives = directives;
369
331
  if (tok !== Token.NamespaceKeyword) {
370
332
  mutate(item).docs = docs;
@@ -387,7 +349,7 @@ function createParser(code, options = {}) {
387
349
  }
388
350
  return directives;
389
351
  }
390
- function parseNamespaceStatement(pos, decorators, docs, directives) {
352
+ function parseNamespaceStatement(pos, decorators, modifiers, docs, directives) {
391
353
  parseExpected(Token.NamespaceKeyword);
392
354
  let currentName = parseIdentifierOrMemberExpression();
393
355
  const nsSegments = [];
@@ -410,6 +372,8 @@ function createParser(code, options = {}) {
410
372
  locals: undefined,
411
373
  statements,
412
374
  directives: directives,
375
+ modifiers,
376
+ modifierFlags: modifiersToFlags(modifiers),
413
377
  ...finishNode(pos),
414
378
  };
415
379
  for (let i = 1; i < nsSegments.length; i++) {
@@ -420,12 +384,14 @@ function createParser(code, options = {}) {
420
384
  id: nsSegments[i],
421
385
  statements: outerNs,
422
386
  locals: undefined,
387
+ modifiers: [],
388
+ modifierFlags: 0 /* ModifierFlags.None */,
423
389
  ...finishNode(pos),
424
390
  };
425
391
  }
426
392
  return outerNs;
427
393
  }
428
- function parseInterfaceStatement(pos, decorators) {
394
+ function parseInterfaceStatement(pos, decorators, modifiers) {
429
395
  parseExpected(Token.InterfaceKeyword);
430
396
  const id = parseIdentifier();
431
397
  const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
@@ -438,7 +404,7 @@ function createParser(code, options = {}) {
438
404
  error({ code: "token-expected", format: { token: "'extends' or '{'" } });
439
405
  nextToken();
440
406
  }
441
- const { items: operations, range: bodyRange } = parseList(ListKind.InterfaceMembers, (pos, decorators) => parseOperationStatement(pos, decorators, true));
407
+ const { items: operations, range: bodyRange } = parseList(ListKind.InterfaceMembers, (pos, decorators) => parseOperationStatement(pos, decorators, /* modifiers */ undefined, true));
442
408
  return {
443
409
  kind: SyntaxKind.InterfaceStatement,
444
410
  id,
@@ -448,6 +414,8 @@ function createParser(code, options = {}) {
448
414
  bodyRange,
449
415
  extends: extendList.items,
450
416
  decorators,
417
+ modifiers,
418
+ modifierFlags: modifiersToFlags(modifiers),
451
419
  ...finishNode(pos),
452
420
  };
453
421
  }
@@ -465,7 +433,7 @@ function createParser(code, options = {}) {
465
433
  }
466
434
  return detail;
467
435
  }
468
- function parseUnionStatement(pos, decorators) {
436
+ function parseUnionStatement(pos, decorators, modifiers) {
469
437
  parseExpected(Token.UnionKeyword);
470
438
  const id = parseIdentifier();
471
439
  const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
@@ -476,6 +444,8 @@ function createParser(code, options = {}) {
476
444
  templateParameters,
477
445
  templateParametersRange,
478
446
  decorators,
447
+ modifiers,
448
+ modifierFlags: modifiersToFlags(modifiers),
479
449
  options,
480
450
  ...finishNode(pos),
481
451
  };
@@ -483,11 +453,16 @@ function createParser(code, options = {}) {
483
453
  function parseIdOrValueForVariant() {
484
454
  const nextToken = token();
485
455
  let id;
486
- if (isReservedKeyword(nextToken)) {
456
+ if (isReservedKeyword(nextToken) || isModifier(nextToken)) {
487
457
  id = parseIdentifier({ allowReservedIdentifier: true });
488
458
  // If the next token is not a colon this means we tried to use the reserved keyword as a type reference
489
459
  if (token() !== Token.Colon) {
490
- error({ code: "reserved-identifier", messageId: "future", format: { name: id.sv } });
460
+ if (isReservedKeyword(nextToken)) {
461
+ error({ code: "reserved-identifier", messageId: "future", format: { name: id.sv } });
462
+ }
463
+ else {
464
+ error({ code: "reserved-identifier" });
465
+ }
491
466
  }
492
467
  return {
493
468
  kind: SyntaxKind.TypeReference,
@@ -552,11 +527,14 @@ function createParser(code, options = {}) {
552
527
  ...finishNode(pos),
553
528
  };
554
529
  }
555
- function parseOperationStatement(pos, decorators, inInterface) {
530
+ function parseOperationStatement(pos, decorators, _modifiers, inInterface) {
531
+ let modifiers;
556
532
  if (inInterface) {
533
+ modifiers = parseModifiers();
557
534
  parseOptional(Token.OpKeyword);
558
535
  }
559
536
  else {
537
+ modifiers = _modifiers;
560
538
  parseExpected(Token.OpKeyword);
561
539
  }
562
540
  const id = parseIdentifier();
@@ -597,6 +575,8 @@ function createParser(code, options = {}) {
597
575
  templateParametersRange,
598
576
  signature,
599
577
  decorators,
578
+ modifiers,
579
+ modifierFlags: modifiersToFlags(modifiers),
600
580
  ...finishNode(pos),
601
581
  };
602
582
  }
@@ -611,7 +591,7 @@ function createParser(code, options = {}) {
611
591
  };
612
592
  return parameters;
613
593
  }
614
- function parseModelStatement(pos, decorators) {
594
+ function parseModelStatement(pos, decorators, modifiers) {
615
595
  parseExpected(Token.ModelKeyword);
616
596
  const id = parseIdentifier();
617
597
  const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
@@ -641,6 +621,8 @@ function createParser(code, options = {}) {
641
621
  decorators,
642
622
  properties: propDetail.items,
643
623
  bodyRange: propDetail.range,
624
+ modifiers,
625
+ modifierFlags: modifiersToFlags(modifiers),
644
626
  ...finishNode(pos),
645
627
  };
646
628
  }
@@ -771,7 +753,7 @@ function createParser(code, options = {}) {
771
753
  ...finishNode(pos),
772
754
  };
773
755
  }
774
- function parseScalarStatement(pos, decorators) {
756
+ function parseScalarStatement(pos, decorators, modifiers) {
775
757
  parseExpected(Token.ScalarKeyword);
776
758
  const id = parseIdentifier();
777
759
  const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
@@ -786,6 +768,8 @@ function createParser(code, options = {}) {
786
768
  members,
787
769
  bodyRange,
788
770
  decorators,
771
+ modifiers,
772
+ modifierFlags: modifiersToFlags(modifiers),
789
773
  ...finishNode(pos),
790
774
  };
791
775
  }
@@ -816,7 +800,7 @@ function createParser(code, options = {}) {
816
800
  ...finishNode(pos),
817
801
  };
818
802
  }
819
- function parseEnumStatement(pos, decorators) {
803
+ function parseEnumStatement(pos, decorators, modifiers) {
820
804
  parseExpected(Token.EnumKeyword);
821
805
  const id = parseIdentifier();
822
806
  const { items: members } = parseList(ListKind.EnumMembers, parseEnumMemberOrSpread);
@@ -824,6 +808,8 @@ function createParser(code, options = {}) {
824
808
  kind: SyntaxKind.EnumStatement,
825
809
  id,
826
810
  decorators,
811
+ modifiers,
812
+ modifierFlags: modifiersToFlags(modifiers),
827
813
  members,
828
814
  ...finishNode(pos),
829
815
  };
@@ -871,7 +857,7 @@ function createParser(code, options = {}) {
871
857
  ...finishNode(pos),
872
858
  };
873
859
  }
874
- function parseAliasStatement(pos) {
860
+ function parseAliasStatement(pos, modifiers) {
875
861
  parseExpected(Token.AliasKeyword);
876
862
  const id = parseIdentifier();
877
863
  const { items: templateParameters, range: templateParametersRange } = parseTemplateParameterList();
@@ -884,10 +870,12 @@ function createParser(code, options = {}) {
884
870
  templateParameters,
885
871
  templateParametersRange,
886
872
  value,
873
+ modifiers,
874
+ modifierFlags: modifiersToFlags(modifiers),
887
875
  ...finishNode(pos),
888
876
  };
889
877
  }
890
- function parseConstStatement(pos) {
878
+ function parseConstStatement(pos, modifiers) {
891
879
  parseExpected(Token.ConstKeyword);
892
880
  const id = parseIdentifier();
893
881
  const type = parseOptionalTypeAnnotation();
@@ -899,6 +887,8 @@ function createParser(code, options = {}) {
899
887
  id,
900
888
  value,
901
889
  type,
890
+ modifiers,
891
+ modifierFlags: modifiersToFlags(modifiers),
902
892
  ...finishNode(pos),
903
893
  };
904
894
  }
@@ -1326,6 +1316,14 @@ function createParser(code, options = {}) {
1326
1316
  ...finishNode(pos),
1327
1317
  };
1328
1318
  }
1319
+ function parseInternalKeyword() {
1320
+ const pos = tokenPos();
1321
+ parseExpected(Token.InternalKeyword);
1322
+ return {
1323
+ kind: SyntaxKind.InternalKeyword,
1324
+ ...finishNode(pos),
1325
+ };
1326
+ }
1329
1327
  function parseVoidKeyword() {
1330
1328
  const pos = tokenPos();
1331
1329
  parseExpected(Token.VoidKeyword);
@@ -1513,8 +1511,10 @@ function createParser(code, options = {}) {
1513
1511
  }
1514
1512
  function parseIdentifier(options) {
1515
1513
  if (isKeyword(token())) {
1516
- error({ code: "reserved-identifier" });
1517
- return createMissingIdentifier();
1514
+ if (!(isModifier(token()) && options?.allowReservedIdentifier)) {
1515
+ error({ code: "reserved-identifier" });
1516
+ return createMissingIdentifier();
1517
+ }
1518
1518
  }
1519
1519
  else if (isReservedKeyword(token())) {
1520
1520
  if (!options?.allowReservedIdentifier) {
@@ -1537,9 +1537,29 @@ function createParser(code, options = {}) {
1537
1537
  ...finishNode(pos),
1538
1538
  };
1539
1539
  }
1540
- function parseDeclaration(pos) {
1540
+ function parseDeclaration(pos, decorators, docs, directives) {
1541
1541
  const modifiers = parseModifiers();
1542
1542
  switch (token()) {
1543
+ case Token.ModelKeyword:
1544
+ return parseModelStatement(pos, decorators, modifiers);
1545
+ case Token.ScalarKeyword:
1546
+ return parseScalarStatement(pos, decorators, modifiers);
1547
+ case Token.NamespaceKeyword:
1548
+ return parseNamespaceStatement(pos, decorators, modifiers, docs, directives);
1549
+ case Token.InterfaceKeyword:
1550
+ return parseInterfaceStatement(pos, decorators, modifiers);
1551
+ case Token.UnionKeyword:
1552
+ return parseUnionStatement(pos, decorators, modifiers);
1553
+ case Token.OpKeyword:
1554
+ return parseOperationStatement(pos, decorators, modifiers);
1555
+ case Token.EnumKeyword:
1556
+ return parseEnumStatement(pos, decorators, modifiers);
1557
+ case Token.AliasKeyword:
1558
+ reportInvalidDecorators(decorators, "alias statement");
1559
+ return parseAliasStatement(pos, modifiers);
1560
+ case Token.ConstKeyword:
1561
+ reportInvalidDecorators(decorators, "const statement");
1562
+ return parseConstStatement(pos, modifiers);
1543
1563
  case Token.DecKeyword:
1544
1564
  return parseDecoratorDeclarationStatement(pos, modifiers);
1545
1565
  case Token.FnKeyword:
@@ -1559,6 +1579,8 @@ function createParser(code, options = {}) {
1559
1579
  switch (token()) {
1560
1580
  case Token.ExternKeyword:
1561
1581
  return parseExternKeyword();
1582
+ case Token.InternalKeyword:
1583
+ return parseInternalKeyword();
1562
1584
  default:
1563
1585
  return undefined;
1564
1586
  }
@@ -1652,17 +1674,6 @@ function createParser(code, options = {}) {
1652
1674
  ...finishNode(pos),
1653
1675
  };
1654
1676
  }
1655
- function modifiersToFlags(modifiers) {
1656
- let flags = 0 /* ModifierFlags.None */;
1657
- for (const modifier of modifiers) {
1658
- switch (modifier.kind) {
1659
- case SyntaxKind.ExternKeyword:
1660
- flags |= 2 /* ModifierFlags.Extern */;
1661
- break;
1662
- }
1663
- }
1664
- return flags;
1665
- }
1666
1677
  function parseRange(mode, range, callback) {
1667
1678
  const savedMode = currentMode;
1668
1679
  const result = scanner.scanRange(range, () => {
@@ -2321,7 +2332,8 @@ export function visitChildren(node, cb) {
2321
2332
  case SyntaxKind.ImportStatement:
2322
2333
  return visitNode(cb, node.path);
2323
2334
  case SyntaxKind.OperationStatement:
2324
- return (visitEach(cb, node.decorators) ||
2335
+ return (visitEach(cb, node.modifiers) ||
2336
+ visitEach(cb, node.decorators) ||
2325
2337
  visitNode(cb, node.id) ||
2326
2338
  visitEach(cb, node.templateParameters) ||
2327
2339
  visitNode(cb, node.signature));
@@ -2330,11 +2342,13 @@ export function visitChildren(node, cb) {
2330
2342
  case SyntaxKind.OperationSignatureReference:
2331
2343
  return visitNode(cb, node.baseOperation);
2332
2344
  case SyntaxKind.NamespaceStatement:
2333
- return (visitEach(cb, node.decorators) ||
2345
+ return (visitEach(cb, node.modifiers) ||
2346
+ visitEach(cb, node.decorators) ||
2334
2347
  visitNode(cb, node.id) ||
2335
2348
  (isArray(node.statements) ? visitEach(cb, node.statements) : visitNode(cb, node.statements)));
2336
2349
  case SyntaxKind.InterfaceStatement:
2337
- return (visitEach(cb, node.decorators) ||
2350
+ return (visitEach(cb, node.modifiers) ||
2351
+ visitEach(cb, node.decorators) ||
2338
2352
  visitNode(cb, node.id) ||
2339
2353
  visitEach(cb, node.templateParameters) ||
2340
2354
  visitEach(cb, node.extends) ||
@@ -2355,14 +2369,16 @@ export function visitChildren(node, cb) {
2355
2369
  case SyntaxKind.ModelSpreadProperty:
2356
2370
  return visitNode(cb, node.target);
2357
2371
  case SyntaxKind.ModelStatement:
2358
- return (visitEach(cb, node.decorators) ||
2372
+ return (visitEach(cb, node.modifiers) ||
2373
+ visitEach(cb, node.decorators) ||
2359
2374
  visitNode(cb, node.id) ||
2360
2375
  visitEach(cb, node.templateParameters) ||
2361
2376
  visitNode(cb, node.extends) ||
2362
2377
  visitNode(cb, node.is) ||
2363
2378
  visitEach(cb, node.properties));
2364
2379
  case SyntaxKind.ScalarStatement:
2365
- return (visitEach(cb, node.decorators) ||
2380
+ return (visitEach(cb, node.modifiers) ||
2381
+ visitEach(cb, node.decorators) ||
2366
2382
  visitNode(cb, node.id) ||
2367
2383
  visitEach(cb, node.templateParameters) ||
2368
2384
  visitEach(cb, node.members) ||
@@ -2370,24 +2386,32 @@ export function visitChildren(node, cb) {
2370
2386
  case SyntaxKind.ScalarConstructor:
2371
2387
  return visitNode(cb, node.id) || visitEach(cb, node.parameters);
2372
2388
  case SyntaxKind.UnionStatement:
2373
- return (visitEach(cb, node.decorators) ||
2389
+ return (visitEach(cb, node.modifiers) ||
2390
+ visitEach(cb, node.decorators) ||
2374
2391
  visitNode(cb, node.id) ||
2375
2392
  visitEach(cb, node.templateParameters) ||
2376
2393
  visitEach(cb, node.options));
2377
2394
  case SyntaxKind.UnionVariant:
2378
2395
  return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
2379
2396
  case SyntaxKind.EnumStatement:
2380
- return (visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitEach(cb, node.members));
2397
+ return (visitEach(cb, node.modifiers) ||
2398
+ visitEach(cb, node.decorators) ||
2399
+ visitNode(cb, node.id) ||
2400
+ visitEach(cb, node.members));
2381
2401
  case SyntaxKind.EnumMember:
2382
2402
  return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
2383
2403
  case SyntaxKind.EnumSpreadMember:
2384
2404
  return visitNode(cb, node.target);
2385
2405
  case SyntaxKind.AliasStatement:
2386
- return (visitNode(cb, node.id) ||
2406
+ return (visitEach(cb, node.modifiers) ||
2407
+ visitNode(cb, node.id) ||
2387
2408
  visitEach(cb, node.templateParameters) ||
2388
2409
  visitNode(cb, node.value));
2389
2410
  case SyntaxKind.ConstStatement:
2390
- return visitNode(cb, node.id) || visitNode(cb, node.value) || visitNode(cb, node.type);
2411
+ return (visitEach(cb, node.modifiers) ||
2412
+ visitNode(cb, node.id) ||
2413
+ visitNode(cb, node.value) ||
2414
+ visitNode(cb, node.type));
2391
2415
  case SyntaxKind.DecoratorDeclarationStatement:
2392
2416
  return (visitEach(cb, node.modifiers) ||
2393
2417
  visitNode(cb, node.id) ||
@@ -2453,6 +2477,7 @@ export function visitChildren(node, cb) {
2453
2477
  case SyntaxKind.VoidKeyword:
2454
2478
  case SyntaxKind.NeverKeyword:
2455
2479
  case SyntaxKind.ExternKeyword:
2480
+ case SyntaxKind.InternalKeyword:
2456
2481
  case SyntaxKind.UnknownKeyword:
2457
2482
  case SyntaxKind.JsSourceFile:
2458
2483
  case SyntaxKind.JsNamespaceDeclaration: