From 9960064bc30ba7556497246bb2bad426bee6f9c6 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 12 Feb 2016 16:30:19 -0800 Subject: [PATCH] classic resolution: don't perform folder walk if module name is relative --- src/compiler/program.ts | 27 ++++++++++++------- ...elativeNamesInClassicResolution.errors.txt | 11 ++++++++ .../relativeNamesInClassicResolution.ts | 7 +++++ tests/cases/unittests/moduleResolution.ts | 23 +++++++--------- 4 files changed, 44 insertions(+), 24 deletions(-) create mode 100644 tests/baselines/reference/relativeNamesInClassicResolution.errors.txt create mode 100644 tests/cases/compiler/relativeNamesInClassicResolution.ts diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 0acb13f02d3..56a08dcc7f2 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -533,18 +533,25 @@ namespace ts { } let referencedSourceFile: string; - while (true) { - const searchName = normalizePath(combinePaths(containingDirectory, moduleName)); - referencedSourceFile = loadModuleFromFile(searchName, supportedExtensions, failedLookupLocations, /*onlyRecordFailures*/ false, state); - if (referencedSourceFile) { - break; + if (moduleHasNonRelativeName(moduleName)) { + while (true) { + const searchName = normalizePath(combinePaths(containingDirectory, moduleName)); + referencedSourceFile = loadModuleFromFile(searchName, supportedExtensions, failedLookupLocations, /*onlyRecordFailures*/ false, state); + if (referencedSourceFile) { + break; + } + const parentPath = getDirectoryPath(containingDirectory); + if (parentPath === containingDirectory) { + break; + } + containingDirectory = parentPath; } - const parentPath = getDirectoryPath(containingDirectory); - if (parentPath === containingDirectory) { - break; - } - containingDirectory = parentPath; } + else { + const candidate = normalizePath(combinePaths(containingDirectory, moduleName)); + referencedSourceFile = loadModuleFromFile(candidate, supportedExtensions, failedLookupLocations, /*onlyRecordFailures*/ false, state); + } + return referencedSourceFile ? { resolvedModule: { resolvedFileName: referencedSourceFile }, failedLookupLocations } diff --git a/tests/baselines/reference/relativeNamesInClassicResolution.errors.txt b/tests/baselines/reference/relativeNamesInClassicResolution.errors.txt new file mode 100644 index 00000000000..65a42775331 --- /dev/null +++ b/tests/baselines/reference/relativeNamesInClassicResolution.errors.txt @@ -0,0 +1,11 @@ +tests/cases/compiler/somefolder/a.ts(2,17): error TS2307: Cannot find module './b'. + + +==== tests/cases/compiler/somefolder/a.ts (1 errors) ==== + + import {x} from "./b" + ~~~~~ +!!! error TS2307: Cannot find module './b'. + +==== tests/cases/compiler/b.ts (0 errors) ==== + export let x = 1; \ No newline at end of file diff --git a/tests/cases/compiler/relativeNamesInClassicResolution.ts b/tests/cases/compiler/relativeNamesInClassicResolution.ts new file mode 100644 index 00000000000..7c73a2e3cad --- /dev/null +++ b/tests/cases/compiler/relativeNamesInClassicResolution.ts @@ -0,0 +1,7 @@ +// @module:amd + +// @filename: somefolder/a.ts +import {x} from "./b" + +// @filename: b.ts +export let x = 1; \ No newline at end of file diff --git a/tests/cases/unittests/moduleResolution.ts b/tests/cases/unittests/moduleResolution.ts index 1173f579f2c..9a52d9896e4 100644 --- a/tests/cases/unittests/moduleResolution.ts +++ b/tests/cases/unittests/moduleResolution.ts @@ -48,7 +48,7 @@ module ts { return hasProperty(directories, path); }, fileExists: path => { - assert.isTrue(hasProperty(directories, getDirectoryPath(path)), "'fileExists' request in non-existing directory"); + assert.isTrue(hasProperty(directories, getDirectoryPath(path)), `'fileExists' '${path}' request in non-existing directory`); return hasProperty(map, path); } } @@ -814,7 +814,6 @@ import b = require("./moduleB.ts"); it ("classic + rootDirs", () => { test(/*hasDirectoryExists*/ false); - test(/*hasDirectoryExists*/ true); function test(hasDirectoryExists: boolean) { let file1: File = { name: "/root/folder1/file1.ts" }; @@ -844,24 +843,20 @@ import b = require("./moduleB.ts"); "/root/generated/folder1/file1.d.ts", // then try alternative rootDir entry ]); - check("../folder1/file1_1", file3, file4, [ - // load from initial location + check("folder1/file1_1", file3, file4, [ + // current location + "/root/generated/folder2/folder1/file1_1.ts", + "/root/generated/folder2/folder1/file1_1.tsx", + "/root/generated/folder2/folder1/file1_1.d.ts", + // other entry in rootDirs "/root/generated/folder1/file1_1.ts", "/root/generated/folder1/file1_1.tsx", "/root/generated/folder1/file1_1.d.ts", - // load from alternative rootDir entry - "/root/folder1/file1_1.ts", - "/root/folder1/file1_1.tsx", - "/root/folder1/file1_1.d.ts", - // fallback to classic - // step1: initial location - "/root/generated/folder1/file1_1.ts", - "/root/generated/folder1/file1_1.tsx", - "/root/generated/folder1/file1_1.d.ts", - // step2: walk 1 level up + // fallback "/root/folder1/file1_1.ts", "/root/folder1/file1_1.tsx", "/root/folder1/file1_1.d.ts", + // found one ]); function check(name: string, container: File, expected: File, expectedFailedLookups: string[]) {