@typespec/compiler 0.47.0-dev.2 → 0.47.0-dev.20

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 (163) hide show
  1. package/dist/manifest.js +2 -2
  2. package/dist/src/config/config-to-options.d.ts +31 -0
  3. package/dist/src/config/config-to-options.d.ts.map +1 -0
  4. package/dist/src/config/config-to-options.js +54 -0
  5. package/dist/src/config/config-to-options.js.map +1 -0
  6. package/dist/src/config/index.d.ts +1 -0
  7. package/dist/src/config/index.d.ts.map +1 -1
  8. package/dist/src/config/index.js +1 -0
  9. package/dist/src/config/index.js.map +1 -1
  10. package/dist/src/core/checker.d.ts.map +1 -1
  11. package/dist/src/core/checker.js +253 -85
  12. package/dist/src/core/checker.js.map +1 -1
  13. package/dist/src/core/cli/actions/compile/args.d.ts +1 -0
  14. package/dist/src/core/cli/actions/compile/args.d.ts.map +1 -1
  15. package/dist/src/core/cli/actions/compile/args.js +31 -64
  16. package/dist/src/core/cli/actions/compile/args.js.map +1 -1
  17. package/dist/src/core/cli/actions/compile/compile.d.ts +2 -1
  18. package/dist/src/core/cli/actions/compile/compile.d.ts.map +1 -1
  19. package/dist/src/core/cli/actions/compile/compile.js +61 -54
  20. package/dist/src/core/cli/actions/compile/compile.js.map +1 -1
  21. package/dist/src/core/cli/actions/compile/watch.d.ts +15 -0
  22. package/dist/src/core/cli/actions/compile/watch.d.ts.map +1 -0
  23. package/dist/src/core/cli/actions/compile/watch.js +59 -0
  24. package/dist/src/core/cli/actions/compile/watch.js.map +1 -0
  25. package/dist/src/core/cli/actions/format.d.ts +2 -1
  26. package/dist/src/core/cli/actions/format.d.ts.map +1 -1
  27. package/dist/src/core/cli/actions/format.js +1 -1
  28. package/dist/src/core/cli/actions/format.js.map +1 -1
  29. package/dist/src/core/cli/actions/info.d.ts +2 -2
  30. package/dist/src/core/cli/actions/info.d.ts.map +1 -1
  31. package/dist/src/core/cli/actions/info.js +1 -7
  32. package/dist/src/core/cli/actions/info.js.map +1 -1
  33. package/dist/src/core/cli/actions/init.d.ts +3 -2
  34. package/dist/src/core/cli/actions/init.d.ts.map +1 -1
  35. package/dist/src/core/cli/actions/init.js +3 -6
  36. package/dist/src/core/cli/actions/init.js.map +1 -1
  37. package/dist/src/core/cli/actions/vs.d.ts +4 -2
  38. package/dist/src/core/cli/actions/vs.d.ts.map +1 -1
  39. package/dist/src/core/cli/actions/vs.js +38 -19
  40. package/dist/src/core/cli/actions/vs.js.map +1 -1
  41. package/dist/src/core/cli/actions/vscode.d.ts +10 -2
  42. package/dist/src/core/cli/actions/vscode.d.ts.map +1 -1
  43. package/dist/src/core/cli/actions/vscode.js +18 -20
  44. package/dist/src/core/cli/actions/vscode.js.map +1 -1
  45. package/dist/src/core/cli/cli.js +16 -13
  46. package/dist/src/core/cli/cli.js.map +1 -1
  47. package/dist/src/core/cli/install-vsix.d.ts +2 -1
  48. package/dist/src/core/cli/install-vsix.d.ts.map +1 -1
  49. package/dist/src/core/cli/install-vsix.js +5 -4
  50. package/dist/src/core/cli/install-vsix.js.map +1 -1
  51. package/dist/src/core/cli/types.d.ts +6 -0
  52. package/dist/src/core/cli/types.d.ts.map +1 -0
  53. package/dist/src/core/cli/types.js +2 -0
  54. package/dist/src/core/cli/types.js.map +1 -0
  55. package/dist/src/core/cli/utils.d.ts +12 -4
  56. package/dist/src/core/cli/utils.d.ts.map +1 -1
  57. package/dist/src/core/cli/utils.js +27 -6
  58. package/dist/src/core/cli/utils.js.map +1 -1
  59. package/dist/src/core/deprecation.d.ts +31 -0
  60. package/dist/src/core/deprecation.d.ts.map +1 -0
  61. package/dist/src/core/deprecation.js +48 -0
  62. package/dist/src/core/deprecation.js.map +1 -0
  63. package/dist/src/core/formatter-fs.js +4 -4
  64. package/dist/src/core/formatter-fs.js.map +1 -1
  65. package/dist/src/core/formatter.d.ts +3 -3
  66. package/dist/src/core/formatter.d.ts.map +1 -1
  67. package/dist/src/core/formatter.js +4 -4
  68. package/dist/src/core/formatter.js.map +1 -1
  69. package/dist/src/core/index.d.ts +1 -0
  70. package/dist/src/core/index.d.ts.map +1 -1
  71. package/dist/src/core/index.js +1 -0
  72. package/dist/src/core/index.js.map +1 -1
  73. package/dist/src/core/install.d.ts +2 -1
  74. package/dist/src/core/install.d.ts.map +1 -1
  75. package/dist/src/core/install.js +3 -5
  76. package/dist/src/core/install.js.map +1 -1
  77. package/dist/src/core/messages.d.ts +102 -2
  78. package/dist/src/core/messages.d.ts.map +1 -1
  79. package/dist/src/core/messages.js +34 -0
  80. package/dist/src/core/messages.js.map +1 -1
  81. package/dist/src/core/module-resolver.d.ts.map +1 -1
  82. package/dist/src/core/module-resolver.js.map +1 -1
  83. package/dist/src/core/options.d.ts +4 -0
  84. package/dist/src/core/options.d.ts.map +1 -1
  85. package/dist/src/core/parser.d.ts.map +1 -1
  86. package/dist/src/core/parser.js +36 -9
  87. package/dist/src/core/parser.js.map +1 -1
  88. package/dist/src/core/program.d.ts.map +1 -1
  89. package/dist/src/core/program.js +2 -0
  90. package/dist/src/core/program.js.map +1 -1
  91. package/dist/src/core/types.d.ts +10 -2
  92. package/dist/src/core/types.d.ts.map +1 -1
  93. package/dist/src/core/types.js.map +1 -1
  94. package/dist/src/core/util.d.ts +1 -0
  95. package/dist/src/core/util.d.ts.map +1 -1
  96. package/dist/src/core/util.js +1 -0
  97. package/dist/src/core/util.js.map +1 -1
  98. package/dist/src/emitter-framework/asset-emitter.js +2 -2
  99. package/dist/src/emitter-framework/asset-emitter.js.map +1 -1
  100. package/dist/src/emitter-framework/builders/object-builder.d.ts.map +1 -1
  101. package/dist/src/emitter-framework/builders/object-builder.js +1 -0
  102. package/dist/src/emitter-framework/builders/object-builder.js.map +1 -1
  103. package/dist/src/emitter-framework/type-emitter.d.ts +5 -5
  104. package/dist/src/emitter-framework/type-emitter.d.ts.map +1 -1
  105. package/dist/src/emitter-framework/type-emitter.js +13 -13
  106. package/dist/src/emitter-framework/type-emitter.js.map +1 -1
  107. package/dist/src/emitter-framework/types.d.ts +1 -1
  108. package/dist/src/emitter-framework/types.d.ts.map +1 -1
  109. package/dist/src/emitter-framework/types.js.map +1 -1
  110. package/dist/src/formatter/index.d.ts +1 -1
  111. package/dist/src/formatter/index.d.ts.map +1 -1
  112. package/dist/src/formatter/parser.d.ts +2 -6
  113. package/dist/src/formatter/parser.d.ts.map +1 -1
  114. package/dist/src/formatter/parser.js +1 -1
  115. package/dist/src/formatter/parser.js.map +1 -1
  116. package/dist/src/formatter/print/comment-handler.d.ts +1 -1
  117. package/dist/src/formatter/print/comment-handler.d.ts.map +1 -1
  118. package/dist/src/formatter/print/comment-handler.js +1 -2
  119. package/dist/src/formatter/print/comment-handler.js.map +1 -1
  120. package/dist/src/formatter/print/needs-parens.d.ts +1 -1
  121. package/dist/src/formatter/print/needs-parens.d.ts.map +1 -1
  122. package/dist/src/formatter/print/needs-parens.js +1 -0
  123. package/dist/src/formatter/print/needs-parens.js.map +1 -1
  124. package/dist/src/formatter/print/printer.d.ts +41 -40
  125. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  126. package/dist/src/formatter/print/printer.js +6 -4
  127. package/dist/src/formatter/print/printer.js.map +1 -1
  128. package/dist/src/formatter/print/types.d.ts +3 -3
  129. package/dist/src/formatter/print/types.d.ts.map +1 -1
  130. package/dist/src/formatter/print/util.d.ts +3 -0
  131. package/dist/src/formatter/print/util.d.ts.map +1 -0
  132. package/dist/src/formatter/print/util.js +3 -0
  133. package/dist/src/formatter/print/util.js.map +1 -0
  134. package/dist/src/index.d.ts +1 -0
  135. package/dist/src/index.d.ts.map +1 -1
  136. package/dist/src/index.js +1 -0
  137. package/dist/src/index.js.map +1 -1
  138. package/dist/src/init/init-template.d.ts +19 -1
  139. package/dist/src/init/init-template.d.ts.map +1 -1
  140. package/dist/src/init/init-template.js +15 -1
  141. package/dist/src/init/init-template.js.map +1 -1
  142. package/dist/src/init/init.d.ts +4 -4
  143. package/dist/src/init/init.d.ts.map +1 -1
  144. package/dist/src/init/init.js +41 -12
  145. package/dist/src/init/init.js.map +1 -1
  146. package/dist/src/lib/decorators.d.ts +1 -7
  147. package/dist/src/lib/decorators.d.ts.map +1 -1
  148. package/dist/src/lib/decorators.js +4 -11
  149. package/dist/src/lib/decorators.js.map +1 -1
  150. package/dist/src/server/completion.d.ts.map +1 -1
  151. package/dist/src/server/completion.js +9 -5
  152. package/dist/src/server/completion.js.map +1 -1
  153. package/dist/src/server/serverlib.d.ts.map +1 -1
  154. package/dist/src/server/serverlib.js +4 -2
  155. package/dist/src/server/serverlib.js.map +1 -1
  156. package/dist/src/server/symbol-structure.d.ts.map +1 -1
  157. package/dist/src/server/symbol-structure.js +3 -1
  158. package/dist/src/server/symbol-structure.js.map +1 -1
  159. package/dist/src/testing/types.d.ts.map +1 -1
  160. package/dist/src/testing/types.js.map +1 -1
  161. package/lib/decorators.tsp +8 -2
  162. package/lib/lib.tsp +1 -1
  163. package/package.json +2 -4
@@ -1,5 +1,6 @@
1
- import { $docFromComment, getDeprecated, getIndexer } from "../lib/decorators.js";
1
+ import { $docFromComment, getIndexer } from "../lib/decorators.js";
2
2
  import { createSymbol, createSymbolTable } from "./binder.js";
3
+ import { getDeprecationDetails, markDeprecated } from "./deprecation.js";
3
4
  import { ProjectionError, compilerAssert, reportDeprecated } from "./diagnostics.js";
4
5
  import { validateInheritanceDiscriminatedUnions } from "./helpers/discriminator-utils.js";
5
6
  import { getNamespaceFullName, getTypeName } from "./helpers/index.js";
@@ -487,7 +488,6 @@ export function createChecker(program) {
487
488
  return errorType;
488
489
  }
489
490
  const type = checkTypeReferenceSymbol(sym, node, mapper, instantiateTemplate);
490
- checkDeprecated(type, node);
491
491
  return type;
492
492
  }
493
493
  function resolveTypeReference(node) {
@@ -498,16 +498,23 @@ export function createChecker(program) {
498
498
  onCheckerDiagnostic = oldDiagnosticHook;
499
499
  return [type === errorType ? undefined : type, diagnostics];
500
500
  }
501
- function checkDeprecated(type, target) {
502
- const deprecated = getDeprecated(program, type);
503
- if (deprecated) {
504
- reportCheckerDiagnostic(createDiagnostic({
505
- code: "deprecated",
506
- format: {
507
- message: deprecated,
508
- },
509
- target,
510
- }));
501
+ function copyDeprecation(sourceType, destType) {
502
+ const deprecationDetails = getDeprecationDetails(program, sourceType);
503
+ if (deprecationDetails) {
504
+ markDeprecated(program, destType, deprecationDetails);
505
+ }
506
+ }
507
+ function checkDeprecated(type, node, target) {
508
+ if (node) {
509
+ const deprecationDetails = getDeprecationDetails(program, node);
510
+ if (deprecationDetails) {
511
+ reportDeprecation(program, target, deprecationDetails.message, reportCheckerDiagnostic);
512
+ return;
513
+ }
514
+ }
515
+ const deprecationDetails = getDeprecationDetails(program, type);
516
+ if (deprecationDetails) {
517
+ reportDeprecation(program, target, deprecationDetails.message, reportCheckerDiagnostic);
511
518
  }
512
519
  }
513
520
  function checkTypeReferenceArgs(node, mapper) {
@@ -665,6 +672,11 @@ export function createChecker(program) {
665
672
  }
666
673
  }
667
674
  }
675
+ // Check for deprecations here, first on symbol, then on type.
676
+ const declarationNode = sym === null || sym === void 0 ? void 0 : sym.declarations[0];
677
+ if (declarationNode && mapper === undefined) {
678
+ checkDeprecated(baseType, declarationNode, node);
679
+ }
668
680
  return baseType;
669
681
  }
670
682
  /**
@@ -1070,7 +1082,8 @@ export function createChecker(program) {
1070
1082
  function checkOperation(node, mapper, parentInterface) {
1071
1083
  var _a;
1072
1084
  const inInterface = ((_a = node.parent) === null || _a === void 0 ? void 0 : _a.kind) === SyntaxKind.InterfaceStatement;
1073
- const links = inInterface ? getSymbolLinksForMember(node) : getSymbolLinks(node.symbol);
1085
+ const symbol = inInterface ? getSymbolForMember(node) : node.symbol;
1086
+ const links = symbol && getSymbolLinks(symbol);
1074
1087
  if (links) {
1075
1088
  if (links.declaredType && mapper === undefined) {
1076
1089
  // we're not instantiating this operation and we've already checked it
@@ -1080,6 +1093,7 @@ export function createChecker(program) {
1080
1093
  if (mapper === undefined && inInterface) {
1081
1094
  compilerAssert(parentInterface, "Operation in interface should already have been checked.");
1082
1095
  }
1096
+ checkTemplateDeclaration(node, mapper);
1083
1097
  // If we are instantating operation inside of interface
1084
1098
  if (isTemplatedNode(node) && mapper !== undefined && parentInterface) {
1085
1099
  mapper = { ...mapper, partial: true };
@@ -1096,8 +1110,19 @@ export function createChecker(program) {
1096
1110
  return errorType;
1097
1111
  }
1098
1112
  sourceOperation = baseOperation;
1113
+ const parameterModelSym = getOrCreateAugmentedSymbolTable(symbol.metatypeMembers).get("parameters");
1099
1114
  // Reference the same return type and create the parameters type
1100
- parameters = cloneType(baseOperation.parameters);
1115
+ const clone = initializeClone(baseOperation.parameters, {
1116
+ properties: createRekeyableMap(),
1117
+ });
1118
+ clone.properties = createRekeyableMap(Array.from(baseOperation.parameters.properties.entries()).map(([key, prop]) => [
1119
+ key,
1120
+ cloneTypeForSymbol(getMemberSymbol(parameterModelSym, prop.name), prop, {
1121
+ model: clone,
1122
+ sourceProperty: prop,
1123
+ }),
1124
+ ]));
1125
+ parameters = finishType(clone);
1101
1126
  returnType = baseOperation.returnType;
1102
1127
  // Copy decorators from the base operation, inserting the base decorators first
1103
1128
  decorators = [...baseOperation.decorators];
@@ -1567,6 +1592,14 @@ export function createChecker(program) {
1567
1592
  }
1568
1593
  function resolveMetaProperty(node, base) {
1569
1594
  const resolved = resolveIdentifierInTable(node.id, base.metatypeMembers);
1595
+ if (!resolved) {
1596
+ reportCheckerDiagnostic(createDiagnostic({
1597
+ code: "invalid-ref",
1598
+ messageId: "metaProperty",
1599
+ format: { kind: getMemberKindName(base.declarations[0]), id: node.id.sv },
1600
+ target: node,
1601
+ }));
1602
+ }
1570
1603
  return resolved;
1571
1604
  }
1572
1605
  function getMemberKindName(node) {
@@ -1574,6 +1607,8 @@ export function createChecker(program) {
1574
1607
  case SyntaxKind.ModelStatement:
1575
1608
  case SyntaxKind.ModelExpression:
1576
1609
  return "Model";
1610
+ case SyntaxKind.ModelProperty:
1611
+ return "ModelProperty";
1577
1612
  case SyntaxKind.EnumStatement:
1578
1613
  return "Enum";
1579
1614
  case SyntaxKind.InterfaceStatement:
@@ -1672,6 +1707,19 @@ export function createChecker(program) {
1672
1707
  getTypeForNode(statement, undefined);
1673
1708
  }
1674
1709
  }
1710
+ /**
1711
+ * Check that the given node template parameters are valid if applicable.
1712
+ * @param node Node with template parameters
1713
+ * @param mapper Type mapper, set if instantiating the template, undefined otherwise.
1714
+ */
1715
+ function checkTemplateDeclaration(node, mapper) {
1716
+ // If mapper is undefined it means we are checking the declaration of the template.
1717
+ if (mapper === undefined) {
1718
+ for (const templateParameter of node.templateParameters) {
1719
+ checkTemplateParameterDeclaration(templateParameter, undefined);
1720
+ }
1721
+ }
1722
+ }
1675
1723
  function checkModel(node, mapper) {
1676
1724
  if (node.kind === SyntaxKind.ModelStatement) {
1677
1725
  return checkModelStatement(node, mapper);
@@ -1687,6 +1735,7 @@ export function createChecker(program) {
1687
1735
  // we're not instantiating this model and we've already checked it
1688
1736
  return links.declaredType;
1689
1737
  }
1738
+ checkTemplateDeclaration(node, mapper);
1690
1739
  const decorators = [];
1691
1740
  const type = createType({
1692
1741
  kind: "Model",
@@ -1701,7 +1750,6 @@ export function createChecker(program) {
1701
1750
  const isBase = checkModelIs(node, node.is, mapper);
1702
1751
  if (isBase) {
1703
1752
  type.sourceModel = isBase;
1704
- checkDeprecated(isBase, node.is);
1705
1753
  // copy decorators
1706
1754
  decorators.push(...isBase.decorators);
1707
1755
  if (isBase.indexer) {
@@ -1725,7 +1773,7 @@ export function createChecker(program) {
1725
1773
  else if (node.extends) {
1726
1774
  type.baseModel = checkClassHeritage(node, node.extends, mapper);
1727
1775
  if (type.baseModel) {
1728
- checkDeprecated(type.baseModel, node.extends);
1776
+ copyDeprecation(type.baseModel, type);
1729
1777
  }
1730
1778
  }
1731
1779
  if (type.baseModel) {
@@ -1738,13 +1786,6 @@ export function createChecker(program) {
1738
1786
  }
1739
1787
  // Evaluate the properties after
1740
1788
  checkModelProperties(node, type.properties, type, mapper);
1741
- for (const prop of walkPropertiesInherited(type)) {
1742
- const table = getOrCreateAugmentedSymbolTable(node.symbol.members);
1743
- const sym = table.get(prop.name);
1744
- if (sym) {
1745
- mutate(sym).type = prop;
1746
- }
1747
- }
1748
1789
  linkMapper(type, mapper);
1749
1790
  if (shouldCreateTypeForTemplate(node, mapper)) {
1750
1791
  finishType(type);
@@ -1808,7 +1849,7 @@ export function createChecker(program) {
1808
1849
  }
1809
1850
  else {
1810
1851
  // spread property
1811
- const newProperties = checkSpreadProperty(prop.target, parentModel, mapper);
1852
+ const newProperties = checkSpreadProperty(node.symbol, prop.target, parentModel, mapper);
1812
1853
  for (const newProp of newProperties) {
1813
1854
  linkIndirectMember(node, newProp, mapper);
1814
1855
  checkPropertyCompatibleWithIndexer(parentModel, newProp, prop);
@@ -1908,6 +1949,9 @@ export function createChecker(program) {
1908
1949
  break;
1909
1950
  case SyntaxKind.UnionStatement:
1910
1951
  for (const variant of node.options.values()) {
1952
+ if (!variant.id) {
1953
+ continue;
1954
+ }
1911
1955
  const name = variant.id.sv;
1912
1956
  bindMember(name, variant, 1024 /* SymbolFlags.UnionVariant */);
1913
1957
  }
@@ -1953,40 +1997,68 @@ export function createChecker(program) {
1953
1997
  }
1954
1998
  }
1955
1999
  }
1956
- function bindMetaTypes(node) {
2000
+ function copyMembersToContainer(targetContainerSym, table) {
1957
2001
  var _a;
1958
- switch (node.kind) {
1959
- case SyntaxKind.ModelProperty: {
1960
- const sym = getSymbolForMember(node);
1961
- if (sym) {
1962
- const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
1963
- table.set("type", node.value.kind === SyntaxKind.TypeReference
1964
- ? createSymbol(node.value, "", 2048 /* SymbolFlags.Alias */)
1965
- : node.value.symbol);
1966
- }
1967
- break;
2002
+ const members = (_a = augmentedSymbolTables.get(table)) !== null && _a !== void 0 ? _a : table;
2003
+ compilerAssert(targetContainerSym.members, "containerSym.members is undefined");
2004
+ const containerMembers = getOrCreateAugmentedSymbolTable(targetContainerSym.members);
2005
+ for (const member of members.values()) {
2006
+ bindMemberToContainer(targetContainerSym, containerMembers, member.name, member.declarations[0], member.flags);
2007
+ }
2008
+ }
2009
+ function bindMemberToContainer(containerSym, containerMembers, name, node, kind) {
2010
+ const sym = createSymbol(node, name, kind, containerSym);
2011
+ compilerAssert(containerSym.members, "containerSym.members is undefined");
2012
+ containerMembers.set(name, sym);
2013
+ }
2014
+ function bindMetaTypes(node) {
2015
+ const visited = new Set();
2016
+ function visit(node, symbol) {
2017
+ var _a;
2018
+ if (visited.has(node)) {
2019
+ return;
1968
2020
  }
1969
- case SyntaxKind.OperationStatement: {
1970
- const sym = (_a = node.symbol) !== null && _a !== void 0 ? _a : getSymbolForMember(node);
1971
- const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
1972
- if (node.signature.kind === SyntaxKind.OperationSignatureDeclaration) {
1973
- table.set("parameters", node.signature.parameters.symbol);
1974
- table.set("returnType", node.signature.returnType.symbol);
2021
+ visited.add(node);
2022
+ switch (node.kind) {
2023
+ case SyntaxKind.ModelProperty: {
2024
+ const sym = getSymbolForMember(node);
2025
+ if (sym) {
2026
+ const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
2027
+ table.set("type", node.value.kind === SyntaxKind.TypeReference
2028
+ ? createSymbol(node.value, "", 2048 /* SymbolFlags.Alias */)
2029
+ : node.value.symbol);
2030
+ }
2031
+ break;
1975
2032
  }
1976
- else {
1977
- const sig = resolveTypeReferenceSym(node.signature.baseOperation, undefined);
1978
- if (sig) {
1979
- const sigTable = getOrCreateAugmentedSymbolTable(sig.metatypeMembers);
1980
- table.set("parameters", sigTable.get("parameters"));
1981
- table.set("returnType", sigTable.get("returnType"));
2033
+ case SyntaxKind.OperationStatement: {
2034
+ const sym = (_a = symbol !== null && symbol !== void 0 ? symbol : node.symbol) !== null && _a !== void 0 ? _a : getSymbolForMember(node);
2035
+ const table = getOrCreateAugmentedSymbolTable(sym.metatypeMembers);
2036
+ if (node.signature.kind === SyntaxKind.OperationSignatureDeclaration) {
2037
+ table.set("parameters", node.signature.parameters.symbol);
2038
+ table.set("returnType", node.signature.returnType.symbol);
2039
+ }
2040
+ else {
2041
+ const sig = resolveTypeReferenceSym(node.signature.baseOperation, undefined);
2042
+ if (sig) {
2043
+ visit(sig.declarations[0], sig);
2044
+ const sigTable = getOrCreateAugmentedSymbolTable(sig.metatypeMembers);
2045
+ const sigParameterSym = sigTable.get("parameters");
2046
+ if (sigParameterSym !== undefined) {
2047
+ const parametersSym = createSymbol(sigParameterSym.declarations[0], "parameters", 2 /* SymbolFlags.Model */ & 674 /* SymbolFlags.MemberContainer */);
2048
+ copyMembersToContainer(parametersSym, sigParameterSym.members);
2049
+ table.set("parameters", parametersSym);
2050
+ table.set("returnType", sigTable.get("returnType"));
2051
+ }
2052
+ }
1982
2053
  }
2054
+ break;
1983
2055
  }
1984
- break;
1985
2056
  }
2057
+ visitChildren(node, (child) => {
2058
+ bindMetaTypes(child);
2059
+ });
1986
2060
  }
1987
- visitChildren(node, (child) => {
1988
- bindMetaTypes(child);
1989
- });
2061
+ visit(node);
1990
2062
  }
1991
2063
  /**
1992
2064
  * Initializes a late bound symbol for the type. This is generally necessary when attempting to
@@ -2148,7 +2220,7 @@ export function createChecker(program) {
2148
2220
  }
2149
2221
  return isType;
2150
2222
  }
2151
- function checkSpreadProperty(targetNode, parentModel, mapper) {
2223
+ function checkSpreadProperty(parentModelSym, targetNode, parentModel, mapper) {
2152
2224
  const targetType = getTypeForNode(targetNode, mapper);
2153
2225
  if (targetType.kind === "TemplateParameter" || isErrorType(targetType)) {
2154
2226
  return [];
@@ -2160,7 +2232,8 @@ export function createChecker(program) {
2160
2232
  const props = [];
2161
2233
  // copy each property
2162
2234
  for (const prop of walkPropertiesInherited(targetType)) {
2163
- props.push(cloneType(prop, {
2235
+ const memberSym = getMemberSymbol(parentModelSym, prop.name);
2236
+ props.push(cloneTypeForSymbol(memberSym, prop, {
2164
2237
  sourceProperty: prop,
2165
2238
  model: parentModel,
2166
2239
  }));
@@ -2393,6 +2466,18 @@ export function createChecker(program) {
2393
2466
  }
2394
2467
  return valid;
2395
2468
  }
2469
+ function checkAugmentDecorators(sym, targetType, mapper) {
2470
+ var _a;
2471
+ const augmentDecoratorNodes = (_a = augmentDecoratorsForSym.get(sym)) !== null && _a !== void 0 ? _a : [];
2472
+ const decorators = [];
2473
+ for (const decNode of augmentDecoratorNodes) {
2474
+ const decorator = checkDecorator(targetType, decNode, mapper);
2475
+ if (decorator) {
2476
+ decorators.unshift(decorator);
2477
+ }
2478
+ }
2479
+ return decorators;
2480
+ }
2396
2481
  function checkDecorators(targetType, node, mapper) {
2397
2482
  var _a, _b;
2398
2483
  const sym = isMemberNode(node) ? (_a = getSymbolForMember(node)) !== null && _a !== void 0 ? _a : node.symbol : node.symbol;
@@ -2413,7 +2498,7 @@ export function createChecker(program) {
2413
2498
  if (docComment) {
2414
2499
  decorators.unshift({
2415
2500
  decorator: $docFromComment,
2416
- args: [{ value: program.checker.createLiteralType(docComment), jsValue: docComment }],
2501
+ args: [{ value: createLiteralType(docComment), jsValue: docComment }],
2417
2502
  });
2418
2503
  }
2419
2504
  return decorators;
@@ -2435,6 +2520,7 @@ export function createChecker(program) {
2435
2520
  // we're not instantiating this model and we've already checked it
2436
2521
  return links.declaredType;
2437
2522
  }
2523
+ checkTemplateDeclaration(node, mapper);
2438
2524
  const decorators = [];
2439
2525
  const type = createType({
2440
2526
  kind: "Scalar",
@@ -2448,7 +2534,7 @@ export function createChecker(program) {
2448
2534
  if (node.extends) {
2449
2535
  type.baseScalar = checkScalarExtends(node, node.extends, mapper);
2450
2536
  if (type.baseScalar) {
2451
- checkDeprecated(type.baseScalar, node.extends);
2537
+ copyDeprecation(type.baseScalar, type);
2452
2538
  type.baseScalar.derivedScalars.push(type);
2453
2539
  }
2454
2540
  }
@@ -2499,6 +2585,7 @@ export function createChecker(program) {
2499
2585
  if (links.declaredType && mapper === undefined) {
2500
2586
  return links.declaredType;
2501
2587
  }
2588
+ checkTemplateDeclaration(node, mapper);
2502
2589
  const aliasSymId = getNodeSymId(node);
2503
2590
  if (pendingResolutions.has(aliasSymId)) {
2504
2591
  if (mapper === undefined) {
@@ -2544,7 +2631,7 @@ export function createChecker(program) {
2544
2631
  enumType.members.set(memberType.name, memberType);
2545
2632
  }
2546
2633
  else {
2547
- const members = checkEnumSpreadMember(enumType, member.target, mapper, memberNames);
2634
+ const members = checkEnumSpreadMember(node.symbol, enumType, member.target, mapper, memberNames);
2548
2635
  for (const memberType of members) {
2549
2636
  linkIndirectMember(node, memberType, mapper);
2550
2637
  enumType.members.set(memberType.name, memberType);
@@ -2567,6 +2654,7 @@ export function createChecker(program) {
2567
2654
  // we're not instantiating this interface and we've already checked it
2568
2655
  return links.declaredType;
2569
2656
  }
2657
+ checkTemplateDeclaration(node, mapper);
2570
2658
  const interfaceType = createType({
2571
2659
  kind: "Interface",
2572
2660
  decorators: [],
@@ -2593,11 +2681,15 @@ export function createChecker(program) {
2593
2681
  target: extendsNode,
2594
2682
  }));
2595
2683
  }
2596
- const newMember = cloneType(member, { interface: interfaceType });
2684
+ const newMember = cloneTypeForSymbol(getMemberSymbol(node.symbol, member.name), member, {
2685
+ interface: interfaceType,
2686
+ });
2597
2687
  // Don't link it it is overritten
2598
2688
  if (!ownMembers.has(member.name)) {
2599
2689
  linkIndirectMember(node, newMember, mapper);
2600
2690
  }
2691
+ // Clone deprecation information
2692
+ copyDeprecation(member, newMember);
2601
2693
  interfaceType.operations.set(newMember.name, newMember);
2602
2694
  }
2603
2695
  interfaceType.sourceInterfaces.push(extendsType);
@@ -2639,6 +2731,7 @@ export function createChecker(program) {
2639
2731
  // we're not instantiating this union and we've already checked it
2640
2732
  return links.declaredType;
2641
2733
  }
2734
+ checkTemplateDeclaration(node, mapper);
2642
2735
  const variants = createRekeyableMap();
2643
2736
  const unionType = createType({
2644
2737
  kind: "Union",
@@ -2685,7 +2778,7 @@ export function createChecker(program) {
2685
2778
  // we're not instantiating this union variant and we've already checked it
2686
2779
  return links.declaredType;
2687
2780
  }
2688
- const name = variantNode.id.sv;
2781
+ const name = variantNode.id ? variantNode.id.sv : Symbol("name");
2689
2782
  const type = getTypeForNode(variantNode.value, mapper);
2690
2783
  const variantType = createType({
2691
2784
  kind: "UnionVariant",
@@ -2711,8 +2804,14 @@ export function createChecker(program) {
2711
2804
  node.kind === SyntaxKind.OperationStatement ||
2712
2805
  node.kind === SyntaxKind.UnionVariant);
2713
2806
  }
2807
+ function getMemberSymbol(parentSym, name) {
2808
+ return parentSym ? getOrCreateAugmentedSymbolTable(parentSym.members).get(name) : undefined;
2809
+ }
2714
2810
  function getSymbolForMember(node) {
2715
2811
  var _a;
2812
+ if (!node.id) {
2813
+ return undefined;
2814
+ }
2716
2815
  const name = node.id.sv;
2717
2816
  const parentSym = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.symbol;
2718
2817
  return parentSym ? getOrCreateAugmentedSymbolTable(parentSym.members).get(name) : undefined;
@@ -2743,7 +2842,7 @@ export function createChecker(program) {
2743
2842
  member.decorators = checkDecorators(member, node, mapper);
2744
2843
  return finishType(member);
2745
2844
  }
2746
- function checkEnumSpreadMember(parentEnum, targetNode, mapper, existingMemberNames) {
2845
+ function checkEnumSpreadMember(parentEnumSym, parentEnum, targetNode, mapper, existingMemberNames) {
2747
2846
  const members = [];
2748
2847
  const targetType = getTypeForNode(targetNode, mapper);
2749
2848
  if (!isErrorType(targetType)) {
@@ -2761,7 +2860,8 @@ export function createChecker(program) {
2761
2860
  }
2762
2861
  else {
2763
2862
  existingMemberNames.add(member.name);
2764
- const clonedMember = cloneType(member, {
2863
+ const memberSym = getMemberSymbol(parentEnumSym, member.name);
2864
+ const clonedMember = cloneTypeForSymbol(memberSym, member, {
2765
2865
  enum: parentEnum,
2766
2866
  sourceMember: member,
2767
2867
  });
@@ -2773,6 +2873,29 @@ export function createChecker(program) {
2773
2873
  }
2774
2874
  return members;
2775
2875
  }
2876
+ function checkDirectives(node, type) {
2877
+ var _a;
2878
+ let hasDeprecation = false;
2879
+ ((_a = node.directives) !== null && _a !== void 0 ? _a : []).forEach((directive) => {
2880
+ if (directive.target.sv === "deprecated") {
2881
+ if (directive.arguments[0].kind !== SyntaxKind.StringLiteral) {
2882
+ reportCheckerDiagnostic(createDiagnostic({
2883
+ code: "invalid-deprecation-argument",
2884
+ target: directive.arguments[0],
2885
+ }));
2886
+ }
2887
+ if (hasDeprecation === true) {
2888
+ reportCheckerDiagnostic(createDiagnostic({ code: "duplicate-deprecation", target: node }));
2889
+ }
2890
+ else {
2891
+ hasDeprecation = true;
2892
+ markDeprecated(program, type, {
2893
+ message: directive.arguments[0].value,
2894
+ });
2895
+ }
2896
+ }
2897
+ });
2898
+ }
2776
2899
  // the types here aren't ideal and could probably be refactored.
2777
2900
  function createAndFinishType(typeDef) {
2778
2901
  createType(typeDef);
@@ -2786,7 +2909,13 @@ export function createChecker(program) {
2786
2909
  function createType(typeDef) {
2787
2910
  Object.setPrototypeOf(typeDef, typePrototype);
2788
2911
  typeDef.isFinished = false;
2789
- return typeDef;
2912
+ // If the type has an associated syntax node, check any directives that
2913
+ // might be attached.
2914
+ const createdType = typeDef;
2915
+ if (createdType.node) {
2916
+ checkDirectives(createdType.node, createdType);
2917
+ }
2918
+ return createdType;
2790
2919
  }
2791
2920
  function finishType(typeDef) {
2792
2921
  return finishTypeForProgramAndChecker(program, typePrototype, typeDef);
@@ -2921,23 +3050,7 @@ export function createChecker(program) {
2921
3050
  getSymbolLinks(globalNamespaceNode.symbol).type = type;
2922
3051
  return type;
2923
3052
  }
2924
- /**
2925
- * Clone a type, resulting in an identical type with all the same decorators
2926
- * applied. Decorators are re-run on the clone to achieve this.
2927
- *
2928
- * Care is taken to clone nested data structures that are part of the type.
2929
- * Any type with e.g. a map or an array property must recreate the map or array
2930
- * so that clones don't share the same object.
2931
- *
2932
- * For types which have sub-types that are part of it, e.g. enums with members,
2933
- * unions with variants, or models with properties, the sub-types are cloned
2934
- * as well.
2935
- *
2936
- * If the entire type graph needs to be cloned, then cloneType must be called
2937
- * recursively by the caller.
2938
- */
2939
- function cloneType(type, additionalProps = {}) {
2940
- // TODO: this needs to handle other types
3053
+ function initializeClone(type, additionalProps) {
2941
3054
  let clone;
2942
3055
  switch (type.kind) {
2943
3056
  case "Model":
@@ -2953,7 +3066,7 @@ export function createChecker(program) {
2953
3066
  cloneType(prop, { model: newModel }),
2954
3067
  ]));
2955
3068
  }
2956
- clone = finishType(newModel);
3069
+ clone = newModel;
2957
3070
  break;
2958
3071
  case "Union":
2959
3072
  const newUnion = createType({
@@ -2971,7 +3084,7 @@ export function createChecker(program) {
2971
3084
  cloneType(prop, { union: newUnion }),
2972
3085
  ]));
2973
3086
  }
2974
- clone = finishType(newUnion);
3087
+ clone = newUnion;
2975
3088
  break;
2976
3089
  case "Interface":
2977
3090
  const newInterface = createType({
@@ -2986,7 +3099,7 @@ export function createChecker(program) {
2986
3099
  cloneType(prop, { interface: newInterface }),
2987
3100
  ]));
2988
3101
  }
2989
- clone = finishType(newInterface);
3102
+ clone = newInterface;
2990
3103
  break;
2991
3104
  case "Enum":
2992
3105
  const newEnum = createType({
@@ -3001,16 +3114,35 @@ export function createChecker(program) {
3001
3114
  cloneType(prop, { enum: newEnum }),
3002
3115
  ]));
3003
3116
  }
3004
- clone = finishType(newEnum);
3117
+ clone = newEnum;
3005
3118
  break;
3006
3119
  default:
3007
- clone = createAndFinishType({
3120
+ clone = createType({
3008
3121
  ...type,
3009
3122
  ...("decorators" in type ? { decorators: [...type.decorators] } : {}),
3010
3123
  ...additionalProps,
3011
3124
  });
3012
3125
  break;
3013
3126
  }
3127
+ return clone;
3128
+ }
3129
+ /**
3130
+ * Clone a type, resulting in an identical type with all the same decorators
3131
+ * applied. Decorators are re-run on the clone to achieve this.
3132
+ *
3133
+ * Care is taken to clone nested data structures that are part of the type.
3134
+ * Any type with e.g. a map or an array property must recreate the map or array
3135
+ * so that clones don't share the same object.
3136
+ *
3137
+ * For types which have sub-types that are part of it, e.g. enums with members,
3138
+ * unions with variants, or models with properties, the sub-types are cloned
3139
+ * as well.
3140
+ *
3141
+ * If the entire type graph needs to be cloned, then cloneType must be called
3142
+ * recursively by the caller.
3143
+ */
3144
+ function cloneType(type, additionalProps = {}) {
3145
+ const clone = finishType(initializeClone(type, additionalProps));
3014
3146
  const projection = projectionsByType.get(type);
3015
3147
  if (projection) {
3016
3148
  projectionsByType.set(clone, projection);
@@ -3018,6 +3150,24 @@ export function createChecker(program) {
3018
3150
  compilerAssert(clone.kind === type.kind, "cloneType must not change type kind");
3019
3151
  return clone;
3020
3152
  }
3153
+ /**
3154
+ * Clone a type linking to the given symbol.
3155
+ * @param sym Symbol which to associate the clone
3156
+ * @param type Type to clone
3157
+ * @param additionalProps Additional properties to set/override on the clone
3158
+ * @returns cloned type
3159
+ */
3160
+ function cloneTypeForSymbol(sym, type, additionalProps = {}) {
3161
+ let clone = initializeClone(type, additionalProps);
3162
+ if ("decorators" in clone) {
3163
+ for (const dec of checkAugmentDecorators(sym, clone, undefined)) {
3164
+ clone.decorators.push(dec);
3165
+ }
3166
+ }
3167
+ clone = finishType(clone);
3168
+ compilerAssert(clone.kind === type.kind, "cloneType must not change type kind");
3169
+ return clone;
3170
+ }
3021
3171
  function checkProjectionDeclaration(node) {
3022
3172
  // todo: check for duplicate projection decls on individual types
3023
3173
  // right now you can declare the same projection on a specific type
@@ -4250,8 +4400,19 @@ function finishTypeForProgramAndChecker(program, typePrototype, typeDef) {
4250
4400
  typeDef.isFinished = true;
4251
4401
  return typeDef;
4252
4402
  }
4403
+ function reportDeprecation(program, target, message, reportFunc) {
4404
+ if (program.compilerOptions.ignoreDeprecated !== true) {
4405
+ reportFunc(createDiagnostic({
4406
+ code: "deprecated",
4407
+ format: {
4408
+ message,
4409
+ },
4410
+ target,
4411
+ }));
4412
+ }
4413
+ }
4253
4414
  function applyDecoratorToType(program, decApp, target) {
4254
- var _a;
4415
+ var _a, _b;
4255
4416
  compilerAssert("decorators" in target, "Cannot apply decorator to non-decoratable type", target);
4256
4417
  for (const arg of decApp.args) {
4257
4418
  if (isErrorType(arg.value)) {
@@ -4259,6 +4420,13 @@ function applyDecoratorToType(program, decApp, target) {
4259
4420
  return;
4260
4421
  }
4261
4422
  }
4423
+ // Is the decorator definition deprecated?
4424
+ if (decApp.definition) {
4425
+ const deprecation = getDeprecationDetails(program, decApp.definition);
4426
+ if (deprecation !== undefined) {
4427
+ reportDeprecation(program, (_a = decApp.node) !== null && _a !== void 0 ? _a : target, deprecation.message, program.reportDiagnostic);
4428
+ }
4429
+ }
4262
4430
  // peel `fn` off to avoid setting `this`.
4263
4431
  try {
4264
4432
  const args = decApp.args.map((x) => x.jsValue);
@@ -4272,7 +4440,7 @@ function applyDecoratorToType(program, decApp, target) {
4272
4440
  program.reportDiagnostic(createDiagnostic({
4273
4441
  code: "decorator-fail",
4274
4442
  format: { decoratorName: decApp.decorator.name, error: error.stack },
4275
- target: (_a = decApp.node) !== null && _a !== void 0 ? _a : target,
4443
+ target: (_b = decApp.node) !== null && _b !== void 0 ? _b : target,
4276
4444
  }));
4277
4445
  }
4278
4446
  else {