From 2e55b6ae16675b51fe1c8bbb33ae2546bb6ec213 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Fri, 9 Jun 2017 10:01:17 -0700 Subject: [PATCH 1/4] Implement LS on string-literal of dynamic import --- src/compiler/checker.ts | 14 ++++++++------ src/services/findAllReferences.ts | 2 +- .../fourslash/findAllReferencesDynamicImport1.ts | 9 +++++++++ .../fourslash/goToDefinitionDynamicImport1.ts | 10 ++++++++++ 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 tests/cases/fourslash/findAllReferencesDynamicImport1.ts create mode 100644 tests/cases/fourslash/goToDefinitionDynamicImport1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 846f7692a0c..c8a99b0bbb2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22665,14 +22665,16 @@ namespace ts { return undefined; case SyntaxKind.StringLiteral: - // External module name in an import declaration - if ((isExternalModuleImportEqualsDeclaration(node.parent.parent) && - getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) || - ((node.parent.kind === SyntaxKind.ImportDeclaration || node.parent.kind === SyntaxKind.ExportDeclaration) && - (node.parent).moduleSpecifier === node)) { + // import x = require("./mo/*gotToDefinitionHere*/d") + if (isExternalModuleImportEqualsDeclaration(node.parent.parent) && getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) { return resolveExternalModuleName(node, node); } - if (isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) { + // External module name in an import declaration + if ((node.parent.kind === SyntaxKind.ImportDeclaration || node.parent.kind === SyntaxKind.ExportDeclaration) && (node.parent).moduleSpecifier === node) { + return resolveExternalModuleName(node, node); + } + if ((isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) || + isImportCall(node.parent)) { return resolveExternalModuleName(node, node); } // falls through diff --git a/src/services/findAllReferences.ts b/src/services/findAllReferences.ts index 67a967ec8b9..b312aa064f9 100644 --- a/src/services/findAllReferences.ts +++ b/src/services/findAllReferences.ts @@ -307,7 +307,7 @@ namespace ts.FindAllReferences.Core { case SyntaxKind.ExportDeclaration: return true; case SyntaxKind.CallExpression: - return isRequireCall(node.parent as CallExpression, /*checkArgumentIsStringLiteral*/ false); + return isRequireCall(node.parent as CallExpression, /*checkArgumentIsStringLiteral*/ false) || isImportCall(node.parent as CallExpression); default: return false; } diff --git a/tests/cases/fourslash/findAllReferencesDynamicImport1.ts b/tests/cases/fourslash/findAllReferencesDynamicImport1.ts new file mode 100644 index 00000000000..ad0f261388d --- /dev/null +++ b/tests/cases/fourslash/findAllReferencesDynamicImport1.ts @@ -0,0 +1,9 @@ +/// + +// @Filename: foo.ts +//// export function foo() { return "foo"; } + +//// import("[|./foo|]") +//// var x = import("[|./foo|]") + +verify.rangesReferenceEachOther(); \ No newline at end of file diff --git a/tests/cases/fourslash/goToDefinitionDynamicImport1.ts b/tests/cases/fourslash/goToDefinitionDynamicImport1.ts new file mode 100644 index 00000000000..2e93534496a --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionDynamicImport1.ts @@ -0,0 +1,10 @@ +/// + +// @Filename: foo.ts +//// /*Destination*/export function foo() { return "foo"; } + +//// import("./f/*1*/oo") +//// var x = import("./fo/*2*/o") + +verify.goToDefinition("1", "Destination"); +verify.goToDefinition("2", "Destination"); \ No newline at end of file From ff28bfa4aa6746e19f36107f49c45cadeedbe258 Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Fri, 9 Jun 2017 10:40:52 -0700 Subject: [PATCH 2/4] Add fourslash rename, find-all-reference on imported property --- .../fourslash/findAllReferencesDynamicImport2.ts | 12 ++++++++++++ .../cases/fourslash/goToDefinitionDynamicImport2.ts | 11 +++++++++++ 2 files changed, 23 insertions(+) create mode 100644 tests/cases/fourslash/findAllReferencesDynamicImport2.ts create mode 100644 tests/cases/fourslash/goToDefinitionDynamicImport2.ts diff --git a/tests/cases/fourslash/findAllReferencesDynamicImport2.ts b/tests/cases/fourslash/findAllReferencesDynamicImport2.ts new file mode 100644 index 00000000000..558e2fed7ef --- /dev/null +++ b/tests/cases/fourslash/findAllReferencesDynamicImport2.ts @@ -0,0 +1,12 @@ +/// + +// @Filename: foo.ts +//// export function [|bar|]() { return "bar"; } + +//// var x = import("./foo"); +//// x.then(foo => { +//// foo.[|bar|](); +//// }) + +verify.rangesReferenceEachOther(); +verify.rangesAreRenameLocations(); \ No newline at end of file diff --git a/tests/cases/fourslash/goToDefinitionDynamicImport2.ts b/tests/cases/fourslash/goToDefinitionDynamicImport2.ts new file mode 100644 index 00000000000..4364b0abb19 --- /dev/null +++ b/tests/cases/fourslash/goToDefinitionDynamicImport2.ts @@ -0,0 +1,11 @@ +/// + +// @Filename: foo.ts +//// export function /*Desitnation*/bar() { return "bar"; } + +//// var x = import("./foo"); +//// x.then(foo => { +//// foo.b/*1*/ar(); +//// }) + +verify.goToDefinition("1", "Destination"); \ No newline at end of file From f765233e07bbfd892d6052cf76f21a49c4c8b1b2 Mon Sep 17 00:00:00 2001 From: Yui T Date: Fri, 9 Jun 2017 18:34:21 -0700 Subject: [PATCH 3/4] Update baseline --- tests/baselines/reference/importCallExpression1ESNext.symbols | 4 ++++ tests/baselines/reference/importCallExpression2ESNext.symbols | 1 + tests/baselines/reference/importCallExpression3ESNext.symbols | 1 + tests/baselines/reference/importCallExpression4ESNext.symbols | 2 ++ .../reference/importCallExpressionDeclarationEmit3.symbols | 3 +++ tests/baselines/reference/importCallExpressionES5AMD.symbols | 4 ++++ tests/baselines/reference/importCallExpressionES5CJS.symbols | 4 ++++ .../baselines/reference/importCallExpressionES5System.symbols | 4 ++++ tests/baselines/reference/importCallExpressionES5UMD.symbols | 4 ++++ tests/baselines/reference/importCallExpressionInAMD1.symbols | 4 ++++ tests/baselines/reference/importCallExpressionInAMD2.symbols | 1 + tests/baselines/reference/importCallExpressionInAMD3.symbols | 1 + tests/baselines/reference/importCallExpressionInAMD4.symbols | 2 ++ tests/baselines/reference/importCallExpressionInCJS1.symbols | 4 ++++ tests/baselines/reference/importCallExpressionInCJS2.symbols | 2 ++ tests/baselines/reference/importCallExpressionInCJS3.symbols | 1 + tests/baselines/reference/importCallExpressionInCJS4.symbols | 1 + tests/baselines/reference/importCallExpressionInCJS5.symbols | 2 ++ .../reference/importCallExpressionInScriptContext1.symbols | 1 + .../baselines/reference/importCallExpressionInSystem1.symbols | 4 ++++ .../baselines/reference/importCallExpressionInSystem2.symbols | 1 + .../baselines/reference/importCallExpressionInSystem3.symbols | 1 + .../baselines/reference/importCallExpressionInSystem4.symbols | 2 ++ tests/baselines/reference/importCallExpressionInUMD1.symbols | 4 ++++ tests/baselines/reference/importCallExpressionInUMD2.symbols | 1 + tests/baselines/reference/importCallExpressionInUMD3.symbols | 1 + tests/baselines/reference/importCallExpressionInUMD4.symbols | 2 ++ tests/cases/fourslash/goToDefinitionDynamicImport2.ts | 2 +- 28 files changed, 63 insertions(+), 1 deletion(-) diff --git a/tests/baselines/reference/importCallExpression1ESNext.symbols b/tests/baselines/reference/importCallExpression1ESNext.symbols index 28b5ba13e99..564943aca54 100644 --- a/tests/baselines/reference/importCallExpression1ESNext.symbols +++ b/tests/baselines/reference/importCallExpression1ESNext.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpression2ESNext.symbols b/tests/baselines/reference/importCallExpression2ESNext.symbols index 2002398aeb9..9c0a8ebbbb4 100644 --- a/tests/baselines/reference/importCallExpression2ESNext.symbols +++ b/tests/baselines/reference/importCallExpression2ESNext.symbols @@ -30,4 +30,5 @@ function foo(x: Promise) { foo(import("./0")); >foo : Symbol(foo, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpression3ESNext.symbols b/tests/baselines/reference/importCallExpression3ESNext.symbols index 5ca85d6e693..a1f2ffce44a 100644 --- a/tests/baselines/reference/importCallExpression3ESNext.symbols +++ b/tests/baselines/reference/importCallExpression3ESNext.symbols @@ -13,6 +13,7 @@ async function foo() { class C extends (await import("./0")).B {} >C : Symbol(C, Decl(2.ts, 0, 22)) >(await import("./0")).B : Symbol(B, Decl(0.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) >B : Symbol(B, Decl(0.ts, 0, 0)) var c = new C(); diff --git a/tests/baselines/reference/importCallExpression4ESNext.symbols b/tests/baselines/reference/importCallExpression4ESNext.symbols index 34a1dcf4d7b..b02646d5e3d 100644 --- a/tests/baselines/reference/importCallExpression4ESNext.symbols +++ b/tests/baselines/reference/importCallExpression4ESNext.symbols @@ -22,6 +22,7 @@ class C { private myModule = import("./0"); >myModule : Symbol(C.myModule, Decl(2.ts, 1, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) method() { >method : Symbol(C.method, Decl(2.ts, 2, 37)) @@ -49,6 +50,7 @@ class C { let one = await import("./1"); >one : Symbol(one, Decl(2.ts, 8, 15)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) console.log(one.backup()); >console : Symbol(console, Decl(2.ts, 0, 11)) diff --git a/tests/baselines/reference/importCallExpressionDeclarationEmit3.symbols b/tests/baselines/reference/importCallExpressionDeclarationEmit3.symbols index 1491e05db55..d3b10cbb320 100644 --- a/tests/baselines/reference/importCallExpressionDeclarationEmit3.symbols +++ b/tests/baselines/reference/importCallExpressionDeclarationEmit3.symbols @@ -10,6 +10,7 @@ import * as Zero from "./0"; >Zero : Symbol(Zero, Decl(1.ts, 1, 6)) import("./0"); +>"./0" : Symbol(Zero, Decl(0.ts, 0, 0)) export var p0: Promise = import(getPath()); >p0 : Symbol(p0, Decl(1.ts, 4, 10)) @@ -21,8 +22,10 @@ export var p1: Promise = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 5, 10)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) >Zero : Symbol(Zero, Decl(1.ts, 1, 6)) +>"./0" : Symbol(Zero, Decl(0.ts, 0, 0)) export var p2: Promise = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 6, 10)) >Promise : Symbol(Promise, Decl(lib.es5.d.ts, --, --), Decl(lib.es2015.symbol.wellknown.d.ts, --, --), Decl(lib.es2015.promise.d.ts, --, --), Decl(lib.es2015.iterable.d.ts, --, --)) +>"./0" : Symbol(Zero, Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionES5AMD.symbols b/tests/baselines/reference/importCallExpressionES5AMD.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionES5AMD.symbols +++ b/tests/baselines/reference/importCallExpressionES5AMD.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionES5CJS.symbols b/tests/baselines/reference/importCallExpressionES5CJS.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionES5CJS.symbols +++ b/tests/baselines/reference/importCallExpressionES5CJS.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionES5System.symbols b/tests/baselines/reference/importCallExpressionES5System.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionES5System.symbols +++ b/tests/baselines/reference/importCallExpressionES5System.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionES5UMD.symbols b/tests/baselines/reference/importCallExpressionES5UMD.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionES5UMD.symbols +++ b/tests/baselines/reference/importCallExpressionES5UMD.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionInAMD1.symbols b/tests/baselines/reference/importCallExpressionInAMD1.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionInAMD1.symbols +++ b/tests/baselines/reference/importCallExpressionInAMD1.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionInAMD2.symbols b/tests/baselines/reference/importCallExpressionInAMD2.symbols index 16fc79c774f..b4809afbf50 100644 --- a/tests/baselines/reference/importCallExpressionInAMD2.symbols +++ b/tests/baselines/reference/importCallExpressionInAMD2.symbols @@ -31,4 +31,5 @@ function foo(x: Promise) { foo(import("./0")); >foo : Symbol(foo, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionInAMD3.symbols b/tests/baselines/reference/importCallExpressionInAMD3.symbols index 5ca85d6e693..a1f2ffce44a 100644 --- a/tests/baselines/reference/importCallExpressionInAMD3.symbols +++ b/tests/baselines/reference/importCallExpressionInAMD3.symbols @@ -13,6 +13,7 @@ async function foo() { class C extends (await import("./0")).B {} >C : Symbol(C, Decl(2.ts, 0, 22)) >(await import("./0")).B : Symbol(B, Decl(0.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) >B : Symbol(B, Decl(0.ts, 0, 0)) var c = new C(); diff --git a/tests/baselines/reference/importCallExpressionInAMD4.symbols b/tests/baselines/reference/importCallExpressionInAMD4.symbols index 34a1dcf4d7b..b02646d5e3d 100644 --- a/tests/baselines/reference/importCallExpressionInAMD4.symbols +++ b/tests/baselines/reference/importCallExpressionInAMD4.symbols @@ -22,6 +22,7 @@ class C { private myModule = import("./0"); >myModule : Symbol(C.myModule, Decl(2.ts, 1, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) method() { >method : Symbol(C.method, Decl(2.ts, 2, 37)) @@ -49,6 +50,7 @@ class C { let one = await import("./1"); >one : Symbol(one, Decl(2.ts, 8, 15)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) console.log(one.backup()); >console : Symbol(console, Decl(2.ts, 0, 11)) diff --git a/tests/baselines/reference/importCallExpressionInCJS1.symbols b/tests/baselines/reference/importCallExpressionInCJS1.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionInCJS1.symbols +++ b/tests/baselines/reference/importCallExpressionInCJS1.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionInCJS2.symbols b/tests/baselines/reference/importCallExpressionInCJS2.symbols index 24f7a5cdb48..c60760c6184 100644 --- a/tests/baselines/reference/importCallExpressionInCJS2.symbols +++ b/tests/baselines/reference/importCallExpressionInCJS2.symbols @@ -21,6 +21,7 @@ async function compute(promise: Promise) { j = await import("./1"); >j : Symbol(j, Decl(2.ts, 1, 7)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) return j.backup(); >j : Symbol(j, Decl(2.ts, 1, 7)) @@ -31,4 +32,5 @@ async function compute(promise: Promise) { compute(import("./0")); >compute : Symbol(compute, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionInCJS3.symbols b/tests/baselines/reference/importCallExpressionInCJS3.symbols index 16fc79c774f..b4809afbf50 100644 --- a/tests/baselines/reference/importCallExpressionInCJS3.symbols +++ b/tests/baselines/reference/importCallExpressionInCJS3.symbols @@ -31,4 +31,5 @@ function foo(x: Promise) { foo(import("./0")); >foo : Symbol(foo, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionInCJS4.symbols b/tests/baselines/reference/importCallExpressionInCJS4.symbols index 5ca85d6e693..a1f2ffce44a 100644 --- a/tests/baselines/reference/importCallExpressionInCJS4.symbols +++ b/tests/baselines/reference/importCallExpressionInCJS4.symbols @@ -13,6 +13,7 @@ async function foo() { class C extends (await import("./0")).B {} >C : Symbol(C, Decl(2.ts, 0, 22)) >(await import("./0")).B : Symbol(B, Decl(0.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) >B : Symbol(B, Decl(0.ts, 0, 0)) var c = new C(); diff --git a/tests/baselines/reference/importCallExpressionInCJS5.symbols b/tests/baselines/reference/importCallExpressionInCJS5.symbols index 34a1dcf4d7b..b02646d5e3d 100644 --- a/tests/baselines/reference/importCallExpressionInCJS5.symbols +++ b/tests/baselines/reference/importCallExpressionInCJS5.symbols @@ -22,6 +22,7 @@ class C { private myModule = import("./0"); >myModule : Symbol(C.myModule, Decl(2.ts, 1, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) method() { >method : Symbol(C.method, Decl(2.ts, 2, 37)) @@ -49,6 +50,7 @@ class C { let one = await import("./1"); >one : Symbol(one, Decl(2.ts, 8, 15)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) console.log(one.backup()); >console : Symbol(console, Decl(2.ts, 0, 11)) diff --git a/tests/baselines/reference/importCallExpressionInScriptContext1.symbols b/tests/baselines/reference/importCallExpressionInScriptContext1.symbols index 513612056a8..d8657a10c31 100644 --- a/tests/baselines/reference/importCallExpressionInScriptContext1.symbols +++ b/tests/baselines/reference/importCallExpressionInScriptContext1.symbols @@ -5,6 +5,7 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 0, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) function arguments() { } // this is allow as the file doesn't have implicit "use strict" >arguments : Symbol(arguments, Decl(1.ts, 0, 23)) diff --git a/tests/baselines/reference/importCallExpressionInSystem1.symbols b/tests/baselines/reference/importCallExpressionInSystem1.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionInSystem1.symbols +++ b/tests/baselines/reference/importCallExpressionInSystem1.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionInSystem2.symbols b/tests/baselines/reference/importCallExpressionInSystem2.symbols index 16fc79c774f..b4809afbf50 100644 --- a/tests/baselines/reference/importCallExpressionInSystem2.symbols +++ b/tests/baselines/reference/importCallExpressionInSystem2.symbols @@ -31,4 +31,5 @@ function foo(x: Promise) { foo(import("./0")); >foo : Symbol(foo, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionInSystem3.symbols b/tests/baselines/reference/importCallExpressionInSystem3.symbols index 5ca85d6e693..a1f2ffce44a 100644 --- a/tests/baselines/reference/importCallExpressionInSystem3.symbols +++ b/tests/baselines/reference/importCallExpressionInSystem3.symbols @@ -13,6 +13,7 @@ async function foo() { class C extends (await import("./0")).B {} >C : Symbol(C, Decl(2.ts, 0, 22)) >(await import("./0")).B : Symbol(B, Decl(0.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) >B : Symbol(B, Decl(0.ts, 0, 0)) var c = new C(); diff --git a/tests/baselines/reference/importCallExpressionInSystem4.symbols b/tests/baselines/reference/importCallExpressionInSystem4.symbols index 34a1dcf4d7b..b02646d5e3d 100644 --- a/tests/baselines/reference/importCallExpressionInSystem4.symbols +++ b/tests/baselines/reference/importCallExpressionInSystem4.symbols @@ -22,6 +22,7 @@ class C { private myModule = import("./0"); >myModule : Symbol(C.myModule, Decl(2.ts, 1, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) method() { >method : Symbol(C.method, Decl(2.ts, 2, 37)) @@ -49,6 +50,7 @@ class C { let one = await import("./1"); >one : Symbol(one, Decl(2.ts, 8, 15)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) console.log(one.backup()); >console : Symbol(console, Decl(2.ts, 0, 11)) diff --git a/tests/baselines/reference/importCallExpressionInUMD1.symbols b/tests/baselines/reference/importCallExpressionInUMD1.symbols index 333251da662..a1a506e7005 100644 --- a/tests/baselines/reference/importCallExpressionInUMD1.symbols +++ b/tests/baselines/reference/importCallExpressionInUMD1.symbols @@ -4,8 +4,11 @@ export function foo() { return "foo"; } === tests/cases/conformance/dynamicImport/1.ts === import("./0"); +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) + var p1 = import("./0"); >p1 : Symbol(p1, Decl(1.ts, 1, 3)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) p1.then(zero => { >p1.then : Symbol(Promise.then, Decl(lib.es5.d.ts, --, --)) @@ -25,4 +28,5 @@ function foo() { const p2 = import("./0"); >p2 : Symbol(p2, Decl(1.ts, 7, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) } diff --git a/tests/baselines/reference/importCallExpressionInUMD2.symbols b/tests/baselines/reference/importCallExpressionInUMD2.symbols index 16fc79c774f..b4809afbf50 100644 --- a/tests/baselines/reference/importCallExpressionInUMD2.symbols +++ b/tests/baselines/reference/importCallExpressionInUMD2.symbols @@ -31,4 +31,5 @@ function foo(x: Promise) { foo(import("./0")); >foo : Symbol(foo, Decl(2.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) diff --git a/tests/baselines/reference/importCallExpressionInUMD3.symbols b/tests/baselines/reference/importCallExpressionInUMD3.symbols index 5ca85d6e693..a1f2ffce44a 100644 --- a/tests/baselines/reference/importCallExpressionInUMD3.symbols +++ b/tests/baselines/reference/importCallExpressionInUMD3.symbols @@ -13,6 +13,7 @@ async function foo() { class C extends (await import("./0")).B {} >C : Symbol(C, Decl(2.ts, 0, 22)) >(await import("./0")).B : Symbol(B, Decl(0.ts, 0, 0)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) >B : Symbol(B, Decl(0.ts, 0, 0)) var c = new C(); diff --git a/tests/baselines/reference/importCallExpressionInUMD4.symbols b/tests/baselines/reference/importCallExpressionInUMD4.symbols index 34a1dcf4d7b..b02646d5e3d 100644 --- a/tests/baselines/reference/importCallExpressionInUMD4.symbols +++ b/tests/baselines/reference/importCallExpressionInUMD4.symbols @@ -22,6 +22,7 @@ class C { private myModule = import("./0"); >myModule : Symbol(C.myModule, Decl(2.ts, 1, 9)) +>"./0" : Symbol("tests/cases/conformance/dynamicImport/0", Decl(0.ts, 0, 0)) method() { >method : Symbol(C.method, Decl(2.ts, 2, 37)) @@ -49,6 +50,7 @@ class C { let one = await import("./1"); >one : Symbol(one, Decl(2.ts, 8, 15)) +>"./1" : Symbol("tests/cases/conformance/dynamicImport/1", Decl(1.ts, 0, 0)) console.log(one.backup()); >console : Symbol(console, Decl(2.ts, 0, 11)) diff --git a/tests/cases/fourslash/goToDefinitionDynamicImport2.ts b/tests/cases/fourslash/goToDefinitionDynamicImport2.ts index 4364b0abb19..c3c213a6cdb 100644 --- a/tests/cases/fourslash/goToDefinitionDynamicImport2.ts +++ b/tests/cases/fourslash/goToDefinitionDynamicImport2.ts @@ -1,7 +1,7 @@ /// // @Filename: foo.ts -//// export function /*Desitnation*/bar() { return "bar"; } +//// export function /*Destination*/bar() { return "bar"; } //// var x = import("./foo"); //// x.then(foo => { From da52bad4b8930564ca0ccf68d7dd287f3eada09a Mon Sep 17 00:00:00 2001 From: Kanchalai Tanglertsampan Date: Tue, 13 Jun 2017 10:03:43 -0700 Subject: [PATCH 4/4] Address PR --- src/compiler/checker.ts | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c8a99b0bbb2..2ce83f570e2 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -22665,16 +22665,12 @@ namespace ts { return undefined; case SyntaxKind.StringLiteral: - // import x = require("./mo/*gotToDefinitionHere*/d") - if (isExternalModuleImportEqualsDeclaration(node.parent.parent) && getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) { - return resolveExternalModuleName(node, node); - } - // External module name in an import declaration - if ((node.parent.kind === SyntaxKind.ImportDeclaration || node.parent.kind === SyntaxKind.ExportDeclaration) && (node.parent).moduleSpecifier === node) { - return resolveExternalModuleName(node, node); - } - if ((isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) || - isImportCall(node.parent)) { + // 1). import x = require("./mo/*gotToDefinitionHere*/d") + // 2). External module name in an import declaration + // 3). Dynamic import call or require in javascript + if ((isExternalModuleImportEqualsDeclaration(node.parent.parent) && getExternalModuleImportEqualsDeclarationExpression(node.parent.parent) === node) || + ((node.parent.kind === SyntaxKind.ImportDeclaration || node.parent.kind === SyntaxKind.ExportDeclaration) && (node.parent).moduleSpecifier === node) || + ((isInJavaScriptFile(node) && isRequireCall(node.parent, /*checkArgumentIsStringLiteral*/ false)) || isImportCall(node.parent))) { return resolveExternalModuleName(node, node); } // falls through