From e84a95f70700831e4a7aa6164cfcdb14ee1ec43a Mon Sep 17 00:00:00 2001 From: Andrew Branch Date: Fri, 18 Dec 2020 14:24:34 -0800 Subject: [PATCH] Fix find-all-refs crashing in some project references scenarios (#42025) * Add failing test * Fix test * Accept baseline --- src/harness/client.ts | 8 ++-- src/harness/fourslashImpl.ts | 4 +- src/server/session.ts | 2 +- ...ortProvider_referencesCrash.baseline.jsonc | 48 +++++++++++++++++++ .../autoImportProvider_referencesCrash.ts | 43 +++++++++++++++++ 5 files changed, 100 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/autoImportProvider_referencesCrash.baseline.jsonc create mode 100644 tests/cases/fourslash/server/autoImportProvider_referencesCrash.ts diff --git a/src/harness/client.ts b/src/harness/client.ts index b6385203969..4bdb316b6b4 100644 --- a/src/harness/client.ts +++ b/src/harness/client.ts @@ -343,9 +343,11 @@ namespace ts.server { })); } - findReferences(_fileName: string, _position: number): ReferencedSymbol[] { - // Not yet implemented. - return []; + findReferences(fileName: string, position: number): ReferencedSymbol[] { + const args = this.createFileLocationRequestArgs(fileName, position); + const request = this.processRequest(CommandNames.ReferencesFull, args); + const response = this.processResponse(request); + return response.body; } getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { diff --git a/src/harness/fourslashImpl.ts b/src/harness/fourslashImpl.ts index 2e0c9c4dc63..4628269b0c6 100644 --- a/src/harness/fourslashImpl.ts +++ b/src/harness/fourslashImpl.ts @@ -1117,7 +1117,9 @@ namespace FourSlash { } public verifyBaselineFindAllReferences(...markerNames: string[]) { + ts.Debug.assert(markerNames.length > 0, "Must pass at least one marker name to `baselineFindAllReferences()`"); const baseline = markerNames.map(markerName => { + this.goToMarker(markerName); const marker = this.getMarkerByName(markerName); const references = this.languageService.findReferences(marker.fileName, marker.position); const refsByFile = references @@ -1200,7 +1202,7 @@ namespace FourSlash { } } - // Necessary to have this function since `findReferences` isn't implemented in `client.ts` + /** @deprecated - use `verify.baselineFindAllReferences()` instead. */ public verifyGetReferencesForServerTest(expected: readonly ts.ReferenceEntry[]): void { const refs = this.getReferencesAtCaret(); assert.deepEqual(refs, expected); diff --git a/src/server/session.ts b/src/server/session.ts index 518c297c91b..267b1c44ce3 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -568,7 +568,7 @@ namespace ts.server { } function addToTodo(project: Project, location: TLocation, toDo: Push>, seenProjects: Set): void { - if (addToSeen(seenProjects, project)) toDo.push({ project, location }); + if (!project.isOrphan() && addToSeen(seenProjects, project)) toDo.push({ project, location }); } function addToSeen(seenProjects: Set, project: Project) { diff --git a/tests/baselines/reference/autoImportProvider_referencesCrash.baseline.jsonc b/tests/baselines/reference/autoImportProvider_referencesCrash.baseline.jsonc new file mode 100644 index 00000000000..741362103f3 --- /dev/null +++ b/tests/baselines/reference/autoImportProvider_referencesCrash.baseline.jsonc @@ -0,0 +1,48 @@ +// === /b/b.ts === +// /// +// new [|A|]/*FIND ALL REFS*/(); + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/a/index.ts", + "kind": "class", + "name": "class A", + "textSpan": { + "start": 10, + "length": 1 + }, + "displayParts": [ + { + "text": "class", + "kind": "keyword" + }, + { + "text": " ", + "kind": "space" + }, + { + "text": "A", + "kind": "className" + } + ], + "contextSpan": { + "start": 0, + "length": 10 + } + }, + "references": [ + { + "textSpan": { + "start": 45, + "length": 1 + }, + "fileName": "/b/b.ts", + "isWriteAccess": false, + "isDefinition": false + } + ] + } +] \ No newline at end of file diff --git a/tests/cases/fourslash/server/autoImportProvider_referencesCrash.ts b/tests/cases/fourslash/server/autoImportProvider_referencesCrash.ts new file mode 100644 index 00000000000..bca5a0f0806 --- /dev/null +++ b/tests/cases/fourslash/server/autoImportProvider_referencesCrash.ts @@ -0,0 +1,43 @@ +/// + +// @Filename: /a/package.json +//// {} + +// @Filename: /a/tsconfig.json +//// {} + +// @Filename: /a/index.ts +//// class A {} + +// @Filename: /a/index.d.ts +//// declare class A { +//// } +//// //# sourceMappingURL=index.d.ts.map + +// @Filename: /a/index.d.ts.map +//// {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,CAAC;CAAG"} + +// @Filename: /b/tsconfig.json +//// { +//// "compilerOptions": { "disableSourceOfProjectReferenceRedirect": true }, +//// "references": [{ "path": "../a" }] +//// } + +// @Filename: /b/b.ts +//// /// +//// new A/**/(); + +// @Filename: /c/package.json +//// { "dependencies": { "a": "*" } } + +// @Filename: /c/tsconfig.json +//// { "references" [{ "path": "../a" }] } + +// @Filename: /c/index.ts +//// export {}; + +// @link: /a -> /c/node_modules/a + +// Test asserts lack of crash +goTo.file("/c/index.ts"); // Create AutoImportProviderProject that has /a/index.d.ts in it +verify.baselineFindAllReferences("");