@typespec/compiler 1.16.0-dev.6 → 1.16.0-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (38) hide show
  1. package/dist/manifest.js +2 -2
  2. package/dist/src/core/checker.d.ts.map +1 -1
  3. package/dist/src/core/checker.js +117 -0
  4. package/dist/src/core/checker.js.map +1 -1
  5. package/dist/src/core/features.d.ts +3 -0
  6. package/dist/src/core/features.d.ts.map +1 -1
  7. package/dist/src/core/features.js +3 -0
  8. package/dist/src/core/features.js.map +1 -1
  9. package/dist/src/core/js-marshaller.js +3 -5
  10. package/dist/src/core/js-marshaller.js.map +1 -1
  11. package/dist/src/core/messages.d.ts +43 -2
  12. package/dist/src/core/messages.d.ts.map +1 -1
  13. package/dist/src/core/messages.js +13 -0
  14. package/dist/src/core/messages.js.map +1 -1
  15. package/dist/src/core/parser.d.ts.map +1 -1
  16. package/dist/src/core/parser.js +10 -0
  17. package/dist/src/core/parser.js.map +1 -1
  18. package/dist/src/core/semantic-walker.d.ts.map +1 -1
  19. package/dist/src/core/semantic-walker.js +3 -0
  20. package/dist/src/core/semantic-walker.js.map +1 -1
  21. package/dist/src/core/types.d.ts +27 -0
  22. package/dist/src/core/types.d.ts.map +1 -1
  23. package/dist/src/core/types.js.map +1 -1
  24. package/dist/src/experimental/mutators.js +1 -0
  25. package/dist/src/experimental/mutators.js.map +1 -1
  26. package/dist/src/formatter/print/comment-handler.d.ts.map +1 -1
  27. package/dist/src/formatter/print/comment-handler.js +34 -60
  28. package/dist/src/formatter/print/comment-handler.js.map +1 -1
  29. package/dist/src/formatter/print/printer.d.ts.map +1 -1
  30. package/dist/src/formatter/print/printer.js +8 -2
  31. package/dist/src/formatter/print/printer.js.map +1 -1
  32. package/dist/src/server/completion.js +10 -1
  33. package/dist/src/server/completion.js.map +1 -1
  34. package/dist/src/server/tmlanguage.d.ts.map +1 -1
  35. package/dist/src/server/tmlanguage.js +16 -1
  36. package/dist/src/server/tmlanguage.js.map +1 -1
  37. package/dist/typespec.tmLanguage +36 -0
  38. package/package.json +16 -16
package/dist/manifest.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export default {
2
- "version": "1.16.0-dev.6",
3
- "commit": "0bd0c174228cf559ec7d4c9edec904294b59b9bc"
2
+ "version": "1.16.0-dev.8",
3
+ "commit": "64f7850fb6e6069965ba8774643241b6a74f881c"
4
4
  };
@@ -1 +1 @@
1
- {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/checker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/checker.ts"],"names":[],"mappings":"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"}
@@ -834,6 +834,8 @@ export function createChecker(program, resolver) {
834
834
  isTypeReferenceContextDeprecated(node.parent)));
835
835
  case SyntaxKind.InterfaceStatement:
836
836
  return checkDeprecatedNode(node);
837
+ case SyntaxKind.UnionStatement:
838
+ return checkDeprecatedNode(node);
837
839
  case SyntaxKind.IntersectionExpression:
838
840
  case SyntaxKind.UnionExpression:
839
841
  case SyntaxKind.ModelProperty:
@@ -5771,6 +5773,12 @@ export function createChecker(program, resolver) {
5771
5773
  }
5772
5774
  if (ctx.mapper === undefined) {
5773
5775
  checkModifiers(program, node);
5776
+ if (node.extends && !isCompilerFeatureEnabled(program, "union-extends", node)) {
5777
+ reportCheckerDiagnostic(createDiagnostic({
5778
+ code: "union-extends-disabled",
5779
+ target: node.extends,
5780
+ }));
5781
+ }
5774
5782
  }
5775
5783
  checkTemplateDeclaration(ctx, node);
5776
5784
  const variants = createRekeyableMap();
@@ -5787,6 +5795,9 @@ export function createChecker(program, resolver) {
5787
5795
  expression: false,
5788
5796
  });
5789
5797
  linkType(ctx, links, unionType);
5798
+ if (node.extends) {
5799
+ unionType.baseType = checkUnionBaseType(ctx, node, unionType, node.extends);
5800
+ }
5790
5801
  unionType.decorators = checkDecorators(ctx, unionType, node);
5791
5802
  checkUnionVariants(ctx, unionType, node, variants);
5792
5803
  linkMapper(unionType, ctx.mapper);
@@ -5812,8 +5823,114 @@ export function createChecker(program, resolver) {
5812
5823
  continue;
5813
5824
  }
5814
5825
  variants.set(variantType.name, variantType);
5826
+ checkUnionVariantAgainstBaseType(ctx, parentUnion, variantNode, variantType);
5815
5827
  }
5816
5828
  }
5829
+ /**
5830
+ * Validate that a union variant satisfies the constraint declared by the union `extends` clause.
5831
+ * Skipped inside of an uninstantiated template declaration where variant types are still
5832
+ * unresolved template parameters. Each instantiation is checked instead.
5833
+ */
5834
+ function checkUnionVariantAgainstBaseType(ctx, parentUnion, variantNode, variantType) {
5835
+ const baseType = parentUnion.baseType;
5836
+ if (baseType === undefined || ctx.hasFlags(CheckFlags.InTemplateDeclaration)) {
5837
+ return;
5838
+ }
5839
+ if (isErrorType(variantType.type)) {
5840
+ return;
5841
+ }
5842
+ checkTypeAssignable(variantType.type, baseType, variantNode.value);
5843
+ }
5844
+ /**
5845
+ * Resolve the type referenced by a union `extends` clause.
5846
+ *
5847
+ * The resulting type is only a constraint on the union variants: it doesn't create any
5848
+ * inheritance relationship, it doesn't add anything to the union and it doesn't make the
5849
+ * union extensible.
5850
+ */
5851
+ function checkUnionBaseType(ctx, union, unionType, extendsRef) {
5852
+ const unionSymId = getNodeSym(union);
5853
+ pendingResolutions.start(unionSymId, ResolutionKind.BaseType);
5854
+ try {
5855
+ const target = resolver.getNodeLinks(extendsRef).resolvedSymbol;
5856
+ if (target && pendingResolutions.has(target, ResolutionKind.BaseType)) {
5857
+ if (ctx.mapper === undefined) {
5858
+ reportCheckerDiagnostic(createDiagnostic({
5859
+ code: "circular-base-type",
5860
+ format: { typeName: target.name },
5861
+ target: target,
5862
+ }));
5863
+ }
5864
+ return undefined;
5865
+ }
5866
+ const baseType = getTypeForNode(extendsRef, ctx);
5867
+ if (isErrorType(baseType)) {
5868
+ // Should already have reported an error when resolving the expression.
5869
+ return undefined;
5870
+ }
5871
+ // `extends` accepts an arbitrary expression so, unlike `model`/`scalar`, the union can
5872
+ // also reference itself through a union expression (e.g. `union a extends a | string` or
5873
+ // `union a extends b` with `alias b = a | string`). Those don't go through a symbol that
5874
+ // `pendingResolutions` can observe so they are detected on the resolved type instead.
5875
+ if (unionExpressionReferences(baseType, unionType)) {
5876
+ if (ctx.mapper === undefined) {
5877
+ reportCheckerDiagnostic(createDiagnostic({
5878
+ code: "circular-base-type",
5879
+ format: { typeName: union.id.sv },
5880
+ target: extendsRef,
5881
+ }));
5882
+ }
5883
+ return undefined;
5884
+ }
5885
+ if (ctx.hasFlags(CheckFlags.InTemplateDeclaration) &&
5886
+ (baseType.kind === "TemplateParameter" || baseType.kind === "TemplateParameterAccess")) {
5887
+ return undefined;
5888
+ }
5889
+ if (baseType.kind === "Model" && baseType.node?.kind === SyntaxKind.ModelExpression) {
5890
+ reportCheckerDiagnostic(createDiagnostic({
5891
+ code: "extend-union",
5892
+ messageId: "modelExpression",
5893
+ target: extendsRef,
5894
+ }));
5895
+ return undefined;
5896
+ }
5897
+ if (!isUnionBaseType(baseType)) {
5898
+ reportCheckerDiagnostic(createDiagnostic({ code: "extend-union", target: extendsRef }));
5899
+ return undefined;
5900
+ }
5901
+ return baseType;
5902
+ }
5903
+ finally {
5904
+ pendingResolutions.finish(unionSymId, ResolutionKind.BaseType);
5905
+ }
5906
+ }
5907
+ function isUnionBaseType(type) {
5908
+ return (type.kind === "Model" ||
5909
+ type.kind === "Scalar" ||
5910
+ type.kind === "Enum" ||
5911
+ type.kind === "Union");
5912
+ }
5913
+ /**
5914
+ * Check whether `target` is reachable from `type` through union expressions only.
5915
+ *
5916
+ * Traversal deliberately stops at anything else (named unions, models, arrays, ...): a union
5917
+ * referencing itself from those positions builds a perfectly valid cyclic type graph, exactly
5918
+ * like `model Foo { foo: Foo }` does, and must not be reported. Only union expressions are
5919
+ * followed, which is a finite syntactic structure, so this always terminates.
5920
+ */
5921
+ function unionExpressionReferences(type, target) {
5922
+ if (type === target) {
5923
+ return true;
5924
+ }
5925
+ if (type.kind === "Union" && type.expression) {
5926
+ for (const variant of type.variants.values()) {
5927
+ if (unionExpressionReferences(variant.type, target)) {
5928
+ return true;
5929
+ }
5930
+ }
5931
+ }
5932
+ return false;
5933
+ }
5817
5934
  function checkUnionVariant(ctx, variantNode) {
5818
5935
  const links = getSymbolLinksForMember(variantNode);
5819
5936
  if (links && links.declaredType && ctx.mapper === undefined) {