diff --git a/src/services/goToDefinition.ts b/src/services/goToDefinition.ts index 77ab36be2e3..110c90f05d0 100644 --- a/src/services/goToDefinition.ts +++ b/src/services/goToDefinition.ts @@ -207,6 +207,15 @@ namespace ts.GoToDefinition { return aliased; } } + if (symbol && isInJSFile(node)) { + const requireCall = forEach(symbol.declarations, d => isVariableDeclaration(d) && !!d.initializer && isRequireCall(d.initializer, /*checkArgumentIsStringLiteralLike*/ true) ? d.initializer : undefined); + if (requireCall) { + const moduleSymbol = checker.getSymbolAtLocation(requireCall.arguments[0]); + if (moduleSymbol) { + return checker.resolveExternalModuleSymbol(moduleSymbol); + } + } + } return symbol; } diff --git a/tests/cases/fourslash/goToDefinitionJsModuleNameAtImportName.ts b/tests/cases/fourslash/goToDefinitionJsModuleNameAtImportName.ts new file mode 100644 index 00000000000..d0b5e61c443 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionJsModuleNameAtImportName.ts @@ -0,0 +1,19 @@ +/// + +// @allowJs: true + +// @Filename: /foo.js +//// /*moduleDef*/class Blah { +//// abc = 123; +////} +////module.exports.Blah = Blah; + +// @Filename: /bar.js +////const [|/*importDef*/BlahModule|] = require("./foo.js"); +////new [|/*importUsage*/BlahModule|].Blah() + +// @Filename: /barTs.ts +////import [|/*importDefTs*/BlahModule|] = require("./foo.js"); +////new [|/*importUsageTs*/BlahModule|].Blah() + +verify.goToDefinition(["importDef", "importUsage", "importDefTs", "importUsageTs"], "moduleDef"); \ No newline at end of file diff --git a/tests/cases/fourslash/goToDefinitionSignatureAlias_require.ts b/tests/cases/fourslash/goToDefinitionSignatureAlias_require.ts index 8fc2390b3ba..b104c0a50e5 100644 --- a/tests/cases/fourslash/goToDefinitionSignatureAlias_require.ts +++ b/tests/cases/fourslash/goToDefinitionSignatureAlias_require.ts @@ -9,4 +9,8 @@ ////const f = require("./a"); ////[|/*use*/f|](); -verify.goToDefinition("use", "f"); +// @Filename: /bar.ts +////import f = require("./a"); +////[|/*useTs*/f|](); + +verify.goToDefinition(["use", "useTs"], "f");