@typespec/compiler 0.48.0-dev.11 → 0.48.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.
package/dist/manifest.js CHANGED
@@ -1,4 +1,4 @@
1
1
  export default {
2
- "version": "0.48.0-dev.11",
3
- "commit": "e881658653d6da1bd5d2fea37b5dbaa7cce905e9"
2
+ "version": "0.48.0-dev.13",
3
+ "commit": "af7fd4fbc2021e796bff9f81627c3136cddbffaa"
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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"}
@@ -3797,42 +3797,55 @@ export function createChecker(program) {
3797
3797
  * @param diagnosticTarget Target for the diagnostic, unless something better can be inferred.
3798
3798
  */
3799
3799
  function isTypeAssignableTo(source, target, diagnosticTarget) {
3800
+ const [related, diagnostics] = isTypeAssignableToInternal(source, target, diagnosticTarget, new MultiKeyMap());
3801
+ return [related === Related.true, diagnostics];
3802
+ }
3803
+ function isTypeAssignableToInternal(source, target, diagnosticTarget, relationCache) {
3804
+ const cached = relationCache.get([source, target]);
3805
+ if (cached !== undefined) {
3806
+ return [cached, []];
3807
+ }
3808
+ const [result, diagnostics] = isTypeAssignableToWorker(source, target, diagnosticTarget, new MultiKeyMap());
3809
+ relationCache.set([source, target], result);
3810
+ return [result, diagnostics];
3811
+ }
3812
+ function isTypeAssignableToWorker(source, target, diagnosticTarget, relationCache) {
3800
3813
  var _a;
3801
3814
  // BACKCOMPAT: Added May 2023 sprint, to be removed by June 2023 sprint
3802
3815
  if (source.kind === "TemplateParameter" && source.constraint && target.kind === "Value") {
3803
- const [assignable] = isTypeAssignableTo(source.constraint, target.target, diagnosticTarget);
3816
+ const [assignable] = isTypeAssignableToInternal(source.constraint, target.target, diagnosticTarget, relationCache);
3804
3817
  if (assignable) {
3805
3818
  const constraint = getTypeName(source.constraint);
3806
3819
  reportDeprecated(program, `Template constrainted to '${constraint}' will not be assignable to '${getTypeName(target)}' in the future. Update the constraint to be 'valueof ${constraint}'`, diagnosticTarget);
3807
- return [true, []];
3820
+ return [Related.true, []];
3808
3821
  }
3809
3822
  }
3810
3823
  if (source.kind === "TemplateParameter") {
3811
3824
  source = (_a = source.constraint) !== null && _a !== void 0 ? _a : unknownType;
3812
3825
  }
3813
3826
  if (source === target)
3814
- return [true, []];
3827
+ return [Related.true, []];
3815
3828
  if (target.kind === "Value") {
3816
- return isAssignableToValueType(source, target, diagnosticTarget);
3829
+ return isAssignableToValueType(source, target, diagnosticTarget, relationCache);
3817
3830
  }
3818
3831
  if (source.kind === "Value") {
3819
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3832
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3820
3833
  }
3821
3834
  const isSimpleTypeRelated = isSimpleTypeAssignableTo(source, target);
3822
3835
  if (isSimpleTypeRelated === true) {
3823
- return [true, []];
3836
+ return [Related.true, []];
3824
3837
  }
3825
3838
  else if (isSimpleTypeRelated === false) {
3826
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3839
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3827
3840
  }
3828
3841
  if (source.kind === "Union") {
3829
3842
  for (const variant of source.variants.values()) {
3830
- const [variantAssignable] = isTypeAssignableTo(variant.type, target, diagnosticTarget);
3843
+ const [variantAssignable] = isTypeAssignableToInternal(variant.type, target, diagnosticTarget, relationCache);
3831
3844
  if (!variantAssignable) {
3832
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3845
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3833
3846
  }
3834
3847
  }
3835
- return [true, []];
3848
+ return [Related.true, []];
3836
3849
  }
3837
3850
  if (target.kind === "Model" &&
3838
3851
  source.kind === "Model" &&
@@ -3841,7 +3854,7 @@ export function createChecker(program) {
3841
3854
  source.indexer &&
3842
3855
  source.indexer.key.name === "integer") {
3843
3856
  return [
3844
- false,
3857
+ Related.false,
3845
3858
  [
3846
3859
  createDiagnostic({
3847
3860
  code: "missing-index",
@@ -3855,43 +3868,43 @@ export function createChecker(program) {
3855
3868
  ];
3856
3869
  }
3857
3870
  else if (target.kind === "Model" && target.indexer !== undefined && source.kind === "Model") {
3858
- return isIndexerValid(source, target, diagnosticTarget);
3871
+ return isIndexerValid(source, target, diagnosticTarget, relationCache);
3859
3872
  }
3860
3873
  else if (target.kind === "Model" && source.kind === "Model") {
3861
- return isModelRelatedTo(source, target, diagnosticTarget);
3874
+ return isModelRelatedTo(source, target, diagnosticTarget, relationCache);
3862
3875
  }
3863
3876
  else if (target.kind === "Model" && target.indexer && source.kind === "Tuple") {
3864
3877
  for (const item of source.values) {
3865
- const [related, diagnostics] = isTypeAssignableTo(item, target.indexer.value, diagnosticTarget);
3878
+ const [related, diagnostics] = isTypeAssignableToInternal(item, target.indexer.value, diagnosticTarget, relationCache);
3866
3879
  if (!related) {
3867
- return [false, diagnostics];
3880
+ return [Related.false, diagnostics];
3868
3881
  }
3869
3882
  }
3870
- return [true, []];
3883
+ return [Related.true, []];
3871
3884
  }
3872
3885
  else if (target.kind === "Tuple" && source.kind === "Tuple") {
3873
- return isTupleAssignableToTuple(source, target, diagnosticTarget);
3886
+ return isTupleAssignableToTuple(source, target, diagnosticTarget, relationCache);
3874
3887
  }
3875
3888
  else if (target.kind === "Union") {
3876
- return isAssignableToUnion(source, target, diagnosticTarget);
3889
+ return isAssignableToUnion(source, target, diagnosticTarget, relationCache);
3877
3890
  }
3878
3891
  else if (target.kind === "Enum") {
3879
3892
  return isAssignableToEnum(source, target, diagnosticTarget);
3880
3893
  }
3881
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3894
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3882
3895
  }
3883
- function isAssignableToValueType(source, target, diagnosticTarget) {
3896
+ function isAssignableToValueType(source, target, diagnosticTarget, relationCache) {
3884
3897
  if (source.kind === "Value") {
3885
- return isTypeAssignableTo(source.target, target.target, diagnosticTarget);
3898
+ return isTypeAssignableToInternal(source.target, target.target, diagnosticTarget, relationCache);
3886
3899
  }
3887
- const [assignable, diagnostics] = isTypeAssignableTo(source, target.target, diagnosticTarget);
3900
+ const [assignable, diagnostics] = isTypeAssignableToInternal(source, target.target, diagnosticTarget, relationCache);
3888
3901
  if (!assignable) {
3889
3902
  return [assignable, diagnostics];
3890
3903
  }
3891
3904
  if (!isValueType(source)) {
3892
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3905
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
3893
3906
  }
3894
- return [true, []];
3907
+ return [Related.true, []];
3895
3908
  }
3896
3909
  function isReflectionType(type) {
3897
3910
  var _a, _b, _c;
@@ -3974,7 +3987,8 @@ export function createChecker(program) {
3974
3987
  const [low, high, options] = numericRanges[target.name];
3975
3988
  return source.value >= low && source.value <= high && (!options.int || isInt);
3976
3989
  }
3977
- function isModelRelatedTo(source, target, diagnosticTarget) {
3990
+ function isModelRelatedTo(source, target, diagnosticTarget, relationCache) {
3991
+ relationCache.set([source, target], Related.maybe);
3978
3992
  const diagnostics = [];
3979
3993
  for (const prop of walkPropertiesInherited(target)) {
3980
3994
  const sourceProperty = getProperty(source, prop.name);
@@ -3992,27 +4006,27 @@ export function createChecker(program) {
3992
4006
  }
3993
4007
  }
3994
4008
  else {
3995
- const [related, propDiagnostics] = isTypeAssignableTo(sourceProperty.type, prop.type, diagnosticTarget);
4009
+ const [related, propDiagnostics] = isTypeAssignableToInternal(sourceProperty.type, prop.type, diagnosticTarget, relationCache);
3996
4010
  if (!related) {
3997
4011
  diagnostics.push(...propDiagnostics);
3998
4012
  }
3999
4013
  }
4000
4014
  }
4001
- return [diagnostics.length === 0, diagnostics];
4015
+ return [diagnostics.length === 0 ? Related.true : Related.false, diagnostics];
4002
4016
  }
4003
4017
  function getProperty(model, name) {
4004
4018
  var _a;
4005
4019
  return ((_a = model.properties.get(name)) !== null && _a !== void 0 ? _a : (model.baseModel !== undefined ? getProperty(model.baseModel, name) : undefined));
4006
4020
  }
4007
- function isIndexerValid(source, target, diagnosticTarget) {
4021
+ function isIndexerValid(source, target, diagnosticTarget, relationCache) {
4008
4022
  // Model expressions should be able to be assigned.
4009
4023
  if (source.name === "" && target.indexer.key.name !== "integer") {
4010
- return isIndexConstraintValid(target.indexer.value, source, diagnosticTarget);
4024
+ return isIndexConstraintValid(target.indexer.value, source, diagnosticTarget, relationCache);
4011
4025
  }
4012
4026
  else {
4013
4027
  if (source.indexer === undefined || source.indexer.key !== target.indexer.key) {
4014
4028
  return [
4015
- false,
4029
+ Related.false,
4016
4030
  [
4017
4031
  createDiagnostic({
4018
4032
  code: "missing-index",
@@ -4025,7 +4039,7 @@ export function createChecker(program) {
4025
4039
  ],
4026
4040
  ];
4027
4041
  }
4028
- return isTypeAssignableTo(source.indexer.value, target.indexer.value, diagnosticTarget);
4042
+ return isTypeAssignableToInternal(source.indexer.value, target.indexer.value, diagnosticTarget, relationCache);
4029
4043
  }
4030
4044
  }
4031
4045
  /**
@@ -4033,25 +4047,25 @@ export function createChecker(program) {
4033
4047
  * @param type Type of the model that should be respecting the constraint.
4034
4048
  * @param diagnosticTarget Diagnostic target unless something better can be inferred.
4035
4049
  */
4036
- function isIndexConstraintValid(constraintType, type, diagnosticTarget) {
4050
+ function isIndexConstraintValid(constraintType, type, diagnosticTarget, relationCache) {
4037
4051
  for (const prop of type.properties.values()) {
4038
4052
  const [related, diagnostics] = isTypeAssignableTo(prop.type, constraintType, diagnosticTarget);
4039
4053
  if (!related) {
4040
- return [false, diagnostics];
4054
+ return [Related.false, diagnostics];
4041
4055
  }
4042
4056
  }
4043
4057
  if (type.baseModel) {
4044
- const [related, diagnostics] = isIndexConstraintValid(constraintType, type.baseModel, diagnosticTarget);
4058
+ const [related, diagnostics] = isIndexConstraintValid(constraintType, type.baseModel, diagnosticTarget, relationCache);
4045
4059
  if (!related) {
4046
- return [false, diagnostics];
4060
+ return [Related.false, diagnostics];
4047
4061
  }
4048
4062
  }
4049
- return [true, []];
4063
+ return [Related.true, []];
4050
4064
  }
4051
- function isTupleAssignableToTuple(source, target, diagnosticTarget) {
4065
+ function isTupleAssignableToTuple(source, target, diagnosticTarget, relationCache) {
4052
4066
  if (source.values.length !== target.values.length) {
4053
4067
  return [
4054
- false,
4068
+ Related.false,
4055
4069
  [
4056
4070
  createDiagnostic({
4057
4071
  code: "unassignable",
@@ -4068,40 +4082,40 @@ export function createChecker(program) {
4068
4082
  }
4069
4083
  for (const [index, sourceItem] of source.values.entries()) {
4070
4084
  const targetItem = target.values[index];
4071
- const [related, diagnostics] = isTypeAssignableTo(sourceItem, targetItem, diagnosticTarget);
4085
+ const [related, diagnostics] = isTypeAssignableToInternal(sourceItem, targetItem, diagnosticTarget, relationCache);
4072
4086
  if (!related) {
4073
- return [false, diagnostics];
4087
+ return [Related.false, diagnostics];
4074
4088
  }
4075
4089
  }
4076
- return [true, []];
4090
+ return [Related.true, []];
4077
4091
  }
4078
- function isAssignableToUnion(source, target, diagnosticTarget) {
4092
+ function isAssignableToUnion(source, target, diagnosticTarget, relationCache) {
4079
4093
  for (const option of target.variants.values()) {
4080
- const [related] = isTypeAssignableTo(source, option.type, diagnosticTarget);
4094
+ const [related] = isTypeAssignableToInternal(source, option.type, diagnosticTarget, relationCache);
4081
4095
  if (related) {
4082
- return [true, []];
4096
+ return [Related.true, []];
4083
4097
  }
4084
4098
  }
4085
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4099
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4086
4100
  }
4087
4101
  function isAssignableToEnum(source, target, diagnosticTarget) {
4088
4102
  switch (source.kind) {
4089
4103
  case "Enum":
4090
4104
  if (source === target) {
4091
- return [true, []];
4105
+ return [Related.true, []];
4092
4106
  }
4093
4107
  else {
4094
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4108
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4095
4109
  }
4096
4110
  case "EnumMember":
4097
4111
  if (source.enum === target) {
4098
- return [true, []];
4112
+ return [Related.true, []];
4099
4113
  }
4100
4114
  else {
4101
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4115
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4102
4116
  }
4103
4117
  default:
4104
- return [false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4118
+ return [Related.false, [createUnassignableDiagnostic(source, target, diagnosticTarget)]];
4105
4119
  }
4106
4120
  }
4107
4121
  function createUnassignableDiagnostic(source, target, diagnosticTarget) {
@@ -4522,4 +4536,10 @@ const ReflectionNameToKind = {
4522
4536
  UnionVariant: "UnionVariant",
4523
4537
  };
4524
4538
  const _assertReflectionNameToKind = ReflectionNameToKind;
4539
+ var Related;
4540
+ (function (Related) {
4541
+ Related[Related["false"] = 0] = "false";
4542
+ Related[Related["true"] = 1] = "true";
4543
+ Related[Related["maybe"] = 2] = "maybe";
4544
+ })(Related || (Related = {}));
4525
4545
  //# sourceMappingURL=checker.js.map