@typespec/compiler 1.10.0-dev.1 → 1.10.0-dev.10

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 (119) hide show
  1. package/dist/generated-defs/TypeSpec.Prototypes.ts-test.js +1 -1
  2. package/dist/generated-defs/TypeSpec.Prototypes.ts-test.js.map +1 -1
  3. package/dist/generated-defs/TypeSpec.ts-test.js +1 -1
  4. package/dist/generated-defs/TypeSpec.ts-test.js.map +1 -1
  5. package/dist/manifest.js +2 -2
  6. package/dist/src/core/binder.d.ts.map +1 -1
  7. package/dist/src/core/binder.js +33 -19
  8. package/dist/src/core/binder.js.map +1 -1
  9. package/dist/src/core/checker.d.ts.map +1 -1
  10. package/dist/src/core/checker.js +594 -67
  11. package/dist/src/core/checker.js.map +1 -1
  12. package/dist/src/core/cli/actions/info/emitter-options.d.ts +40 -0
  13. package/dist/src/core/cli/actions/info/emitter-options.d.ts.map +1 -0
  14. package/dist/src/core/cli/actions/info/emitter-options.js +345 -0
  15. package/dist/src/core/cli/actions/info/emitter-options.js.map +1 -0
  16. package/dist/src/core/cli/actions/info.d.ts +5 -2
  17. package/dist/src/core/cli/actions/info.d.ts.map +1 -1
  18. package/dist/src/core/cli/actions/info.js +6 -2
  19. package/dist/src/core/cli/actions/info.js.map +1 -1
  20. package/dist/src/core/cli/cli.js +43 -4
  21. package/dist/src/core/cli/cli.js.map +1 -1
  22. package/dist/src/core/helpers/string-template-utils.d.ts.map +1 -1
  23. package/dist/src/core/helpers/string-template-utils.js +7 -4
  24. package/dist/src/core/helpers/string-template-utils.js.map +1 -1
  25. package/dist/src/core/helpers/syntax-utils.d.ts.map +1 -1
  26. package/dist/src/core/helpers/syntax-utils.js +11 -3
  27. package/dist/src/core/helpers/syntax-utils.js.map +1 -1
  28. package/dist/src/core/helpers/type-name-utils.d.ts.map +1 -1
  29. package/dist/src/core/helpers/type-name-utils.js +13 -0
  30. package/dist/src/core/helpers/type-name-utils.js.map +1 -1
  31. package/dist/src/core/js-marshaller.d.ts +4 -2
  32. package/dist/src/core/js-marshaller.d.ts.map +1 -1
  33. package/dist/src/core/js-marshaller.js +96 -6
  34. package/dist/src/core/js-marshaller.js.map +1 -1
  35. package/dist/src/core/messages.d.ts +123 -32
  36. package/dist/src/core/messages.d.ts.map +1 -1
  37. package/dist/src/core/messages.js +29 -6
  38. package/dist/src/core/messages.js.map +1 -1
  39. package/dist/src/core/modifiers.d.ts +14 -0
  40. package/dist/src/core/modifiers.d.ts.map +1 -0
  41. package/dist/src/core/modifiers.js +166 -0
  42. package/dist/src/core/modifiers.js.map +1 -0
  43. package/dist/src/core/module-host.d.ts +5 -0
  44. package/dist/src/core/module-host.d.ts.map +1 -0
  45. package/dist/src/core/module-host.js +12 -0
  46. package/dist/src/core/module-host.js.map +1 -0
  47. package/dist/src/core/name-resolver.d.ts.map +1 -1
  48. package/dist/src/core/name-resolver.js +32 -0
  49. package/dist/src/core/name-resolver.js.map +1 -1
  50. package/dist/src/core/parser.d.ts.map +1 -1
  51. package/dist/src/core/parser.js +154 -101
  52. package/dist/src/core/parser.js.map +1 -1
  53. package/dist/src/core/program.d.ts.map +1 -1
  54. package/dist/src/core/program.js +5 -11
  55. package/dist/src/core/program.js.map +1 -1
  56. package/dist/src/core/scanner.d.ts +48 -48
  57. package/dist/src/core/scanner.d.ts.map +1 -1
  58. package/dist/src/core/scanner.js +55 -56
  59. package/dist/src/core/scanner.js.map +1 -1
  60. package/dist/src/core/semantic-walker.d.ts +3 -3
  61. package/dist/src/core/semantic-walker.d.ts.map +1 -1
  62. package/dist/src/core/semantic-walker.js +63 -44
  63. package/dist/src/core/semantic-walker.js.map +1 -1
  64. package/dist/src/core/source-loader.d.ts.map +1 -1
  65. package/dist/src/core/source-loader.js +4 -11
  66. package/dist/src/core/source-loader.js.map +1 -1
  67. package/dist/src/core/type-relation-checker.d.ts.map +1 -1
  68. package/dist/src/core/type-relation-checker.js +157 -10
  69. package/dist/src/core/type-relation-checker.js.map +1 -1
  70. package/dist/src/core/types.d.ts +215 -32
  71. package/dist/src/core/types.d.ts.map +1 -1
  72. package/dist/src/core/types.js +2 -0
  73. package/dist/src/core/types.js.map +1 -1
  74. package/dist/src/experimental/mutators.js +3 -3
  75. package/dist/src/experimental/mutators.js.map +1 -1
  76. package/dist/src/experimental/typekit/index.d.ts.map +1 -1
  77. package/dist/src/experimental/typekit/index.js.map +1 -1
  78. package/dist/src/formatter/print/printer.d.ts +2 -2
  79. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  80. package/dist/src/formatter/print/printer.js +55 -5
  81. package/dist/src/formatter/print/printer.js.map +1 -1
  82. package/dist/src/index.d.ts +3 -2
  83. package/dist/src/index.d.ts.map +1 -1
  84. package/dist/src/index.js +2 -1
  85. package/dist/src/index.js.map +1 -1
  86. package/dist/src/lib/examples.d.ts +10 -3
  87. package/dist/src/lib/examples.d.ts.map +1 -1
  88. package/dist/src/lib/examples.js +22 -7
  89. package/dist/src/lib/examples.js.map +1 -1
  90. package/dist/src/server/completion.js +1 -0
  91. package/dist/src/server/completion.js.map +1 -1
  92. package/dist/src/server/server-compile-manager.js +1 -1
  93. package/dist/src/server/server-compile-manager.js.map +1 -1
  94. package/dist/src/server/tmlanguage.d.ts +1 -1
  95. package/dist/src/server/tmlanguage.d.ts.map +1 -1
  96. package/dist/src/server/tmlanguage.js +39 -29
  97. package/dist/src/server/tmlanguage.js.map +1 -1
  98. package/dist/src/server/type-signature.js +19 -0
  99. package/dist/src/server/type-signature.js.map +1 -1
  100. package/dist/src/utils/fs-utils.d.ts.map +1 -1
  101. package/dist/src/utils/fs-utils.js +1 -1
  102. package/dist/src/utils/fs-utils.js.map +1 -1
  103. package/dist/typespec.tmLanguage +103 -53
  104. package/lib/prototypes.tsp +2 -1
  105. package/package.json +13 -14
  106. package/templates/__snapshots__/emitter-ts/eslint.config.js +10 -1
  107. package/templates/__snapshots__/emitter-ts/package.json +1 -2
  108. package/templates/__snapshots__/emitter-ts/test/test-host.ts +7 -34
  109. package/templates/__snapshots__/library-ts/eslint.config.js +10 -1
  110. package/templates/__snapshots__/library-ts/package.json +1 -2
  111. package/templates/__snapshots__/library-ts/test/decorators.test.ts +18 -23
  112. package/templates/__snapshots__/library-ts/test/test-host.ts +5 -15
  113. package/templates/emitter-ts/eslint.config.js +10 -1
  114. package/templates/emitter-ts/package.json +1 -2
  115. package/templates/emitter-ts/test/test-host.ts.mu +7 -34
  116. package/templates/library-ts/eslint.config.js +10 -1
  117. package/templates/library-ts/package.json +1 -2
  118. package/templates/library-ts/test/decorators.test.ts.mu +18 -23
  119. package/templates/library-ts/test/test-host.ts.mu +5 -15
@@ -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
  }
@@ -661,7 +643,7 @@ function createParser(code, options = {}) {
661
643
  const id = parseIdentifier();
662
644
  let constraint;
663
645
  if (parseOptional(Token.ExtendsKeyword)) {
664
- constraint = parseMixedParameterConstraint();
646
+ constraint = parseMixedConstraint();
665
647
  }
666
648
  let def;
667
649
  if (parseOptional(Token.Equals)) {
@@ -680,13 +662,13 @@ function createParser(code, options = {}) {
680
662
  return parseValueOfExpression();
681
663
  }
682
664
  else if (parseOptional(Token.OpenParen)) {
683
- const expr = parseMixedParameterConstraint();
665
+ const expr = parseMixedConstraint();
684
666
  parseExpected(Token.CloseParen);
685
667
  return expr;
686
668
  }
687
669
  return parseIntersectionExpressionOrHigher();
688
670
  }
689
- function parseMixedParameterConstraint() {
671
+ function parseMixedConstraint() {
690
672
  const pos = tokenPos();
691
673
  parseOptional(Token.Bar);
692
674
  const node = parseValueOfExpressionOrIntersectionOrHigher();
@@ -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
  }
@@ -923,6 +913,14 @@ function createParser(code, options = {}) {
923
913
  const expr = parseIntersectionExpressionOrHigher();
924
914
  options.push(expr);
925
915
  }
916
+ for (const fnVariant of options.filter((n) => n.kind === SyntaxKind.FunctionTypeExpression)) {
917
+ if (!fnVariant.parenthesized) {
918
+ error({
919
+ code: "fn-in-union-expression",
920
+ target: fnVariant,
921
+ });
922
+ }
923
+ }
926
924
  return {
927
925
  kind: SyntaxKind.UnionExpression,
928
926
  options,
@@ -1013,6 +1011,19 @@ function createParser(code, options = {}) {
1013
1011
  }
1014
1012
  }
1015
1013
  }
1014
+ function parseFunctionTypeExpression() {
1015
+ const pos = tokenPos();
1016
+ parseExpected(Token.FnKeyword);
1017
+ const { items: parameters } = parseFunctionParameters();
1018
+ const optionalReturnType = parseOptional(Token.EqualsGreaterThan);
1019
+ const returnType = optionalReturnType ? parseMixedConstraint() : undefined;
1020
+ return {
1021
+ kind: SyntaxKind.FunctionTypeExpression,
1022
+ parameters,
1023
+ returnType,
1024
+ ...finishNode(pos),
1025
+ };
1026
+ }
1016
1027
  function parseReferenceExpression(message) {
1017
1028
  const pos = tokenPos();
1018
1029
  const target = parseIdentifierOrMemberExpression({
@@ -1255,6 +1266,8 @@ function createParser(code, options = {}) {
1255
1266
  switch (token()) {
1256
1267
  case Token.TypeOfKeyword:
1257
1268
  return parseTypeOfExpression();
1269
+ case Token.FnKeyword:
1270
+ return parseFunctionTypeExpression();
1258
1271
  case Token.Identifier:
1259
1272
  return parseCallOrReferenceExpression();
1260
1273
  case Token.StringLiteral:
@@ -1303,6 +1316,14 @@ function createParser(code, options = {}) {
1303
1316
  ...finishNode(pos),
1304
1317
  };
1305
1318
  }
1319
+ function parseInternalKeyword() {
1320
+ const pos = tokenPos();
1321
+ parseExpected(Token.InternalKeyword);
1322
+ return {
1323
+ kind: SyntaxKind.InternalKeyword,
1324
+ ...finishNode(pos),
1325
+ };
1326
+ }
1306
1327
  function parseVoidKeyword() {
1307
1328
  const pos = tokenPos();
1308
1329
  parseExpected(Token.VoidKeyword);
@@ -1332,7 +1353,7 @@ function createParser(code, options = {}) {
1332
1353
  parseExpected(Token.OpenParen);
1333
1354
  const expr = parseExpression();
1334
1355
  parseExpected(Token.CloseParen);
1335
- return { ...expr, ...finishNode(pos) };
1356
+ return { parenthesized: true, ...expr, ...finishNode(pos) };
1336
1357
  }
1337
1358
  function parseTupleExpression() {
1338
1359
  const pos = tokenPos();
@@ -1490,8 +1511,10 @@ function createParser(code, options = {}) {
1490
1511
  }
1491
1512
  function parseIdentifier(options) {
1492
1513
  if (isKeyword(token())) {
1493
- error({ code: "reserved-identifier" });
1494
- return createMissingIdentifier();
1514
+ if (!(isModifier(token()) && options?.allowReservedIdentifier)) {
1515
+ error({ code: "reserved-identifier" });
1516
+ return createMissingIdentifier();
1517
+ }
1495
1518
  }
1496
1519
  else if (isReservedKeyword(token())) {
1497
1520
  if (!options?.allowReservedIdentifier) {
@@ -1514,9 +1537,29 @@ function createParser(code, options = {}) {
1514
1537
  ...finishNode(pos),
1515
1538
  };
1516
1539
  }
1517
- function parseDeclaration(pos) {
1540
+ function parseDeclaration(pos, decorators, docs, directives) {
1518
1541
  const modifiers = parseModifiers();
1519
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);
1520
1563
  case Token.DecKeyword:
1521
1564
  return parseDecoratorDeclarationStatement(pos, modifiers);
1522
1565
  case Token.FnKeyword:
@@ -1536,6 +1579,8 @@ function createParser(code, options = {}) {
1536
1579
  switch (token()) {
1537
1580
  case Token.ExternKeyword:
1538
1581
  return parseExternKeyword();
1582
+ case Token.InternalKeyword:
1583
+ return parseInternalKeyword();
1539
1584
  default:
1540
1585
  return undefined;
1541
1586
  }
@@ -1578,7 +1623,7 @@ function createParser(code, options = {}) {
1578
1623
  const { items: parameters } = parseFunctionParameters();
1579
1624
  let returnType;
1580
1625
  if (parseOptional(Token.Colon)) {
1581
- returnType = parseExpression();
1626
+ returnType = parseMixedConstraint();
1582
1627
  }
1583
1628
  parseExpected(Token.Semicolon);
1584
1629
  return {
@@ -1618,7 +1663,7 @@ function createParser(code, options = {}) {
1618
1663
  const optional = parseOptional(Token.Question);
1619
1664
  let type;
1620
1665
  if (parseOptional(Token.Colon)) {
1621
- type = parseMixedParameterConstraint();
1666
+ type = parseMixedConstraint();
1622
1667
  }
1623
1668
  return {
1624
1669
  kind: SyntaxKind.FunctionParameter,
@@ -1629,17 +1674,6 @@ function createParser(code, options = {}) {
1629
1674
  ...finishNode(pos),
1630
1675
  };
1631
1676
  }
1632
- function modifiersToFlags(modifiers) {
1633
- let flags = 0 /* ModifierFlags.None */;
1634
- for (const modifier of modifiers) {
1635
- switch (modifier.kind) {
1636
- case SyntaxKind.ExternKeyword:
1637
- flags |= 2 /* ModifierFlags.Extern */;
1638
- break;
1639
- }
1640
- }
1641
- return flags;
1642
- }
1643
1677
  function parseRange(mode, range, callback) {
1644
1678
  const savedMode = currentMode;
1645
1679
  const result = scanner.scanRange(range, () => {
@@ -2298,7 +2332,8 @@ export function visitChildren(node, cb) {
2298
2332
  case SyntaxKind.ImportStatement:
2299
2333
  return visitNode(cb, node.path);
2300
2334
  case SyntaxKind.OperationStatement:
2301
- return (visitEach(cb, node.decorators) ||
2335
+ return (visitEach(cb, node.modifiers) ||
2336
+ visitEach(cb, node.decorators) ||
2302
2337
  visitNode(cb, node.id) ||
2303
2338
  visitEach(cb, node.templateParameters) ||
2304
2339
  visitNode(cb, node.signature));
@@ -2307,11 +2342,13 @@ export function visitChildren(node, cb) {
2307
2342
  case SyntaxKind.OperationSignatureReference:
2308
2343
  return visitNode(cb, node.baseOperation);
2309
2344
  case SyntaxKind.NamespaceStatement:
2310
- return (visitEach(cb, node.decorators) ||
2345
+ return (visitEach(cb, node.modifiers) ||
2346
+ visitEach(cb, node.decorators) ||
2311
2347
  visitNode(cb, node.id) ||
2312
2348
  (isArray(node.statements) ? visitEach(cb, node.statements) : visitNode(cb, node.statements)));
2313
2349
  case SyntaxKind.InterfaceStatement:
2314
- return (visitEach(cb, node.decorators) ||
2350
+ return (visitEach(cb, node.modifiers) ||
2351
+ visitEach(cb, node.decorators) ||
2315
2352
  visitNode(cb, node.id) ||
2316
2353
  visitEach(cb, node.templateParameters) ||
2317
2354
  visitEach(cb, node.extends) ||
@@ -2332,14 +2369,16 @@ export function visitChildren(node, cb) {
2332
2369
  case SyntaxKind.ModelSpreadProperty:
2333
2370
  return visitNode(cb, node.target);
2334
2371
  case SyntaxKind.ModelStatement:
2335
- return (visitEach(cb, node.decorators) ||
2372
+ return (visitEach(cb, node.modifiers) ||
2373
+ visitEach(cb, node.decorators) ||
2336
2374
  visitNode(cb, node.id) ||
2337
2375
  visitEach(cb, node.templateParameters) ||
2338
2376
  visitNode(cb, node.extends) ||
2339
2377
  visitNode(cb, node.is) ||
2340
2378
  visitEach(cb, node.properties));
2341
2379
  case SyntaxKind.ScalarStatement:
2342
- return (visitEach(cb, node.decorators) ||
2380
+ return (visitEach(cb, node.modifiers) ||
2381
+ visitEach(cb, node.decorators) ||
2343
2382
  visitNode(cb, node.id) ||
2344
2383
  visitEach(cb, node.templateParameters) ||
2345
2384
  visitEach(cb, node.members) ||
@@ -2347,24 +2386,32 @@ export function visitChildren(node, cb) {
2347
2386
  case SyntaxKind.ScalarConstructor:
2348
2387
  return visitNode(cb, node.id) || visitEach(cb, node.parameters);
2349
2388
  case SyntaxKind.UnionStatement:
2350
- return (visitEach(cb, node.decorators) ||
2389
+ return (visitEach(cb, node.modifiers) ||
2390
+ visitEach(cb, node.decorators) ||
2351
2391
  visitNode(cb, node.id) ||
2352
2392
  visitEach(cb, node.templateParameters) ||
2353
2393
  visitEach(cb, node.options));
2354
2394
  case SyntaxKind.UnionVariant:
2355
2395
  return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
2356
2396
  case SyntaxKind.EnumStatement:
2357
- 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));
2358
2401
  case SyntaxKind.EnumMember:
2359
2402
  return visitEach(cb, node.decorators) || visitNode(cb, node.id) || visitNode(cb, node.value);
2360
2403
  case SyntaxKind.EnumSpreadMember:
2361
2404
  return visitNode(cb, node.target);
2362
2405
  case SyntaxKind.AliasStatement:
2363
- return (visitNode(cb, node.id) ||
2406
+ return (visitEach(cb, node.modifiers) ||
2407
+ visitNode(cb, node.id) ||
2364
2408
  visitEach(cb, node.templateParameters) ||
2365
2409
  visitNode(cb, node.value));
2366
2410
  case SyntaxKind.ConstStatement:
2367
- 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));
2368
2415
  case SyntaxKind.DecoratorDeclarationStatement:
2369
2416
  return (visitEach(cb, node.modifiers) ||
2370
2417
  visitNode(cb, node.id) ||
@@ -2375,6 +2422,8 @@ export function visitChildren(node, cb) {
2375
2422
  visitNode(cb, node.id) ||
2376
2423
  visitEach(cb, node.parameters) ||
2377
2424
  visitNode(cb, node.returnType));
2425
+ case SyntaxKind.FunctionTypeExpression:
2426
+ return visitEach(cb, node.parameters) || visitNode(cb, node.returnType);
2378
2427
  case SyntaxKind.FunctionParameter:
2379
2428
  return visitNode(cb, node.id) || visitNode(cb, node.type);
2380
2429
  case SyntaxKind.TypeReference:
@@ -2428,6 +2477,7 @@ export function visitChildren(node, cb) {
2428
2477
  case SyntaxKind.VoidKeyword:
2429
2478
  case SyntaxKind.NeverKeyword:
2430
2479
  case SyntaxKind.ExternKeyword:
2480
+ case SyntaxKind.InternalKeyword:
2431
2481
  case SyntaxKind.UnknownKeyword:
2432
2482
  case SyntaxKind.JsSourceFile:
2433
2483
  case SyntaxKind.JsNamespaceDeclaration:
@@ -2600,6 +2650,9 @@ export function getIdentifierContext(id) {
2600
2650
  case SyntaxKind.DecoratorExpression:
2601
2651
  kind = IdentifierKind.Decorator;
2602
2652
  break;
2653
+ case SyntaxKind.CallExpression:
2654
+ kind = IdentifierKind.Function;
2655
+ break;
2603
2656
  case SyntaxKind.UsingStatement:
2604
2657
  kind = IdentifierKind.Using;
2605
2658
  break;