From a67b375d0efb3ecc0abaabc2f8a2f168a680e99e Mon Sep 17 00:00:00 2001 From: Sheetal Nandi Date: Thu, 6 Jun 2019 12:51:26 -0700 Subject: [PATCH] Handle module specifiers --- src/services/findAllReferences.ts | 33 +++++++++++++------ src/testRunner/unittests/tsserver/rename.ts | 9 +++-- .../findAllReferencesDynamicImport1.ts | 6 ++-- ...findAllReferencesUmdModuleAsGlobalConst.ts | 6 ++-- .../fourslash/findAllRefsExportEquals.ts | 2 +- tests/cases/fourslash/findAllRefsForModule.ts | 10 +++--- .../fourslash/findAllRefsForModuleGlobal.ts | 4 +-- .../findAllRefsImportEqualsJsonFile.ts | 4 +-- .../fourslash/findAllRefsModuleDotExports.ts | 6 ++-- .../findAllRefs_importType_exportEquals.ts | 6 ++-- .../fourslash/findAllRefs_importType_js.ts | 6 ++-- .../findAllRefs_importType_typeofImport.ts | 6 ++-- .../cases/fourslash/referencesForAmbients.ts | 6 ++-- .../referencesForExternalModuleNames.ts | 2 +- tests/cases/fourslash/untypedModuleImport.ts | 2 +- 15 files changed, 62 insertions(+), 46 deletions(-) diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index a23c5575ce7..b8971d74a41 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -51,16 +51,6 @@ namespace ts.FindAllReferences { if (!node.parent) return undefined; if (!isDeclaration(node.parent) && !isExportAssignment(node.parent)) { - // Jsx Tags - if (isJsxOpeningElement(node.parent) || isJsxClosingElement(node.parent)) { - return node.parent.parent; - } - else if (isJsxSelfClosingElement(node.parent) || - isLabeledStatement(node.parent) || - isBreakOrContinueStatement(node.parent)) { - return node.parent; - } - // Special property assignment in javascript if (isInJSFile(node)) { const binaryExpression = isBinaryExpression(node.parent) ? @@ -75,6 +65,29 @@ namespace ts.FindAllReferences { } } + // Jsx Tags + if (isJsxOpeningElement(node.parent) || isJsxClosingElement(node.parent)) { + return node.parent.parent; + } + else if (isJsxSelfClosingElement(node.parent) || + isLabeledStatement(node.parent) || + isBreakOrContinueStatement(node.parent)) { + return node.parent; + } + else if (isStringLiteralLike(node)) { + const validImport = tryGetImportFromModuleSpecifier(node); + if (validImport) { + const declOrStatement = findAncestor(validImport, node => + isDeclaration(node) || + isStatement(node) || + isJSDocTag(node) + )! as NamedDeclaration | Statement | JSDocTag; + return isDeclaration(declOrStatement) ? + getDeclarationForDeclarationSpan(declOrStatement) : + declOrStatement; + } + } + // Handle computed property name const propertyName = findAncestor(node, isComputedPropertyName); return propertyName ? diff --git a/src/testRunner/unittests/tsserver/rename.ts b/src/testRunner/unittests/tsserver/rename.ts index 67464499a5b..6f5633875fa 100644 --- a/src/testRunner/unittests/tsserver/rename.ts +++ b/src/testRunner/unittests/tsserver/rename.ts @@ -19,7 +19,8 @@ namespace ts.projectSystem { locs: [ protocolRenameSpanFromSubstring({ fileText: bTs.content, - text: "./a" + text: "./a", + declarationText: bTs.content }) ] }], @@ -43,7 +44,8 @@ namespace ts.projectSystem { locs: [ protocolRenameSpanFromSubstring({ fileText: bTs.content, - text: "./a" + text: "./a", + declarationText: bTs.content }) ] }], @@ -68,7 +70,8 @@ namespace ts.projectSystem { locs: [ protocolRenameSpanFromSubstring({ fileText: bTs.content, - text: "./a" + text: "./a", + declarationText: bTs.content }) ] }], diff --git a/tests/cases/fourslash/findAllReferencesDynamicImport1.ts b/tests/cases/fourslash/findAllReferencesDynamicImport1.ts index c2b6f359ba6..070621ef94b 100644 --- a/tests/cases/fourslash/findAllReferencesDynamicImport1.ts +++ b/tests/cases/fourslash/findAllReferencesDynamicImport1.ts @@ -3,7 +3,7 @@ // @Filename: foo.ts //// export function foo() { return "foo"; } -//// import("[|./foo|]") -//// var x = import("[|./foo|]") +//// [|import("[|{| "declarationRangeIndex": 0 |}./foo|]")|] +//// [|var x = import("[|{| "declarationRangeIndex": 2 |}./foo|]")|] -verify.singleReferenceGroup('module "/tests/cases/fourslash/foo"'); +verify.singleReferenceGroup('module "/tests/cases/fourslash/foo"', "./foo"); diff --git a/tests/cases/fourslash/findAllReferencesUmdModuleAsGlobalConst.ts b/tests/cases/fourslash/findAllReferencesUmdModuleAsGlobalConst.ts index 4876b1e0229..23435fa5cad 100644 --- a/tests/cases/fourslash/findAllReferencesUmdModuleAsGlobalConst.ts +++ b/tests/cases/fourslash/findAllReferencesUmdModuleAsGlobalConst.ts @@ -12,9 +12,9 @@ ////[|export as namespace [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 0 |}THREE|];|] // @Filename: /typings/global.d.ts -////import * as _THREE from '[|three|]'; +////[|import * as _THREE from '[|{| "declarationRangeIndex": 2 |}three|]';|] ////declare global { -//// [|const [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 3 |}THREE|]: typeof _THREE;|] +//// [|const [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 4 |}THREE|]: typeof _THREE;|] ////} // @Filename: /src/index.ts @@ -38,7 +38,7 @@ //// "files": ["/src/index.ts", "typings/global.d.ts"] ////} -const [r0Def, r0, r1, r2Def, ...rest] = test.ranges(); +const [r0Def, r0, r1Def, r1, r2Def, ...rest] = test.ranges(); // GH#29533 // TODO:: this should be var THREE: typeof import instead of module name as var but thats existing issue and repros with quickInfo too. verify.singleReferenceGroup(`module "/node_modules/@types/three/index" diff --git a/tests/cases/fourslash/findAllRefsExportEquals.ts b/tests/cases/fourslash/findAllRefsExportEquals.ts index fd17a82633c..d7d80564e5b 100644 --- a/tests/cases/fourslash/findAllRefsExportEquals.ts +++ b/tests/cases/fourslash/findAllRefsExportEquals.ts @@ -5,7 +5,7 @@ ////[|[|{| "declarationRangeIndex": 2 |}export|] = [|{| "declarationRangeIndex": 2 |}T|];|] // @Filename: /b.ts -////[|import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 5 |}T|] = require("[|./a|]");|] +////[|import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 5 |}T|] = require("[|{| "declarationRangeIndex": 5 |}./a|]");|] const [r0Def, r0, r12Def, r1, r2, r3Def, r3, r4] = test.ranges(); const mod = { definition: 'module "/a"', ranges: [r4, r1] }; diff --git a/tests/cases/fourslash/findAllRefsForModule.ts b/tests/cases/fourslash/findAllRefsForModule.ts index a9a44d6ffaa..0449c6a4408 100644 --- a/tests/cases/fourslash/findAllRefsForModule.ts +++ b/tests/cases/fourslash/findAllRefsForModule.ts @@ -6,16 +6,16 @@ ////export const x = 0; // @Filename: /b.ts -////import { x } from "[|./a|]"; +////[|import { x } from "[|{| "declarationRangeIndex": 0 |}./a|]";|] // @Filename: /c/sub.js -////const a = require("[|../a|]"); +////[|const a = require("[|{| "declarationRangeIndex": 2 |}../a|]");|] // @Filename: /d.ts //// /// -const ranges = test.ranges(); -const [r0, r1, r2] = ranges; +const [r0Def, r0, r1Def, r1, r2] = test.ranges(); +const ranges = [r0, r1, r2]; verify.referenceGroups(ranges, [{ definition: 'module "/a"', ranges: [r0, r1, r2] }]); // Testing that it works with documentHighlights too -verify.rangesAreDocumentHighlights(); +verify.rangesAreDocumentHighlights(ranges); diff --git a/tests/cases/fourslash/findAllRefsForModuleGlobal.ts b/tests/cases/fourslash/findAllRefsForModuleGlobal.ts index 4c7aa3939c1..bdb0d62a5cb 100644 --- a/tests/cases/fourslash/findAllRefsForModuleGlobal.ts +++ b/tests/cases/fourslash/findAllRefsForModuleGlobal.ts @@ -5,8 +5,8 @@ // @Filename: /b.ts /////// -////import { x } from "[|foo|]"; -////[|declare module "[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 2 |}foo|]" {}|] +////[|import { x } from "[|{| "declarationRangeIndex": 1 |}foo|]";|] +////[|declare module "[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 3 |}foo|]" {}|] verify.noErrors(); verify.singleReferenceGroup('module "/node_modules/foo/index"', "foo"); diff --git a/tests/cases/fourslash/findAllRefsImportEqualsJsonFile.ts b/tests/cases/fourslash/findAllRefsImportEqualsJsonFile.ts index 7b6e0e5bbc0..97147e4a1f6 100644 --- a/tests/cases/fourslash/findAllRefsImportEqualsJsonFile.ts +++ b/tests/cases/fourslash/findAllRefsImportEqualsJsonFile.ts @@ -5,11 +5,11 @@ // @resolveJsonModule: true // @Filename: /a.ts -////[|import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 0 |}j|] = require("[|./j.json|]");|] +////[|import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 0 |}j|] = require("[|{| "declarationRangeIndex": 0 |}./j.json|]");|] ////[|j|]; // @Filename: /b.js -////[|const [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 4 |}j|] = require("[|./j.json|]");|] +////[|const [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 4 |}j|] = require("[|{| "declarationRangeIndex": 4 |}./j.json|]");|] ////[|j|]; // @Filename: /j.json diff --git a/tests/cases/fourslash/findAllRefsModuleDotExports.ts b/tests/cases/fourslash/findAllRefsModuleDotExports.ts index ca30b341b90..165944ba356 100644 --- a/tests/cases/fourslash/findAllRefsModuleDotExports.ts +++ b/tests/cases/fourslash/findAllRefsModuleDotExports.ts @@ -3,10 +3,10 @@ // @allowJs: true // @Filename: /a.js -////const b = require("[|./b|]"); +////[|const b = require("[|{| "declarationRangeIndex": 0 |}./b|]");|] // @Filename: /b.js -////[|[|{| "declarationRangeIndex": 1 |}module|].exports = 0;|] +////[|[|{| "declarationRangeIndex": 2 |}module|].exports = 0;|] -const [r0, rDef, r1] = test.ranges(); +const [r0Def, r0, rDef, r1] = test.ranges(); verify.singleReferenceGroup('module "/b"', [r0, r1]); diff --git a/tests/cases/fourslash/findAllRefs_importType_exportEquals.ts b/tests/cases/fourslash/findAllRefs_importType_exportEquals.ts index 4597c3a8bc9..e2c86d60c9c 100644 --- a/tests/cases/fourslash/findAllRefs_importType_exportEquals.ts +++ b/tests/cases/fourslash/findAllRefs_importType_exportEquals.ts @@ -8,12 +8,12 @@ ////[|[|{| "declarationRangeIndex": 4 |}export|] = [|{| "declarationRangeIndex": 4 |}T|];|] // @Filename: /b.ts -////const x: import("[|./[|a|]|]") = 0; -////const y: import("[|./[|a|]|]").U = ""; +////[|const x: import("[|{| "declarationRangeIndex": 7 |}./[|a|]|]") = 0;|] +////[|const y: import("[|{| "declarationRangeIndex": 10 |}./[|a|]|]").U = "";|] verify.noErrors(); -const [r0Def, r0, r1Def, r1, r2Def, rExport, r2, r3, r3b, r4, r4b] = test.ranges(); +const [r0Def, r0, r1Def, r1, r2Def, rExport, r2, r3Def, r3, r3b, r4Def, r4, r4b] = test.ranges(); verify.referenceGroups(r0, [{ definition: "type T = number\nnamespace T", ranges: [r0, r2, r3] }]); verify.referenceGroups(r1, [{ definition: "namespace T", ranges: [r1, r2] }]); const t: FourSlashInterface.ReferenceGroup = { definition: "type T = number\nnamespace T", ranges: [r0, r1, r2, r3] }; diff --git a/tests/cases/fourslash/findAllRefs_importType_js.ts b/tests/cases/fourslash/findAllRefs_importType_js.ts index 79f99da90a4..51d99aaae7a 100644 --- a/tests/cases/fourslash/findAllRefs_importType_js.ts +++ b/tests/cases/fourslash/findAllRefs_importType_js.ts @@ -8,16 +8,16 @@ ////[|module.exports.[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 4 |}D|] = [|class [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 6 |}D|] {}|];|] // @Filename: /b.js -/////** @type {import("[|./a|]")} */ +/////** [|@type {import("[|{| "declarationRangeIndex": 8 |}./a|]")}|] */ ////const x = 0; -/////** @type {import("[|./a|]").[|D|]} */ +/////** [|@type {import("[|{| "declarationRangeIndex": 10 |}./a|]").[|D|]}|] */ ////const y = 0; verify.noErrors(); // TODO: GH#24025 -const [rModuleDef, rModule, r0Def, r0, r1Def, r1, r2Def, r2, r3, r4, r5] = test.ranges(); +const [rModuleDef, rModule, r0Def, r0, r1Def, r1, r2Def, r2, r3Def, r3, r4Def, r4, r5] = test.ranges(); verify.referenceGroups(rModule, [{ definition: 'module "/a"', ranges: [r3, r4, rModule] }]); verify.referenceGroups(r0, [ { definition: "(local class) C", ranges: [r0] }, diff --git a/tests/cases/fourslash/findAllRefs_importType_typeofImport.ts b/tests/cases/fourslash/findAllRefs_importType_typeofImport.ts index beab9c7cfc4..082b34b6792 100644 --- a/tests/cases/fourslash/findAllRefs_importType_typeofImport.ts +++ b/tests/cases/fourslash/findAllRefs_importType_typeofImport.ts @@ -4,7 +4,7 @@ ////export const x = 0; // @Filename: /b.ts -////const x: typeof import("[|./a|]") = { x: 0 }; -////const y: typeof import("[|./a|]") = { x: 0 }; +////[|const x: typeof import("[|{| "declarationRangeIndex": 0 |}./a|]") = { x: 0 };|] +////[|const y: typeof import("[|{| "declarationRangeIndex": 2 |}./a|]") = { x: 0 };|] -verify.singleReferenceGroup('module "/a"'); +verify.singleReferenceGroup('module "/a"', "./a"); diff --git a/tests/cases/fourslash/referencesForAmbients.ts b/tests/cases/fourslash/referencesForAmbients.ts index 77ff23cab98..4631a659b00 100644 --- a/tests/cases/fourslash/referencesForAmbients.ts +++ b/tests/cases/fourslash/referencesForAmbients.ts @@ -5,16 +5,16 @@ ////}|] //// ////[|declare module "[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 4 |}bar|]" { -//// [|export import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 6 |}foo|] = require("[|foo|]");|] +//// [|export import [|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 6 |}foo|] = require("[|{| "declarationRangeIndex": 6 |}foo|]");|] //// var f2: typeof [|foo|].[|f|]; ////}|] //// ////declare module "baz" { -//// import bar = require("[|bar|]"); +//// [|import bar = require("[|{| "declarationRangeIndex": 11 |}bar|]");|] //// var f2: typeof bar.[|foo|]; ////} -const [moduleFoo0Def, moduleFoo0, f0Def, f0, moduleBar0Def, moduleBar0, foo0Def, foo0, moduleFoo1, foo1, f1, moduleBar1, foo2] = test.ranges(); +const [moduleFoo0Def, moduleFoo0, f0Def, f0, moduleBar0Def, moduleBar0, foo0Def, foo0, moduleFoo1, foo1, f1, moduleBar1Def, moduleBar1, foo2] = test.ranges(); verify.singleReferenceGroup('module "foo"', [moduleFoo0, moduleFoo1]); verify.singleReferenceGroup('module "bar"', [moduleBar0, moduleBar1]); verify.singleReferenceGroup('(alias) module "foo"\nimport foo = require("foo")', [foo0, foo1, foo2]); diff --git a/tests/cases/fourslash/referencesForExternalModuleNames.ts b/tests/cases/fourslash/referencesForExternalModuleNames.ts index 6fafec9f690..66fa11d45c3 100644 --- a/tests/cases/fourslash/referencesForExternalModuleNames.ts +++ b/tests/cases/fourslash/referencesForExternalModuleNames.ts @@ -6,6 +6,6 @@ ////}|] // @Filename: referencesForGlobals_2.ts -////import f = require("[|foo|]"); +////[|import f = require("[|{| "declarationRangeIndex": 2 |}foo|]");|] verify.singleReferenceGroup('module "foo"', "foo"); diff --git a/tests/cases/fourslash/untypedModuleImport.ts b/tests/cases/fourslash/untypedModuleImport.ts index 783e020e3fc..72452fac0ae 100644 --- a/tests/cases/fourslash/untypedModuleImport.ts +++ b/tests/cases/fourslash/untypedModuleImport.ts @@ -4,7 +4,7 @@ ////{} // @Filename: a.ts -////[|import /*foo*/[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 0 |}foo|] from /*fooModule*/"[|{| "isInString": true |}foo|]";|] +////[|import /*foo*/[|{| "isWriteAccess": true, "isDefinition": true, "declarationRangeIndex": 0 |}foo|] from /*fooModule*/"[|{| "isInString": true, "declarationRangeIndex": 0 |}foo|]";|] ////[|foo|](); goTo.file("a.ts");