@typespec/compiler 0.57.0-dev.0 → 0.57.0-dev.13

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 (205) hide show
  1. package/dist/generated-defs/TypeSpec.d.ts +33 -33
  2. package/dist/generated-defs/TypeSpec.d.ts.map +1 -1
  3. package/dist/manifest.js +2 -2
  4. package/dist/src/config/config-schema.d.ts +1 -1
  5. package/dist/src/config/config-schema.d.ts.map +1 -1
  6. package/dist/src/config/types.d.ts +2 -2
  7. package/dist/src/config/types.d.ts.map +1 -1
  8. package/dist/src/core/binder.d.ts +1 -1
  9. package/dist/src/core/binder.d.ts.map +1 -1
  10. package/dist/src/core/binder.js +16 -3
  11. package/dist/src/core/binder.js.map +1 -1
  12. package/dist/src/core/checker.d.ts +11 -9
  13. package/dist/src/core/checker.d.ts.map +1 -1
  14. package/dist/src/core/checker.js +1851 -288
  15. package/dist/src/core/checker.js.map +1 -1
  16. package/dist/src/core/compiler-code-fixes/model-to-object-literal.codefix.d.ts +6 -0
  17. package/dist/src/core/compiler-code-fixes/model-to-object-literal.codefix.d.ts.map +1 -0
  18. package/dist/src/core/compiler-code-fixes/model-to-object-literal.codefix.js +15 -0
  19. package/dist/src/core/compiler-code-fixes/model-to-object-literal.codefix.js.map +1 -0
  20. package/dist/src/core/compiler-code-fixes/tuple-to-array-value.codefix.d.ts +6 -0
  21. package/dist/src/core/compiler-code-fixes/tuple-to-array-value.codefix.d.ts.map +1 -0
  22. package/dist/src/core/compiler-code-fixes/tuple-to-array-value.codefix.js +15 -0
  23. package/dist/src/core/compiler-code-fixes/tuple-to-array-value.codefix.js.map +1 -0
  24. package/dist/src/core/decorator-utils.d.ts +5 -1
  25. package/dist/src/core/decorator-utils.d.ts.map +1 -1
  26. package/dist/src/core/decorator-utils.js +11 -1
  27. package/dist/src/core/decorator-utils.js.map +1 -1
  28. package/dist/src/core/deprecation.d.ts +1 -1
  29. package/dist/src/core/deprecation.d.ts.map +1 -1
  30. package/dist/src/core/diagnostic-creator.d.ts.map +1 -1
  31. package/dist/src/core/diagnostic-creator.js +1 -2
  32. package/dist/src/core/diagnostic-creator.js.map +1 -1
  33. package/dist/src/core/diagnostics.js +3 -3
  34. package/dist/src/core/diagnostics.js.map +1 -1
  35. package/dist/src/core/emitter-utils.d.ts +1 -1
  36. package/dist/src/core/emitter-utils.d.ts.map +1 -1
  37. package/dist/src/core/helpers/discriminator-utils.d.ts +2 -2
  38. package/dist/src/core/helpers/discriminator-utils.d.ts.map +1 -1
  39. package/dist/src/core/helpers/discriminator-utils.js +1 -1
  40. package/dist/src/core/helpers/discriminator-utils.js.map +1 -1
  41. package/dist/src/core/helpers/index.d.ts +1 -1
  42. package/dist/src/core/helpers/index.d.ts.map +1 -1
  43. package/dist/src/core/helpers/index.js +3 -1
  44. package/dist/src/core/helpers/index.js.map +1 -1
  45. package/dist/src/core/helpers/location-context.d.ts +2 -2
  46. package/dist/src/core/helpers/location-context.d.ts.map +1 -1
  47. package/dist/src/core/helpers/projected-names-utils.d.ts +2 -2
  48. package/dist/src/core/helpers/projected-names-utils.d.ts.map +1 -1
  49. package/dist/src/core/helpers/projected-names-utils.js.map +1 -1
  50. package/dist/src/core/helpers/string-template-utils.d.ts +6 -6
  51. package/dist/src/core/helpers/string-template-utils.d.ts.map +1 -1
  52. package/dist/src/core/helpers/string-template-utils.js +20 -33
  53. package/dist/src/core/helpers/string-template-utils.js.map +1 -1
  54. package/dist/src/core/helpers/type-name-utils.d.ts +3 -2
  55. package/dist/src/core/helpers/type-name-utils.d.ts.map +1 -1
  56. package/dist/src/core/helpers/type-name-utils.js +57 -8
  57. package/dist/src/core/helpers/type-name-utils.js.map +1 -1
  58. package/dist/src/core/index.d.ts +4 -1
  59. package/dist/src/core/index.d.ts.map +1 -1
  60. package/dist/src/core/index.js +4 -1
  61. package/dist/src/core/index.js.map +1 -1
  62. package/dist/src/core/intrinsic-type-state.d.ts +63 -0
  63. package/dist/src/core/intrinsic-type-state.d.ts.map +1 -0
  64. package/dist/src/core/intrinsic-type-state.js +160 -0
  65. package/dist/src/core/intrinsic-type-state.js.map +1 -0
  66. package/dist/src/core/js-marshaller.d.ts +13 -0
  67. package/dist/src/core/js-marshaller.d.ts.map +1 -0
  68. package/dist/src/core/js-marshaller.js +79 -0
  69. package/dist/src/core/js-marshaller.js.map +1 -0
  70. package/dist/src/core/library.d.ts +2 -1
  71. package/dist/src/core/library.d.ts.map +1 -1
  72. package/dist/src/core/library.js +3 -0
  73. package/dist/src/core/library.js.map +1 -1
  74. package/dist/src/core/linter.d.ts +1 -1
  75. package/dist/src/core/linter.d.ts.map +1 -1
  76. package/dist/src/core/linter.js +1 -1
  77. package/dist/src/core/linter.js.map +1 -1
  78. package/dist/src/core/messages.d.ts +235 -2
  79. package/dist/src/core/messages.d.ts.map +1 -1
  80. package/dist/src/core/messages.js +74 -1
  81. package/dist/src/core/messages.js.map +1 -1
  82. package/dist/src/core/numeric-ranges.d.ts +51 -0
  83. package/dist/src/core/numeric-ranges.d.ts.map +1 -0
  84. package/dist/src/core/numeric-ranges.js +30 -0
  85. package/dist/src/core/numeric-ranges.js.map +1 -0
  86. package/dist/src/core/numeric.js +2 -8
  87. package/dist/src/core/numeric.js.map +1 -1
  88. package/dist/src/core/parser.d.ts +2 -1
  89. package/dist/src/core/parser.d.ts.map +1 -1
  90. package/dist/src/core/parser.js +288 -6
  91. package/dist/src/core/parser.js.map +1 -1
  92. package/dist/src/core/program.d.ts +2 -45
  93. package/dist/src/core/program.d.ts.map +1 -1
  94. package/dist/src/core/program.js +3 -127
  95. package/dist/src/core/program.js.map +1 -1
  96. package/dist/src/core/projected-program.d.ts +3 -0
  97. package/dist/src/core/projected-program.d.ts.map +1 -0
  98. package/dist/src/core/projected-program.js +4 -0
  99. package/dist/src/core/projected-program.js.map +1 -0
  100. package/dist/src/core/projection-members.d.ts +2 -2
  101. package/dist/src/core/projection-members.d.ts.map +1 -1
  102. package/dist/src/core/projector.d.ts +2 -2
  103. package/dist/src/core/projector.d.ts.map +1 -1
  104. package/dist/src/core/projector.js +12 -3
  105. package/dist/src/core/projector.js.map +1 -1
  106. package/dist/src/core/scanner.d.ts +42 -37
  107. package/dist/src/core/scanner.d.ts.map +1 -1
  108. package/dist/src/core/scanner.js +67 -46
  109. package/dist/src/core/scanner.js.map +1 -1
  110. package/dist/src/core/schema-validator.js +1 -1
  111. package/dist/src/core/schema-validator.js.map +1 -1
  112. package/dist/src/core/semantic-walker.d.ts +1 -1
  113. package/dist/src/core/semantic-walker.d.ts.map +1 -1
  114. package/dist/src/core/semantic-walker.js +12 -0
  115. package/dist/src/core/semantic-walker.js.map +1 -1
  116. package/dist/src/core/state-accessors.d.ts +46 -0
  117. package/dist/src/core/state-accessors.d.ts.map +1 -0
  118. package/dist/src/core/state-accessors.js +123 -0
  119. package/dist/src/core/state-accessors.js.map +1 -0
  120. package/dist/src/core/type-utils.d.ts +18 -7
  121. package/dist/src/core/type-utils.d.ts.map +1 -1
  122. package/dist/src/core/type-utils.js +24 -5
  123. package/dist/src/core/type-utils.js.map +1 -1
  124. package/dist/src/core/types.d.ts +238 -46
  125. package/dist/src/core/types.d.ts.map +1 -1
  126. package/dist/src/core/types.js +12 -1
  127. package/dist/src/core/types.js.map +1 -1
  128. package/dist/src/emitter-framework/asset-emitter.d.ts +1 -1
  129. package/dist/src/emitter-framework/asset-emitter.d.ts.map +1 -1
  130. package/dist/src/emitter-framework/asset-emitter.js +4 -1
  131. package/dist/src/emitter-framework/asset-emitter.js.map +1 -1
  132. package/dist/src/emitter-framework/ref-scope.d.ts +1 -1
  133. package/dist/src/emitter-framework/ref-scope.d.ts.map +1 -1
  134. package/dist/src/emitter-framework/reference-cycle.d.ts +2 -2
  135. package/dist/src/emitter-framework/reference-cycle.d.ts.map +1 -1
  136. package/dist/src/emitter-framework/reference-cycle.js +1 -1
  137. package/dist/src/emitter-framework/reference-cycle.js.map +1 -1
  138. package/dist/src/emitter-framework/type-emitter.d.ts +3 -2
  139. package/dist/src/emitter-framework/type-emitter.d.ts.map +1 -1
  140. package/dist/src/emitter-framework/type-emitter.js +11 -3
  141. package/dist/src/emitter-framework/type-emitter.js.map +1 -1
  142. package/dist/src/emitter-framework/types.d.ts +2 -2
  143. package/dist/src/emitter-framework/types.d.ts.map +1 -1
  144. package/dist/src/formatter/print/comment-handler.d.ts.map +1 -1
  145. package/dist/src/formatter/print/comment-handler.js +22 -0
  146. package/dist/src/formatter/print/comment-handler.js.map +1 -1
  147. package/dist/src/formatter/print/printer.d.ts +11 -5
  148. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  149. package/dist/src/formatter/print/printer.js +95 -4
  150. package/dist/src/formatter/print/printer.js.map +1 -1
  151. package/dist/src/init/file-templating.d.ts +2 -2
  152. package/dist/src/init/file-templating.d.ts.map +1 -1
  153. package/dist/src/init/init-template.d.ts +1 -1
  154. package/dist/src/init/init-template.d.ts.map +1 -1
  155. package/dist/src/lib/decorators.d.ts +3 -55
  156. package/dist/src/lib/decorators.d.ts.map +1 -1
  157. package/dist/src/lib/decorators.js +30 -124
  158. package/dist/src/lib/decorators.js.map +1 -1
  159. package/dist/src/lib/encoded-names.d.ts +2 -2
  160. package/dist/src/lib/encoded-names.d.ts.map +1 -1
  161. package/dist/src/lib/intrinsic-decorators.d.ts +2 -2
  162. package/dist/src/lib/intrinsic-decorators.d.ts.map +1 -1
  163. package/dist/src/lib/intrinsic-decorators.js +7 -0
  164. package/dist/src/lib/intrinsic-decorators.js.map +1 -1
  165. package/dist/src/lib/service.d.ts +1 -1
  166. package/dist/src/lib/service.d.ts.map +1 -1
  167. package/dist/src/server/classify.d.ts.map +1 -1
  168. package/dist/src/server/classify.js +10 -0
  169. package/dist/src/server/classify.js.map +1 -1
  170. package/dist/src/server/completion.d.ts +2 -2
  171. package/dist/src/server/completion.d.ts.map +1 -1
  172. package/dist/src/server/completion.js +44 -2
  173. package/dist/src/server/completion.js.map +1 -1
  174. package/dist/src/server/serverlib.d.ts.map +1 -1
  175. package/dist/src/server/serverlib.js +10 -10
  176. package/dist/src/server/serverlib.js.map +1 -1
  177. package/dist/src/server/tmlanguage.d.ts +1 -1
  178. package/dist/src/server/tmlanguage.d.ts.map +1 -1
  179. package/dist/src/server/tmlanguage.js +147 -20
  180. package/dist/src/server/tmlanguage.js.map +1 -1
  181. package/dist/src/server/type-details.js +14 -7
  182. package/dist/src/server/type-details.js.map +1 -1
  183. package/dist/src/server/type-signature.js +15 -6
  184. package/dist/src/server/type-signature.js.map +1 -1
  185. package/dist/src/server/types.d.ts +1 -1
  186. package/dist/src/server/types.d.ts.map +1 -1
  187. package/dist/src/testing/expect.js +1 -1
  188. package/dist/src/testing/expect.js.map +1 -1
  189. package/dist/src/testing/rule-tester.d.ts.map +1 -1
  190. package/dist/src/testing/rule-tester.js +1 -2
  191. package/dist/src/testing/rule-tester.js.map +1 -1
  192. package/dist/src/testing/test-host.d.ts +1 -2
  193. package/dist/src/testing/test-host.d.ts.map +1 -1
  194. package/dist/src/testing/test-host.js +1 -8
  195. package/dist/src/testing/test-host.js.map +1 -1
  196. package/dist/src/testing/test-server-host.d.ts.map +1 -1
  197. package/dist/src/testing/test-server-host.js +2 -1
  198. package/dist/src/testing/test-server-host.js.map +1 -1
  199. package/dist/src/testing/test-utils.d.ts +1 -0
  200. package/dist/src/testing/test-utils.d.ts.map +1 -1
  201. package/dist/src/testing/test-utils.js +7 -0
  202. package/dist/src/testing/test-utils.js.map +1 -1
  203. package/dist/typespec.tmLanguage +408 -17
  204. package/lib/intrinsics.tsp +55 -5
  205. package/package.json +9 -9
@@ -27,6 +27,10 @@ var ListKind;
27
27
  ...ListKind.OperationParameters,
28
28
  invalidAnnotationTarget: "expression",
29
29
  };
30
+ ListKind.FunctionArguments = {
31
+ ...ListKind.OperationParameters,
32
+ invalidAnnotationTarget: "expression",
33
+ };
30
34
  ListKind.ModelProperties = {
31
35
  ...PropertiesBase,
32
36
  open: Token.OpenBrace,
@@ -34,6 +38,13 @@ var ListKind;
34
38
  delimiter: Token.Semicolon,
35
39
  toleratedDelimiter: Token.Comma,
36
40
  };
41
+ ListKind.ObjectLiteralProperties = {
42
+ ...PropertiesBase,
43
+ open: Token.HashBrace,
44
+ close: Token.CloseBrace,
45
+ delimiter: Token.Comma,
46
+ toleratedDelimiter: Token.Comma,
47
+ };
37
48
  ListKind.InterfaceMembers = {
38
49
  ...PropertiesBase,
39
50
  open: Token.OpenBrace,
@@ -43,6 +54,15 @@ var ListKind;
43
54
  toleratedDelimiterIsValid: false,
44
55
  allowedStatementKeyword: Token.OpKeyword,
45
56
  };
57
+ ListKind.ScalarMembers = {
58
+ ...PropertiesBase,
59
+ open: Token.OpenBrace,
60
+ close: Token.CloseBrace,
61
+ delimiter: Token.Semicolon,
62
+ toleratedDelimiter: Token.Comma,
63
+ toleratedDelimiterIsValid: false,
64
+ allowedStatementKeyword: Token.InitKeyword,
65
+ };
46
66
  ListKind.UnionVariants = {
47
67
  ...PropertiesBase,
48
68
  open: Token.OpenBrace,
@@ -91,6 +111,12 @@ var ListKind;
91
111
  open: Token.OpenBracket,
92
112
  close: Token.CloseBracket,
93
113
  };
114
+ ListKind.ArrayLiteral = {
115
+ ...ExpresionsBase,
116
+ allowEmpty: true,
117
+ open: Token.HashBracket,
118
+ close: Token.CloseBracket,
119
+ };
94
120
  ListKind.FunctionParameters = {
95
121
  ...ExpresionsBase,
96
122
  allowEmpty: true,
@@ -234,6 +260,10 @@ function createParser(code, options = {}) {
234
260
  reportInvalidDecorators(decorators, "alias statement");
235
261
  item = parseAliasStatement(pos);
236
262
  break;
263
+ case Token.ConstKeyword:
264
+ reportInvalidDecorators(decorators, "const statement");
265
+ item = parseConstStatement(pos);
266
+ break;
237
267
  case Token.UsingKeyword:
238
268
  reportInvalidDecorators(decorators, "using statement");
239
269
  item = parseUsingStatement(pos);
@@ -329,6 +359,10 @@ function createParser(code, options = {}) {
329
359
  reportInvalidDecorators(decorators, "alias statement");
330
360
  item = parseAliasStatement(pos);
331
361
  break;
362
+ case Token.ConstKeyword:
363
+ reportInvalidDecorators(decorators, "const statement");
364
+ item = parseConstStatement(pos);
365
+ break;
332
366
  case Token.UsingKeyword:
333
367
  reportInvalidDecorators(decorators, "using statement");
334
368
  item = parseUsingStatement(pos);
@@ -622,7 +656,7 @@ function createParser(code, options = {}) {
622
656
  const id = parseIdentifier();
623
657
  let constraint;
624
658
  if (parseOptional(Token.ExtendsKeyword)) {
625
- constraint = parseExpression();
659
+ constraint = parseMixedParameterConstraint();
626
660
  }
627
661
  let def;
628
662
  if (parseOptional(Token.Equals)) {
@@ -636,6 +670,35 @@ function createParser(code, options = {}) {
636
670
  ...finishNode(pos),
637
671
  };
638
672
  }
673
+ function parseValueOfExpressionOrIntersectionOrHigher() {
674
+ if (token() === Token.ValueOfKeyword) {
675
+ return parseValueOfExpression();
676
+ }
677
+ else if (parseOptional(Token.OpenParen)) {
678
+ const expr = parseMixedParameterConstraint();
679
+ parseExpected(Token.CloseParen);
680
+ return expr;
681
+ }
682
+ return parseIntersectionExpressionOrHigher();
683
+ }
684
+ function parseMixedParameterConstraint() {
685
+ const pos = tokenPos();
686
+ parseOptional(Token.Bar);
687
+ const node = parseValueOfExpressionOrIntersectionOrHigher();
688
+ if (token() !== Token.Bar) {
689
+ return node;
690
+ }
691
+ const options = [node];
692
+ while (parseOptional(Token.Bar)) {
693
+ const expr = parseValueOfExpressionOrIntersectionOrHigher();
694
+ options.push(expr);
695
+ }
696
+ return {
697
+ kind: SyntaxKind.UnionExpression,
698
+ options,
699
+ ...finishNode(pos),
700
+ };
701
+ }
639
702
  function parseModelPropertyOrSpread(pos, decorators) {
640
703
  return token() === Token.Ellipsis
641
704
  ? parseModelSpreadProperty(pos, decorators)
@@ -672,16 +735,47 @@ function createParser(code, options = {}) {
672
735
  ...finishNode(pos),
673
736
  };
674
737
  }
738
+ function parseObjectLiteralPropertyOrSpread(pos, decorators) {
739
+ reportInvalidDecorators(decorators, "object literal property");
740
+ return token() === Token.Ellipsis
741
+ ? parseObjectLiteralSpreadProperty(pos)
742
+ : parseObjectLiteralProperty(pos);
743
+ }
744
+ function parseObjectLiteralSpreadProperty(pos) {
745
+ parseExpected(Token.Ellipsis);
746
+ // This could be broadened to allow any type expression
747
+ const target = parseReferenceExpression();
748
+ return {
749
+ kind: SyntaxKind.ObjectLiteralSpreadProperty,
750
+ target,
751
+ ...finishNode(pos),
752
+ };
753
+ }
754
+ function parseObjectLiteralProperty(pos) {
755
+ const id = parseIdentifier({
756
+ message: "property",
757
+ });
758
+ parseExpected(Token.Colon);
759
+ const value = parseExpression();
760
+ return {
761
+ kind: SyntaxKind.ObjectLiteralProperty,
762
+ id,
763
+ value,
764
+ ...finishNode(pos),
765
+ };
766
+ }
675
767
  function parseScalarStatement(pos, decorators) {
676
768
  parseExpected(Token.ScalarKeyword);
677
769
  const id = parseIdentifier();
678
770
  const templateParameters = parseTemplateParameterList();
679
771
  const optionalExtends = parseOptionalScalarExtends();
772
+ const members = parseScalarMembers();
680
773
  return {
681
774
  kind: SyntaxKind.ScalarStatement,
682
775
  id,
683
776
  templateParameters,
684
777
  extends: optionalExtends,
778
+ members,
685
779
  decorators,
686
780
  ...finishNode(pos),
687
781
  };
@@ -692,6 +786,27 @@ function createParser(code, options = {}) {
692
786
  }
693
787
  return undefined;
694
788
  }
789
+ function parseScalarMembers() {
790
+ if (token() === Token.Semicolon) {
791
+ nextToken();
792
+ return [];
793
+ }
794
+ else {
795
+ return parseList(ListKind.ScalarMembers, parseScalarMember);
796
+ }
797
+ }
798
+ function parseScalarMember(pos, decorators) {
799
+ reportInvalidDecorators(decorators, "scalar member");
800
+ parseExpected(Token.InitKeyword);
801
+ const id = parseIdentifier();
802
+ const parameters = parseFunctionParameters();
803
+ return {
804
+ kind: SyntaxKind.ScalarConstructor,
805
+ id,
806
+ parameters,
807
+ ...finishNode(pos),
808
+ };
809
+ }
695
810
  function parseEnumStatement(pos, decorators) {
696
811
  parseExpected(Token.EnumKeyword);
697
812
  const id = parseIdentifier();
@@ -761,6 +876,27 @@ function createParser(code, options = {}) {
761
876
  ...finishNode(pos),
762
877
  };
763
878
  }
879
+ function parseConstStatement(pos) {
880
+ parseExpected(Token.ConstKeyword);
881
+ const id = parseIdentifier();
882
+ const type = parseOptionalTypeAnnotation();
883
+ parseExpected(Token.Equals);
884
+ const value = parseExpression();
885
+ parseExpected(Token.Semicolon);
886
+ return {
887
+ kind: SyntaxKind.ConstStatement,
888
+ id,
889
+ value,
890
+ type,
891
+ ...finishNode(pos),
892
+ };
893
+ }
894
+ function parseOptionalTypeAnnotation() {
895
+ if (parseOptional(Token.Colon)) {
896
+ return parseExpression();
897
+ }
898
+ return undefined;
899
+ }
764
900
  function parseExpression() {
765
901
  return parseUnionExpressionOrHigher();
766
902
  }
@@ -830,9 +966,61 @@ function createParser(code, options = {}) {
830
966
  ...finishNode(pos),
831
967
  };
832
968
  }
969
+ function parseTypeOfExpression() {
970
+ const pos = tokenPos();
971
+ parseExpected(Token.TypeOfKeyword);
972
+ const target = parseTypeOfTarget();
973
+ return {
974
+ kind: SyntaxKind.TypeOfExpression,
975
+ target,
976
+ ...finishNode(pos),
977
+ };
978
+ }
979
+ function parseTypeOfTarget() {
980
+ while (true) {
981
+ switch (token()) {
982
+ case Token.TypeOfKeyword:
983
+ return parseTypeOfExpression();
984
+ case Token.Identifier:
985
+ return parseCallOrReferenceExpression();
986
+ case Token.StringLiteral:
987
+ return parseStringLiteral();
988
+ case Token.StringTemplateHead:
989
+ return parseStringTemplateExpression();
990
+ case Token.TrueKeyword:
991
+ case Token.FalseKeyword:
992
+ return parseBooleanLiteral();
993
+ case Token.NumericLiteral:
994
+ return parseNumericLiteral();
995
+ case Token.OpenParen:
996
+ parseExpected(Token.OpenParen);
997
+ const target = parseTypeOfTarget();
998
+ parseExpected(Token.CloseParen);
999
+ return target;
1000
+ default:
1001
+ return parseReferenceExpression("typeofTarget");
1002
+ }
1003
+ }
1004
+ }
833
1005
  function parseReferenceExpression(message) {
834
1006
  const pos = tokenPos();
835
1007
  const target = parseIdentifierOrMemberExpression(message);
1008
+ return parseReferenceExpressionInternal(target, pos);
1009
+ }
1010
+ function parseCallOrReferenceExpression(message) {
1011
+ const pos = tokenPos();
1012
+ const target = parseIdentifierOrMemberExpression(message);
1013
+ if (token() === Token.OpenParen) {
1014
+ return {
1015
+ kind: SyntaxKind.CallExpression,
1016
+ target,
1017
+ arguments: parseList(ListKind.FunctionArguments, parseExpression),
1018
+ ...finishNode(pos),
1019
+ };
1020
+ }
1021
+ return parseReferenceExpressionInternal(target, pos);
1022
+ }
1023
+ function parseReferenceExpressionInternal(target, pos) {
836
1024
  const args = parseOptionalList(ListKind.TemplateArguments, parseTemplateArgument);
837
1025
  return {
838
1026
  kind: SyntaxKind.TypeReference,
@@ -1039,10 +1227,10 @@ function createParser(code, options = {}) {
1039
1227
  function parsePrimaryExpression() {
1040
1228
  while (true) {
1041
1229
  switch (token()) {
1042
- case Token.ValueOfKeyword:
1043
- return parseValueOfExpression();
1230
+ case Token.TypeOfKeyword:
1231
+ return parseTypeOfExpression();
1044
1232
  case Token.Identifier:
1045
- return parseReferenceExpression();
1233
+ return parseCallOrReferenceExpression();
1046
1234
  case Token.StringLiteral:
1047
1235
  return parseStringLiteral();
1048
1236
  case Token.StringTemplateHead:
@@ -1066,6 +1254,10 @@ function createParser(code, options = {}) {
1066
1254
  const directives = parseDirectiveList();
1067
1255
  reportInvalidDirective(directives, "expression");
1068
1256
  continue;
1257
+ case Token.HashBrace:
1258
+ return parseObjectLiteral();
1259
+ case Token.HashBracket:
1260
+ return parseArrayLiteral();
1069
1261
  case Token.VoidKeyword:
1070
1262
  return parseVoidKeyword();
1071
1263
  case Token.NeverKeyword:
@@ -1134,6 +1326,24 @@ function createParser(code, options = {}) {
1134
1326
  ...finishNode(pos),
1135
1327
  };
1136
1328
  }
1329
+ function parseObjectLiteral() {
1330
+ const pos = tokenPos();
1331
+ const properties = parseList(ListKind.ObjectLiteralProperties, parseObjectLiteralPropertyOrSpread);
1332
+ return {
1333
+ kind: SyntaxKind.ObjectLiteral,
1334
+ properties,
1335
+ ...finishNode(pos),
1336
+ };
1337
+ }
1338
+ function parseArrayLiteral() {
1339
+ const pos = tokenPos();
1340
+ const values = parseList(ListKind.ArrayLiteral, parseExpression);
1341
+ return {
1342
+ kind: SyntaxKind.ArrayLiteral,
1343
+ values,
1344
+ ...finishNode(pos),
1345
+ };
1346
+ }
1137
1347
  function parseStringLiteral() {
1138
1348
  const pos = tokenPos();
1139
1349
  const value = tokenValue();
@@ -1373,7 +1583,7 @@ function createParser(code, options = {}) {
1373
1583
  const optional = parseOptional(Token.Question);
1374
1584
  let type;
1375
1585
  if (parseOptional(Token.Colon)) {
1376
- type = parseExpression();
1586
+ type = parseMixedParameterConstraint();
1377
1587
  }
1378
1588
  return {
1379
1589
  kind: SyntaxKind.FunctionParameter,
@@ -2032,11 +2242,31 @@ function createParser(code, options = {}) {
2032
2242
  start = tokenPos();
2033
2243
  while (parseOptional(Token.Whitespace))
2034
2244
  ;
2035
- if (parseOptional(Token.Star)) {
2245
+ if (!parseOptional(Token.Star)) {
2246
+ break;
2247
+ }
2248
+ if (!inCodeFence) {
2036
2249
  parseOptional(Token.Whitespace);
2037
2250
  start = tokenPos();
2038
2251
  break;
2039
2252
  }
2253
+ // If we are in a code fence we want to preserve the leading whitespace
2254
+ // except for the first space after the star which is used as indentation.
2255
+ const whitespaceStart = tokenPos();
2256
+ parseOptional(Token.Whitespace);
2257
+ // This `min` handles the case when there is no whitespace after the
2258
+ // star e.g. a case like this:
2259
+ //
2260
+ // /**
2261
+ // *```
2262
+ // *foo-bar
2263
+ // *```
2264
+ // */
2265
+ //
2266
+ // Not having space after the star isn't idiomatic, but we support this.
2267
+ // `whitespaceStart + 1` strips the first space before `foo-bar` if there
2268
+ // is a space after the star (the idiomatic case).
2269
+ start = Math.min(whitespaceStart + 1, tokenPos());
2040
2270
  break;
2041
2271
  case Token.EndOfFile:
2042
2272
  break loop;
@@ -2555,6 +2785,8 @@ export function visitChildren(node, cb) {
2555
2785
  visitEach(cb, node.arguments));
2556
2786
  case SyntaxKind.DecoratorExpression:
2557
2787
  return visitNode(cb, node.target) || visitEach(cb, node.arguments);
2788
+ case SyntaxKind.CallExpression:
2789
+ return visitNode(cb, node.target) || visitEach(cb, node.arguments);
2558
2790
  case SyntaxKind.DirectiveExpression:
2559
2791
  return visitNode(cb, node.target) || visitEach(cb, node.arguments);
2560
2792
  case SyntaxKind.ImportStatement:
@@ -2604,7 +2836,10 @@ export function visitChildren(node, cb) {
2604
2836
  return (visitEach(cb, node.decorators) ||
2605
2837
  visitNode(cb, node.id) ||
2606
2838
  visitEach(cb, node.templateParameters) ||
2839
+ visitEach(cb, node.members) ||
2607
2840
  visitNode(cb, node.extends));
2841
+ case SyntaxKind.ScalarConstructor:
2842
+ return visitNode(cb, node.id) || visitEach(cb, node.parameters);
2608
2843
  case SyntaxKind.UnionStatement:
2609
2844
  return (visitEach(cb, node.decorators) ||
2610
2845
  visitNode(cb, node.id) ||
@@ -2622,6 +2857,8 @@ export function visitChildren(node, cb) {
2622
2857
  return (visitNode(cb, node.id) ||
2623
2858
  visitEach(cb, node.templateParameters) ||
2624
2859
  visitNode(cb, node.value));
2860
+ case SyntaxKind.ConstStatement:
2861
+ return visitNode(cb, node.id) || visitNode(cb, node.value) || visitNode(cb, node.type);
2625
2862
  case SyntaxKind.DecoratorDeclarationStatement:
2626
2863
  return (visitEach(cb, node.modifiers) ||
2627
2864
  visitNode(cb, node.id) ||
@@ -2638,6 +2875,8 @@ export function visitChildren(node, cb) {
2638
2875
  return visitNode(cb, node.target) || visitEach(cb, node.arguments);
2639
2876
  case SyntaxKind.ValueOfExpression:
2640
2877
  return visitNode(cb, node.target);
2878
+ case SyntaxKind.TypeOfExpression:
2879
+ return visitNode(cb, node.target);
2641
2880
  case SyntaxKind.TupleExpression:
2642
2881
  return visitEach(cb, node.values);
2643
2882
  case SyntaxKind.UnionExpression:
@@ -2707,6 +2946,14 @@ export function visitChildren(node, cb) {
2707
2946
  return visitNode(cb, node.head) || visitEach(cb, node.spans);
2708
2947
  case SyntaxKind.StringTemplateSpan:
2709
2948
  return visitNode(cb, node.expression) || visitNode(cb, node.literal);
2949
+ case SyntaxKind.ObjectLiteral:
2950
+ return visitEach(cb, node.properties);
2951
+ case SyntaxKind.ObjectLiteralProperty:
2952
+ return visitNode(cb, node.id) || visitNode(cb, node.value);
2953
+ case SyntaxKind.ObjectLiteralSpreadProperty:
2954
+ return visitNode(cb, node.target);
2955
+ case SyntaxKind.ArrayLiteral:
2956
+ return visitEach(cb, node.values);
2710
2957
  // no children for the rest of these.
2711
2958
  case SyntaxKind.StringTemplateHead:
2712
2959
  case SyntaxKind.StringTemplateMiddle:
@@ -2756,6 +3003,21 @@ function visitEach(cb, nodes) {
2756
3003
  }
2757
3004
  return;
2758
3005
  }
3006
+ export function getNodeAtPositionDetail(script, position, filter) {
3007
+ const node = getNodeAtPosition(script, position, filter);
3008
+ if (!node)
3009
+ return undefined;
3010
+ const char = script.file.text.charCodeAt(position);
3011
+ const preChar = position >= 0 ? script.file.text.charCodeAt(position - 1) : NaN;
3012
+ const nextChar = position < script.file.text.length ? script.file.text.charCodeAt(position + 1) : NaN;
3013
+ return {
3014
+ node,
3015
+ position,
3016
+ preChar,
3017
+ nextChar,
3018
+ char,
3019
+ };
3020
+ }
2759
3021
  export function getNodeAtPosition(script, position, filter = (node) => true) {
2760
3022
  return visit(script);
2761
3023
  function visit(node) {
@@ -2852,6 +3114,26 @@ export function getIdentifierContext(id) {
2852
3114
  case SyntaxKind.TemplateArgument:
2853
3115
  kind = IdentifierKind.TemplateArgument;
2854
3116
  break;
3117
+ case SyntaxKind.ObjectLiteralProperty:
3118
+ kind = IdentifierKind.ObjectLiteralProperty;
3119
+ break;
3120
+ case SyntaxKind.ModelProperty:
3121
+ switch (node.parent?.kind) {
3122
+ case SyntaxKind.ModelExpression:
3123
+ kind = IdentifierKind.ModelExpressionProperty;
3124
+ break;
3125
+ case SyntaxKind.ModelStatement:
3126
+ kind = IdentifierKind.ModelStatementProperty;
3127
+ break;
3128
+ default:
3129
+ compilerAssert("false", "ModelProperty with unexpected parent kind.");
3130
+ kind =
3131
+ id.parent.id === id
3132
+ ? IdentifierKind.Declaration
3133
+ : IdentifierKind.Other;
3134
+ break;
3135
+ }
3136
+ break;
2855
3137
  default:
2856
3138
  kind =
2857
3139
  id.parent.id === id