@typespec/compiler 1.6.0-dev.13 → 1.6.0-dev.15

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": "1.6.0-dev.13",
3
- "commit": "578cf57e10793b92163bde95e015c458a8e3fccd"
2
+ "version": "1.6.0-dev.15",
3
+ "commit": "2894420921882652a568ed22d5e245b26781b398"
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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"}
@@ -2103,11 +2103,13 @@ export function createChecker(program, resolver) {
2103
2103
  const resolvedOptions = typeof options === "boolean"
2104
2104
  ? { ...defaultSymbolResolutionOptions, resolveDecorators: options }
2105
2105
  : { ...defaultSymbolResolutionOptions, ...(options ?? {}) };
2106
- if (mapper === undefined && resolvedOptions.checkTemplateTypes && referenceSymCache.has(node)) {
2106
+ if (mapper === undefined &&
2107
+ !resolvedOptions.resolveDeclarationOfTemplate &&
2108
+ referenceSymCache.has(node)) {
2107
2109
  return referenceSymCache.get(node);
2108
2110
  }
2109
2111
  const sym = resolveTypeReferenceSymInternal(node, mapper, resolvedOptions);
2110
- if (resolvedOptions.checkTemplateTypes) {
2112
+ if (!resolvedOptions.resolveDeclarationOfTemplate) {
2111
2113
  referenceSymCache.set(node, sym);
2112
2114
  }
2113
2115
  return sym;
@@ -2168,6 +2170,13 @@ export function createChecker(program, resolver) {
2168
2170
  }
2169
2171
  base = aliasedSym;
2170
2172
  }
2173
+ else if (!options.resolveDeclarationOfTemplate && isTemplatedNode(getSymNode(base))) {
2174
+ const baseSym = getContainerTemplateSymbol(base, node.base, mapper);
2175
+ if (!baseSym) {
2176
+ return undefined;
2177
+ }
2178
+ base = baseSym;
2179
+ }
2171
2180
  return resolveMemberInContainer(base, node, options);
2172
2181
  }
2173
2182
  compilerAssert(false, `Unknown type reference kind "${SyntaxKind[node.kind]}"`, node);
@@ -2266,23 +2275,48 @@ export function createChecker(program, resolver) {
2266
2275
  }
2267
2276
  // Otherwise for templates we need to get the type and retrieve the late bound symbol.
2268
2277
  const aliasType = getTypeForNode(node, mapper);
2269
- if (isErrorType(aliasType)) {
2278
+ return lateBindContainer(aliasType, aliasSymbol);
2279
+ }
2280
+ /** Check case where a template type member is referenced like
2281
+ * ```
2282
+ * model Foo<T> {t: T}
2283
+ * model Test { t: Foo.t } // check `Foo` is correctly used as template
2284
+ * ```
2285
+ */
2286
+ function getContainerTemplateSymbol(sym, node, mapper) {
2287
+ if (pendingResolutions.has(sym, ResolutionKind.Type)) {
2288
+ if (mapper === undefined) {
2289
+ reportCheckerDiagnostic(createDiagnostic({
2290
+ code: "circular-alias-type",
2291
+ format: { typeName: sym.name },
2292
+ target: node,
2293
+ }));
2294
+ }
2270
2295
  return undefined;
2271
2296
  }
2272
- switch (aliasType.kind) {
2297
+ pendingResolutions.start(sym, ResolutionKind.Type);
2298
+ const type = checkTypeReferenceSymbol(sym, node, mapper);
2299
+ pendingResolutions.finish(sym, ResolutionKind.Type);
2300
+ return lateBindContainer(type, sym);
2301
+ }
2302
+ function lateBindContainer(type, sym) {
2303
+ if (isErrorType(type)) {
2304
+ return undefined;
2305
+ }
2306
+ switch (type.kind) {
2273
2307
  case "Model":
2274
2308
  case "Interface":
2275
2309
  case "Union":
2276
- if (isTemplateInstance(aliasType)) {
2310
+ if (isTemplateInstance(type)) {
2277
2311
  // this is an alias for some instantiation, so late-bind the instantiation
2278
- lateBindMemberContainer(aliasType);
2279
- return aliasType.symbol;
2312
+ lateBindMemberContainer(type);
2313
+ return type.symbol;
2280
2314
  }
2281
2315
  // fallthrough
2282
2316
  default:
2283
2317
  // get the symbol from the node aliased type's node, or just return the base
2284
2318
  // if it doesn't have a symbol (which will likely result in an error later on)
2285
- return getMergedSymbol(aliasType.node.symbol) ?? aliasSymbol;
2319
+ return getMergedSymbol(type.node.symbol) ?? sym;
2286
2320
  }
2287
2321
  }
2288
2322
  function checkStringTemplateExpresion(node, mapper) {
@@ -3737,7 +3771,7 @@ export function createChecker(program, resolver) {
3737
3771
  */
3738
3772
  function checkAugmentDecorator(node) {
3739
3773
  // This will validate the target type is pointing to a valid ref.
3740
- resolveTypeReferenceSym(node.targetType, undefined);
3774
+ resolveTypeReferenceSym(node.targetType, undefined, { resolveDeclarationOfTemplate: true });
3741
3775
  const links = resolver.getNodeLinks(node.targetType);
3742
3776
  if (links.isTemplateInstantiation) {
3743
3777
  program.reportDiagnostic(createDiagnostic({
@@ -4103,6 +4137,14 @@ export function createChecker(program, resolver) {
4103
4137
  }
4104
4138
  function checkInterfaceMembers(node, mapper, interfaceType) {
4105
4139
  const ownMembers = new Map();
4140
+ // Preregister each operation sym links instantiation to make sure there is no race condition when instantiating templated interface
4141
+ for (const opNode of node.operations) {
4142
+ const symbol = getSymbolForMember(opNode);
4143
+ const links = symbol && getSymbolLinks(symbol);
4144
+ if (links) {
4145
+ links.instantiations = new TypeInstantiationMap();
4146
+ }
4147
+ }
4106
4148
  for (const opNode of node.operations) {
4107
4149
  const opType = checkOperation(opNode, mapper, interfaceType);
4108
4150
  if (ownMembers.has(opType.name)) {
@@ -4993,7 +5035,7 @@ class PendingResolutions {
4993
5035
  }
4994
5036
  const defaultSymbolResolutionOptions = {
4995
5037
  resolveDecorators: false,
4996
- checkTemplateTypes: true,
5038
+ resolveDeclarationOfTemplate: false,
4997
5039
  };
4998
5040
  function printTypeReferenceNode(node) {
4999
5041
  switch (node.kind) {