From 5a6a499d0e3aa9d90f55cc0962f6ffcd2087f53b Mon Sep 17 00:00:00 2001 From: Armando Aguirre Date: Tue, 13 Apr 2021 15:06:34 -0700 Subject: [PATCH] Fix sending correct symbol when using commonjs require and destructuring (#43511) * Fix sending correct symbol when using commonjs require and destructuring * Check BindingElement --- src/services/findAllReferences.ts | 7 +- ...encesJsRequireDestructuring.baseline.jsonc | 89 +++++++++++++++++++ ...findAllReferencesJsRequireDestructuring.ts | 15 ++++ 3 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/findAllReferencesJsRequireDestructuring.baseline.jsonc create mode 100644 tests/cases/fourslash/findAllReferencesJsRequireDestructuring.ts diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 4f334b1cacd..5bb959b8c6d 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -1477,7 +1477,7 @@ namespace ts.FindAllReferences { if (!hasMatchingMeaning(referenceLocation, state)) return; - const referenceSymbol = state.checker.getSymbolAtLocation(referenceLocation); + let referenceSymbol = state.checker.getSymbolAtLocation(referenceLocation); if (!referenceSymbol) { return; } @@ -1514,6 +1514,11 @@ namespace ts.FindAllReferences { Debug.assertNever(state.specialSearchKind); } + // Use the parent symbol if the location is commonjs require syntax on javascript files only. + referenceSymbol = isInJSFile(referenceLocation) && referenceLocation.parent.kind === SyntaxKind.BindingElement && isRequireVariableDeclaration(referenceLocation.parent) + ? referenceLocation.parent.symbol + : referenceSymbol; + getImportOrExportReferences(referenceLocation, referenceSymbol, search, state); } diff --git a/tests/baselines/reference/findAllReferencesJsRequireDestructuring.baseline.jsonc b/tests/baselines/reference/findAllReferencesJsRequireDestructuring.baseline.jsonc new file mode 100644 index 00000000000..c4ff1980a4c --- /dev/null +++ b/tests/baselines/reference/findAllReferencesJsRequireDestructuring.baseline.jsonc @@ -0,0 +1,89 @@ +// === /tests/cases/fourslash/bar.js === +// const { /*FIND ALL REFS*/[|foo|]: bar } = require('./foo'); + +// === /tests/cases/fourslash/foo.js === +// module.exports = { +// [|foo|]: '1' +// }; + +[ + { + "definition": { + "containerKind": "", + "containerName": "", + "fileName": "/tests/cases/fourslash/foo.js", + "kind": "property", + "name": "(property) foo: string", + "textSpan": { + "start": 23, + "length": 3 + }, + "displayParts": [ + { + "text": "(", + "kind": "punctuation" + }, + { + "text": "property", + "kind": "text" + }, + { + "text": ")", + "kind": "punctuation" + }, + { + "text": " ", + "kind": "space" + }, + { + "text": "foo", + "kind": "propertyName" + }, + { + "text": ":", + "kind": "punctuation" + }, + { + "text": " ", + "kind": "space" + }, + { + "text": "string", + "kind": "keyword" + } + ], + "contextSpan": { + "start": 23, + "length": 8 + } + }, + "references": [ + { + "textSpan": { + "start": 23, + "length": 3 + }, + "fileName": "/tests/cases/fourslash/foo.js", + "contextSpan": { + "start": 23, + "length": 8 + }, + "isWriteAccess": true, + "isDefinition": true + }, + { + "textSpan": { + "start": 8, + "length": 3 + }, + "fileName": "/tests/cases/fourslash/bar.js", + "contextSpan": { + "start": 0, + "length": 38 + }, + "isWriteAccess": false, + "isDefinition": false + } + ] + } +] \ No newline at end of file diff --git a/tests/cases/fourslash/findAllReferencesJsRequireDestructuring.ts b/tests/cases/fourslash/findAllReferencesJsRequireDestructuring.ts new file mode 100644 index 00000000000..873e467a43e --- /dev/null +++ b/tests/cases/fourslash/findAllReferencesJsRequireDestructuring.ts @@ -0,0 +1,15 @@ +/// + +// @allowJs: true +// @noEmit: true +// @checkJs: true + +// @Filename: foo.js +//// module.exports = { +//// foo: '1' +//// }; + +// @Filename: bar.js +//// const { /*1*/foo: bar } = require('./foo'); + +verify.baselineFindAllReferences("1"); \ No newline at end of file