@typespec/compiler 1.13.0-dev.7 → 1.13.0-dev.9
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 +2 -2
- package/dist/src/core/checker.d.ts.map +1 -1
- package/dist/src/core/checker.js +58 -0
- package/dist/src/core/checker.js.map +1 -1
- package/dist/src/core/messages.d.ts +22 -2
- package/dist/src/core/messages.d.ts.map +1 -1
- package/dist/src/core/messages.js +8 -0
- package/dist/src/core/messages.js.map +1 -1
- package/package.json +1 -1
package/dist/manifest.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/checker.ts"],"names":[],"mappings":"AA8BA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAQvC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAY5C,OAAO,EAML,cAAc,EACd,kBAAkB,EAqClB,mBAAmB,
|
|
1
|
+
{"version":3,"file":"checker.d.ts","sourceRoot":"","sources":["../../../src/core/checker.ts"],"names":[],"mappings":"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"}
|
package/dist/src/core/checker.js
CHANGED
|
@@ -154,6 +154,7 @@ export function createChecker(program, resolver) {
|
|
|
154
154
|
* Key is the SymId of a node. It can be retrieved with getNodeSymId(node)
|
|
155
155
|
*/
|
|
156
156
|
const pendingResolutions = new PendingResolutions();
|
|
157
|
+
const spreadResolutionAncestors = new Map();
|
|
157
158
|
const postCheckValidators = [];
|
|
158
159
|
const typespecNamespaceBinding = resolver.symbols.global.exports.get("TypeSpec");
|
|
159
160
|
if (typespecNamespaceBinding) {
|
|
@@ -3518,6 +3519,7 @@ export function createChecker(program, resolver) {
|
|
|
3518
3519
|
for (const file of program.sourceFiles.values()) {
|
|
3519
3520
|
checkSourceFile(file);
|
|
3520
3521
|
}
|
|
3522
|
+
checkOrphanedFunctionImplementations();
|
|
3521
3523
|
internalDecoratorValidation();
|
|
3522
3524
|
assertNoPendingResolutions();
|
|
3523
3525
|
runPostValidators(postCheckValidators);
|
|
@@ -3544,6 +3546,36 @@ export function createChecker(program, resolver) {
|
|
|
3544
3546
|
}
|
|
3545
3547
|
}
|
|
3546
3548
|
}
|
|
3549
|
+
/**
|
|
3550
|
+
* Check that all function implementations exported via $functions have a corresponding
|
|
3551
|
+
* `extern fn` declaration in TypeSpec. Reports an error for each orphaned implementation.
|
|
3552
|
+
*/
|
|
3553
|
+
function checkOrphanedFunctionImplementations() {
|
|
3554
|
+
for (const file of program.jsSourceFiles.values()) {
|
|
3555
|
+
checkSymbolTableForOrphanedFunctions(file.symbol.exports, file);
|
|
3556
|
+
}
|
|
3557
|
+
}
|
|
3558
|
+
function checkSymbolTableForOrphanedFunctions(exports, sourceFile) {
|
|
3559
|
+
if (!exports)
|
|
3560
|
+
return;
|
|
3561
|
+
for (const sym of exports.values()) {
|
|
3562
|
+
if (sym.flags & 2048 /* SymbolFlags.Function */ && sym.flags & 2097152 /* SymbolFlags.Implementation */) {
|
|
3563
|
+
const merged = getMergedSymbol(sym);
|
|
3564
|
+
const hasFunctionDeclaration = merged.declarations.some((d) => d.kind === SyntaxKind.FunctionDeclarationStatement);
|
|
3565
|
+
if (!hasFunctionDeclaration) {
|
|
3566
|
+
reportCheckerDiagnostic(createDiagnostic({
|
|
3567
|
+
code: "missing-extern-declaration",
|
|
3568
|
+
format: { name: sym.name },
|
|
3569
|
+
target: sourceFile,
|
|
3570
|
+
}));
|
|
3571
|
+
}
|
|
3572
|
+
}
|
|
3573
|
+
// Recurse into namespace symbols
|
|
3574
|
+
if (sym.flags & 256 /* SymbolFlags.Namespace */ && sym.exports) {
|
|
3575
|
+
checkSymbolTableForOrphanedFunctions(sym.exports, sourceFile);
|
|
3576
|
+
}
|
|
3577
|
+
}
|
|
3578
|
+
}
|
|
3547
3579
|
/** Report error with duplicate using in the same scope. */
|
|
3548
3580
|
function checkDuplicateUsings(file) {
|
|
3549
3581
|
const duplicateTrackers = new Map();
|
|
@@ -4799,6 +4831,29 @@ export function createChecker(program, resolver) {
|
|
|
4799
4831
|
}
|
|
4800
4832
|
return undefined;
|
|
4801
4833
|
}
|
|
4834
|
+
// Ancestors are models that already depend on this model via spread.
|
|
4835
|
+
const modelAncestors = spreadResolutionAncestors.get(modelSymId);
|
|
4836
|
+
if (targetSym && modelAncestors?.has(targetSym)) {
|
|
4837
|
+
if (ctx.mapper === undefined) {
|
|
4838
|
+
reportCheckerDiagnostic(createDiagnostic({
|
|
4839
|
+
code: "spread-model",
|
|
4840
|
+
messageId: "selfSpread",
|
|
4841
|
+
target: target,
|
|
4842
|
+
}));
|
|
4843
|
+
}
|
|
4844
|
+
return undefined;
|
|
4845
|
+
}
|
|
4846
|
+
if (targetSym) {
|
|
4847
|
+
let targetAncestors = spreadResolutionAncestors.get(targetSym);
|
|
4848
|
+
if (!targetAncestors) {
|
|
4849
|
+
targetAncestors = new Set();
|
|
4850
|
+
spreadResolutionAncestors.set(targetSym, targetAncestors);
|
|
4851
|
+
}
|
|
4852
|
+
targetAncestors.add(modelSymId);
|
|
4853
|
+
for (const ancestor of modelAncestors ?? []) {
|
|
4854
|
+
targetAncestors.add(ancestor);
|
|
4855
|
+
}
|
|
4856
|
+
}
|
|
4802
4857
|
const type = getTypeForNode(target, ctx);
|
|
4803
4858
|
return type;
|
|
4804
4859
|
}
|
|
@@ -5445,6 +5500,9 @@ export function createChecker(program, resolver) {
|
|
|
5445
5500
|
return inProgressType;
|
|
5446
5501
|
}
|
|
5447
5502
|
}
|
|
5503
|
+
if (node.value.kind === SyntaxKind.ModelExpression) {
|
|
5504
|
+
return getTypeForNode(node.value, ctx);
|
|
5505
|
+
}
|
|
5448
5506
|
if (ctx.mapper === undefined) {
|
|
5449
5507
|
reportCheckerDiagnostic(createDiagnostic({
|
|
5450
5508
|
code: "circular-alias-type",
|