From 74f03130c17c9261a0edbd452adc56589d1ace3c Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 10 Apr 2023 09:26:39 -0700 Subject: [PATCH 1/3] Fix: Missing index wrong location --- packages/compiler/core/checker.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/compiler/core/checker.ts b/packages/compiler/core/checker.ts index c5ce4176cf0..78ada106810 100644 --- a/packages/compiler/core/checker.ts +++ b/packages/compiler/core/checker.ts @@ -4819,7 +4819,7 @@ export function createChecker(program: Program): Checker { indexType: getTypeName(target.indexer.key), sourceType: getTypeName(source), }, - target, + target: diagnosticTarget, }), ], ]; From 99b61714a6eeaf13e92fae09009e34d903cb5ede Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 10 Apr 2023 09:27:25 -0700 Subject: [PATCH 2/3] changelog --- ...x-missing-index-diag-location_2023-04-10-16-27.json | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 common/changes/@typespec/compiler/fix-missing-index-diag-location_2023-04-10-16-27.json diff --git a/common/changes/@typespec/compiler/fix-missing-index-diag-location_2023-04-10-16-27.json b/common/changes/@typespec/compiler/fix-missing-index-diag-location_2023-04-10-16-27.json new file mode 100644 index 00000000000..ace13fce21e --- /dev/null +++ b/common/changes/@typespec/compiler/fix-missing-index-diag-location_2023-04-10-16-27.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@typespec/compiler", + "comment": "Fix: `missing-index` diagnostic showing at the wrong location", + "type": "none" + } + ], + "packageName": "@typespec/compiler" +} \ No newline at end of file From db8ba7343bf769d29b172b300392e8eff9cd2218 Mon Sep 17 00:00:00 2001 From: Timothee Guerin Date: Mon, 10 Apr 2023 09:37:44 -0700 Subject: [PATCH 3/3] Add tests for location --- .../compiler/test/checker/relation.test.ts | 35 ++++++++++++------- 1 file changed, 22 insertions(+), 13 deletions(-) diff --git a/packages/compiler/test/checker/relation.test.ts b/packages/compiler/test/checker/relation.test.ts index fce35d881b9..478a0427d49 100644 --- a/packages/compiler/test/checker/relation.test.ts +++ b/packages/compiler/test/checker/relation.test.ts @@ -1,5 +1,5 @@ import { deepStrictEqual, ok, strictEqual } from "assert"; -import { Model } from "../../core/index.js"; +import { Diagnostic, Model, ModelPropertyNode } from "../../core/index.js"; import { BasicTestRunner, createTestHost, @@ -7,6 +7,7 @@ import { DiagnosticMatch, expectDiagnosticEmpty, expectDiagnostics, + extractCursor, } from "../../testing/index.js"; interface RelatedTypeOptions { @@ -21,32 +22,40 @@ describe("compiler: checker: type relations", () => { runner = createTestWrapper(await createTestHost()); }); - async function checkTypeAssignable({ source, target, commonCode }: RelatedTypeOptions) { - const { Test } = (await runner.compile(` + async function checkTypeAssignable({ source, target, commonCode }: RelatedTypeOptions): Promise<{ + related: boolean; + diagnostics: readonly Diagnostic[]; + expectedDiagnosticPos: number; + }> { + const { source: code, pos } = extractCursor(` ${commonCode ?? ""} @test model Test { - source: ${source}; + source: ┆${source}; target: ${target}; - }`)) as { Test: Model }; + }`); + const { Test } = (await runner.compile(code)) as { Test: Model }; const sourceProp = Test.properties.get("source")!.type; const targetProp = Test.properties.get("target")!.type; - return runner.program.checker.isTypeAssignableTo(sourceProp, targetProp, targetProp); + + const [related, diagnostics] = runner.program.checker.isTypeAssignableTo( + sourceProp, + targetProp, + (Test.properties.get("source")!.node! as ModelPropertyNode).value + ); + return { related, diagnostics, expectedDiagnosticPos: pos }; } async function expectTypeAssignable(options: RelatedTypeOptions) { - const [related, diagnostics] = await checkTypeAssignable(options); + const { related, diagnostics } = await checkTypeAssignable(options); expectDiagnosticEmpty(diagnostics); ok(related, `Type ${options.source} should be assignable to ${options.target}`); } - async function expectTypeNotAssignable( - options: RelatedTypeOptions, - match: DiagnosticMatch | DiagnosticMatch[] - ) { - const [related, diagnostics] = await checkTypeAssignable(options); + async function expectTypeNotAssignable(options: RelatedTypeOptions, match: DiagnosticMatch) { + const { related, diagnostics, expectedDiagnosticPos } = await checkTypeAssignable(options); ok(!related, `Type ${options.source} should NOT be assignable to ${options.target}`); - expectDiagnostics(diagnostics, match); + expectDiagnostics(diagnostics, { ...match, pos: expectedDiagnosticPos }); } describe("model with indexer", () => {