@typespec/compiler 0.52.0-dev.2 → 0.52.0-dev.3

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.52.0-dev.2",
3
- "commit": "aae7166f0a4a619a8a07f1b15a749fc41e849a6a"
2
+ "version": "0.52.0-dev.3",
3
+ "commit": "cb92f49e0ada6be620ba9197d06b1d19a2bd402a"
4
4
  };
@@ -89,6 +89,10 @@ export interface TypeSpecCompletionItem {
89
89
  * Optional label if different from the text to complete.
90
90
  */
91
91
  label?: string;
92
+ /**
93
+ * Optional text to be appended to the completion if accepted.
94
+ */
95
+ suffix?: string;
92
96
  }
93
97
  export declare function createChecker(program: Program): Checker;
94
98
  /**
@@ -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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"}
@@ -12,7 +12,7 @@ import { validateInheritanceDiscriminatedUnions } from "./helpers/discriminator-
12
12
  import { getNamespaceFullName, getTypeName, stringTemplateToString, } from "./helpers/index.js";
13
13
  import { isStringTemplateSerializable } from "./helpers/string-template-utils.js";
14
14
  import { createDiagnostic } from "./messages.js";
15
- import { getIdentifierContext, hasParseError, visitChildren } from "./parser.js";
15
+ import { exprIsBareIdentifier, getIdentifierContext, hasParseError, visitChildren, } from "./parser.js";
16
16
  import { createProjectionMembers } from "./projection-members.js";
17
17
  import { getFullyQualifiedSymbolName, getParentTemplateNode, isNeverType, isTemplateInstance, isUnknownType, isVoidType, } from "./type-utils.js";
18
18
  import { IdentifierKind, SyntaxKind, } from "./types.js";
@@ -372,6 +372,8 @@ export function createChecker(program) {
372
372
  return checkFunctionDeclaration(node, mapper);
373
373
  case SyntaxKind.TypeReference:
374
374
  return checkTypeReference(node, mapper);
375
+ case SyntaxKind.TemplateArgument:
376
+ return checkTemplateArgument(node, mapper);
375
377
  case SyntaxKind.TemplateParameterDeclaration:
376
378
  return checkTemplateParameterDeclaration(node, mapper);
377
379
  case SyntaxKind.ProjectionStatement:
@@ -498,6 +500,9 @@ export function createChecker(program) {
498
500
  const type = checkTypeReferenceSymbol(sym, node, mapper, instantiateTemplate);
499
501
  return type;
500
502
  }
503
+ function checkTemplateArgument(node, mapper) {
504
+ return getTypeForNode(node.argument, mapper);
505
+ }
501
506
  function resolveTypeReference(node) {
502
507
  const oldDiagnosticHook = onCheckerDiagnostic;
503
508
  const diagnostics = [];
@@ -560,69 +565,117 @@ export function createChecker(program) {
560
565
  return false;
561
566
  }
562
567
  }
563
- function checkTypeReferenceArgs(node, mapper) {
564
- const args = [];
565
- if (node.kind !== SyntaxKind.TypeReference) {
566
- return args;
567
- }
568
- for (const arg of node.arguments) {
569
- const value = getTypeForNode(arg, mapper);
570
- args.push([arg, value]);
571
- }
572
- return args;
573
- }
574
- function checkTemplateInstantiationArgs(node, args, declarations) {
575
- var _a, _b, _c;
576
- if (args.length > declarations.length) {
577
- reportCheckerDiagnostic(createDiagnostic({
578
- code: "invalid-template-args",
579
- messageId: "tooMany",
580
- target: node,
581
- }));
582
- // Too many args shouldn't matter for instantiating we can still go ahead
583
- }
584
- const values = [];
585
- const params = [];
586
- let tooFew = false;
587
- for (let i = 0; i < declarations.length; i++) {
588
- const declaration = declarations[i];
589
- const declaredType = getTypeForNode(declaration);
590
- params.push(declaredType);
591
- if (i < args.length) {
592
- let [valueNode, value] = args[i];
593
- if (declaredType.constraint) {
594
- if (!checkTypeAssignable(value, declaredType.constraint, valueNode)) {
595
- // TODO-TIM check if we expose this below
596
- value =
597
- ((_a = declaredType.constraint) === null || _a === void 0 ? void 0 : _a.kind) === "Value" ? unknownType : declaredType.constraint;
598
- }
568
+ function checkTemplateInstantiationArgs(node, args, decls, mapper) {
569
+ var _a, _b, _c, _d;
570
+ var _e;
571
+ const params = new Map();
572
+ const positional = [];
573
+ const initMap = new Map(decls.map(function (decl) {
574
+ const declaredType = getTypeForNode(decl);
575
+ positional.push(declaredType);
576
+ params.set(decl.id.sv, declaredType);
577
+ return [
578
+ declaredType,
579
+ {
580
+ decl,
581
+ checkArgument: null,
582
+ },
583
+ ];
584
+ }));
585
+ let named = false;
586
+ for (const [arg, idx] of args.map((v, i) => [v, i])) {
587
+ function deferredCheck() {
588
+ return [arg, getTypeForNode(arg.argument, mapper)];
589
+ }
590
+ if (arg.name) {
591
+ named = true;
592
+ const param = params.get(arg.name.sv);
593
+ if (!param) {
594
+ reportCheckerDiagnostic(createDiagnostic({
595
+ code: "invalid-template-args",
596
+ messageId: "unknownName",
597
+ format: {
598
+ name: arg.name.sv,
599
+ },
600
+ target: arg,
601
+ }));
602
+ continue;
603
+ }
604
+ if (initMap.get(param).checkArgument !== null) {
605
+ reportCheckerDiagnostic(createDiagnostic({
606
+ code: "invalid-template-args",
607
+ messageId: "specifiedAgain",
608
+ format: {
609
+ name: arg.name.sv,
610
+ },
611
+ target: arg,
612
+ }));
613
+ continue;
599
614
  }
600
- values.push(value);
615
+ initMap.get(param).checkArgument = deferredCheck;
601
616
  }
602
617
  else {
603
- const mapper = createTypeMapper(params, values);
604
- const defaultValue = getResolvedTypeParameterDefault(declaredType, declaration, mapper);
618
+ if (named) {
619
+ reportCheckerDiagnostic(createDiagnostic({
620
+ code: "invalid-template-args",
621
+ messageId: "positionalAfterNamed",
622
+ target: arg,
623
+ }));
624
+ // we just throw this arg away. any missing args will be filled with ErrorType
625
+ }
626
+ if (idx >= positional.length) {
627
+ reportCheckerDiagnostic(createDiagnostic({
628
+ code: "invalid-template-args",
629
+ messageId: "tooMany",
630
+ target: node,
631
+ }));
632
+ continue;
633
+ }
634
+ const param = positional[idx];
635
+ (_a = (_e = initMap.get(param)).checkArgument) !== null && _a !== void 0 ? _a : (_e.checkArgument = deferredCheck);
636
+ }
637
+ }
638
+ const finalMap = initMap;
639
+ const mapperParams = [];
640
+ const mapperArgs = [];
641
+ for (const [param, { decl, checkArgument: init }] of [...initMap]) {
642
+ function commit(param, type) {
643
+ finalMap.set(param, type);
644
+ mapperParams.push(param);
645
+ mapperArgs.push(type);
646
+ }
647
+ if (init === null) {
648
+ const argumentMapper = createTypeMapper(mapperParams, mapperArgs);
649
+ const defaultValue = getResolvedTypeParameterDefault(param, decl, argumentMapper);
605
650
  if (defaultValue) {
606
- values.push(defaultValue);
651
+ commit(param, defaultValue);
607
652
  }
608
653
  else {
609
- tooFew = true;
610
- values.push(
654
+ reportCheckerDiagnostic(createDiagnostic({
655
+ code: "invalid-template-args",
656
+ messageId: "missing",
657
+ format: {
658
+ name: decl.id.sv,
659
+ },
660
+ target: node,
661
+ }));
611
662
  // TODO-TIM check if we expose this below
612
- ((_b = declaredType.constraint) === null || _b === void 0 ? void 0 : _b.kind) === "Value"
613
- ? unknownType
614
- : (_c = declaredType.constraint) !== null && _c !== void 0 ? _c : unknownType);
663
+ commit(param, ((_b = param.constraint) === null || _b === void 0 ? void 0 : _b.kind) === "Value" ? unknownType : (_c = param.constraint) !== null && _c !== void 0 ? _c : unknownType);
615
664
  }
665
+ continue;
616
666
  }
667
+ const [argNode, type] = init();
668
+ if (param.constraint) {
669
+ if (!checkTypeAssignable(type, param.constraint, argNode)) {
670
+ // TODO-TIM check if we expose this below
671
+ const effectiveType = ((_d = param.constraint) === null || _d === void 0 ? void 0 : _d.kind) === "Value" ? unknownType : param.constraint;
672
+ commit(param, effectiveType);
673
+ continue;
674
+ }
675
+ }
676
+ commit(param, type);
617
677
  }
618
- if (tooFew) {
619
- reportCheckerDiagnostic(createDiagnostic({
620
- code: "invalid-template-args",
621
- messageId: "tooFew",
622
- target: node,
623
- }));
624
- }
625
- return [params, values];
678
+ return finalMap;
626
679
  }
627
680
  /**
628
681
  * Check and resolve the type for the given symbol + node.
@@ -641,9 +694,9 @@ export function createChecker(program) {
641
694
  reportCheckerDiagnostic(createDiagnostic({ code: "invalid-type-ref", messageId: "function", target: sym }));
642
695
  return errorType;
643
696
  }
697
+ const argumentNodes = node.kind === SyntaxKind.TypeReference ? node.arguments : [];
644
698
  const symbolLinks = getSymbolLinks(sym);
645
699
  let baseType;
646
- const args = checkTypeReferenceArgs(node, mapper);
647
700
  if (sym.flags &
648
701
  (2 /* SymbolFlags.Model */ |
649
702
  8 /* SymbolFlags.Scalar */ |
@@ -653,7 +706,7 @@ export function createChecker(program) {
653
706
  512 /* SymbolFlags.Union */)) {
654
707
  const decl = sym.declarations[0];
655
708
  if (!isTemplatedNode(decl)) {
656
- if (args.length > 0) {
709
+ if (argumentNodes.length > 0) {
657
710
  reportCheckerDiagnostic(createDiagnostic({
658
711
  code: "invalid-template-args",
659
712
  messageId: "notTemplate",
@@ -677,13 +730,13 @@ export function createChecker(program) {
677
730
  else {
678
731
  const declaredType = getOrCheckDeclaredType(sym, decl, mapper);
679
732
  const templateParameters = decl.templateParameters;
680
- const [params, instantiationArgs] = checkTemplateInstantiationArgs(node, args, templateParameters);
681
- baseType = getOrInstantiateTemplate(decl, params, instantiationArgs, declaredType.templateMapper, instantiateTemplates);
733
+ const instantiation = checkTemplateInstantiationArgs(node, argumentNodes, templateParameters, mapper);
734
+ baseType = getOrInstantiateTemplate(decl, [...instantiation.keys()], [...instantiation.values()], declaredType.templateMapper, instantiateTemplates);
682
735
  }
683
736
  }
684
737
  else {
685
738
  // some other kind of reference
686
- if (args.length > 0) {
739
+ if (argumentNodes.length > 0) {
687
740
  reportCheckerDiagnostic(createDiagnostic({
688
741
  code: "invalid-template-args",
689
742
  messageId: "notTemplate",
@@ -1356,16 +1409,30 @@ export function createChecker(program) {
1356
1409
  }
1357
1410
  sym = resolveTypeReferenceSym(ref, mapper, resolveDecorator);
1358
1411
  break;
1412
+ case IdentifierKind.TemplateArgument:
1413
+ const templates = getTemplateDeclarationsForArgument(node, mapper);
1414
+ const firstMatchingParameter = templates
1415
+ .flatMap((t) => t.templateParameters)
1416
+ .find((p) => p.id.sv === id.sv);
1417
+ if (firstMatchingParameter) {
1418
+ sym = getMergedSymbol(firstMatchingParameter.symbol);
1419
+ }
1420
+ break;
1359
1421
  default:
1360
1422
  const _assertNever = kind;
1361
1423
  compilerAssert(false, "Unreachable");
1362
1424
  }
1363
1425
  return (_c = sym === null || sym === void 0 ? void 0 : sym.symbolSource) !== null && _c !== void 0 ? _c : sym;
1364
1426
  }
1427
+ function getTemplateDeclarationsForArgument(node, mapper) {
1428
+ var _a;
1429
+ const resolved = resolveTypeReferenceSym(node.parent, mapper, false);
1430
+ return ((_a = resolved === null || resolved === void 0 ? void 0 : resolved.declarations.filter((n) => isTemplatedNode(n))) !== null && _a !== void 0 ? _a : []);
1431
+ }
1365
1432
  function resolveCompletions(identifier) {
1366
- var _a, _b;
1433
+ var _a, _b, _c;
1367
1434
  const completions = new Map();
1368
- const { kind } = getIdentifierContext(identifier);
1435
+ const { kind, node: ancestor } = getIdentifierContext(identifier);
1369
1436
  switch (kind) {
1370
1437
  case IdentifierKind.Using:
1371
1438
  case IdentifierKind.Decorator:
@@ -1376,6 +1443,15 @@ export function createChecker(program) {
1376
1443
  return completions; // not implemented
1377
1444
  case IdentifierKind.Declaration:
1378
1445
  return completions; // cannot complete, name can be chosen arbitrarily
1446
+ case IdentifierKind.TemplateArgument: {
1447
+ const templates = getTemplateDeclarationsForArgument(ancestor, undefined);
1448
+ for (const template of templates) {
1449
+ for (const param of template.templateParameters) {
1450
+ addCompletion(param.id.sv, param.symbol);
1451
+ }
1452
+ }
1453
+ return completions;
1454
+ }
1379
1455
  default:
1380
1456
  const _assertNever = kind;
1381
1457
  compilerAssert(false, "Unreachable");
@@ -1399,6 +1475,19 @@ export function createChecker(program) {
1399
1475
  }
1400
1476
  }
1401
1477
  else {
1478
+ // We will only add template arguments if the template isn't already named
1479
+ // to avoid completing the name of the argument again.
1480
+ if (kind === IdentifierKind.TypeReference &&
1481
+ exprIsBareIdentifier(ancestor) &&
1482
+ ((_c = ancestor.parent) === null || _c === void 0 ? void 0 : _c.kind) === SyntaxKind.TemplateArgument &&
1483
+ ancestor.parent.name === undefined) {
1484
+ const templates = getTemplateDeclarationsForArgument(ancestor.parent, undefined);
1485
+ for (const template of templates) {
1486
+ for (const param of template.templateParameters) {
1487
+ addCompletion(param.id.sv, param.symbol, { suffix: " = " });
1488
+ }
1489
+ }
1490
+ }
1402
1491
  let scope = identifier.parent;
1403
1492
  while (scope && scope.kind !== SyntaxKind.TypeSpecScript) {
1404
1493
  if (scope.symbol && scope.symbol.exports) {
@@ -1444,7 +1533,7 @@ export function createChecker(program) {
1444
1533
  }
1445
1534
  }
1446
1535
  }
1447
- function addCompletion(key, sym) {
1536
+ function addCompletion(key, sym, options = {}) {
1448
1537
  if (sym.symbolSource) {
1449
1538
  sym = sym.symbolSource;
1450
1539
  }
@@ -1455,7 +1544,7 @@ export function createChecker(program) {
1455
1544
  key = key.slice(1);
1456
1545
  }
1457
1546
  if (!completions.has(key)) {
1458
- completions.set(key, { sym });
1547
+ completions.set(key, { ...options, sym });
1459
1548
  }
1460
1549
  }
1461
1550
  function shouldAddCompletion(sym) {
@@ -1469,6 +1558,8 @@ export function createChecker(program) {
1469
1558
  case IdentifierKind.TypeReference:
1470
1559
  // Do not return functions or decorators when completing types
1471
1560
  return !(sym.flags & (131072 /* SymbolFlags.Function */ | 16384 /* SymbolFlags.Decorator */));
1561
+ case IdentifierKind.TemplateArgument:
1562
+ return !!(sym.flags & 32768 /* SymbolFlags.TemplateParameter */);
1472
1563
  default:
1473
1564
  compilerAssert(false, "We should have bailed up-front on other kinds.");
1474
1565
  }
@@ -2086,7 +2177,6 @@ export function createChecker(program) {
2086
2177
  switch (node.value.kind) {
2087
2178
  case SyntaxKind.MemberExpression:
2088
2179
  case SyntaxKind.TypeReference:
2089
- case SyntaxKind.Identifier:
2090
2180
  const resolvedSym = resolveTypeReferenceSym(node.value, undefined);
2091
2181
  if (resolvedSym && resolvedSym.flags & 2048 /* SymbolFlags.Alias */) {
2092
2182
  return resolveAliasedSymbol(resolvedSym);