From ffadce63352fed3cd1f30960203e992810a093b0 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 19 Aug 2015 11:58:02 -0700 Subject: [PATCH 1/2] always process imported modules in 'createProgram' to record module resolutions --- src/compiler/program.ts | 35 +++++++++++++---------------------- src/services/services.ts | 5 ++--- 2 files changed, 15 insertions(+), 25 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index ceb4e5fb033f7..5217674d30991 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -221,19 +221,9 @@ namespace ts { host = host || createCompilerHost(options); - // initialize resolveModuleNameWorker only if noResolve is false - let resolveModuleNamesWorker: (moduleNames: string[], containingFile: string) => string[]; - if (!options.noResolve) { - resolveModuleNamesWorker = host.resolveModuleNames; - if (!resolveModuleNamesWorker) { - resolveModuleNamesWorker = (moduleNames, containingFile) => { - return map(moduleNames, moduleName => { - let moduleResolution = resolveModuleName(moduleName, containingFile, options, host); - return moduleResolution.resolvedFileName; - }); - } - } - } + const resolveModuleNamesWorker = + host.resolveModuleNames || + ((moduleNames, containingFile) => map(moduleNames, moduleName => resolveModuleName(moduleName, containingFile, options, host).resolvedFileName)); let filesByName = createFileMap(fileName => host.getCanonicalFileName(fileName)); @@ -670,12 +660,15 @@ namespace ts { // Set the source file for normalized absolute path filesByName.set(canonicalAbsolutePath, file); - + + let basePath = getDirectoryPath(fileName); if (!options.noResolve) { - let basePath = getDirectoryPath(fileName); processReferencedFiles(file, basePath); - processImportedModules(file, basePath); } + + // always process imported modules to record module name resolutions + processImportedModules(file, basePath); + if (isDefaultLib) { file.isDefaultLib = true; files.unshift(file); @@ -714,20 +707,18 @@ namespace ts { } function processImportedModules(file: SourceFile, basePath: string) { - collectExternalModuleReferences(file); + collectExternalModuleReferences(file); if (file.imports.length) { - file.resolvedModules = {}; - let oldSourceFile = oldProgram && oldProgram.getSourceFile(file.fileName); - + file.resolvedModules = {}; let moduleNames = map(file.imports, name => name.text); let resolutions = resolveModuleNamesWorker(moduleNames, file.fileName); for (let i = 0; i < file.imports.length; ++i) { let resolution = resolutions[i]; setResolvedModuleName(file, moduleNames[i], resolution); - if (resolution) { + if (resolution && !options.noResolve) { findModuleSourceFile(resolution, file.imports[i]); } - } + } } else { // no imports - drop cached module resolutions diff --git a/src/services/services.ts b/src/services/services.ts index eb275120b89e1..8905235644793 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1842,9 +1842,8 @@ namespace ts { getCanonicalFileName: fileName => fileName, getCurrentDirectory: () => "", getNewLine: () => newLine, - // these two methods should never be called in transpile scenarios since 'noResolve' is set to 'true' - fileExists: (fileName): boolean => { throw new Error("Should never be called."); }, - readFile: (fileName): string => { throw new Error("Should never be called."); } + fileExists: (fileName): boolean => fileName === inputFileName, + readFile: (fileName): string => "" }; let program = createProgram([inputFileName], options, compilerHost); From 4a829572be66bdf1e1f58b61fb837cdad995f683 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 19 Aug 2015 15:37:37 -0700 Subject: [PATCH 2/2] added tests --- src/compiler/emitter.ts | 1 - src/compiler/program.ts | 10 +++++----- .../reference/moduleResolutionNoResolve.js | 13 +++++++++++++ .../reference/moduleResolutionNoResolve.symbols | 9 +++++++++ .../reference/moduleResolutionNoResolve.types | 10 ++++++++++ tests/cases/compiler/moduleResolutionNoResolve.ts | 8 ++++++++ 6 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 tests/baselines/reference/moduleResolutionNoResolve.js create mode 100644 tests/baselines/reference/moduleResolutionNoResolve.symbols create mode 100644 tests/baselines/reference/moduleResolutionNoResolve.types create mode 100644 tests/cases/compiler/moduleResolutionNoResolve.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index a6e9b22ddee57..150cc3321f854 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -5131,7 +5131,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi argumentsWritten++; } if (shouldEmitParamTypesMetadata(node)) { - debugger; if (writeComma || argumentsWritten) { write(", "); } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 5217674d30991..07f08952d24a8 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -330,7 +330,7 @@ namespace ts { } // check imports - collectExternalModuleReferences(newSourceFile); + collectExternalModuleReferences(newSourceFile); if (!arrayIsEqualTo(oldSourceFile.imports, newSourceFile.imports, moduleNameIsEqualTo)) { // imports has changed return false; @@ -706,10 +706,10 @@ namespace ts { }); } - function processImportedModules(file: SourceFile, basePath: string) { - collectExternalModuleReferences(file); - if (file.imports.length) { - file.resolvedModules = {}; + function processImportedModules(file: SourceFile, basePath: string) { + collectExternalModuleReferences(file); + if (file.imports.length) { + file.resolvedModules = {}; let moduleNames = map(file.imports, name => name.text); let resolutions = resolveModuleNamesWorker(moduleNames, file.fileName); for (let i = 0; i < file.imports.length; ++i) { diff --git a/tests/baselines/reference/moduleResolutionNoResolve.js b/tests/baselines/reference/moduleResolutionNoResolve.js new file mode 100644 index 0000000000000..9f0537a5ad5c2 --- /dev/null +++ b/tests/baselines/reference/moduleResolutionNoResolve.js @@ -0,0 +1,13 @@ +//// [tests/cases/compiler/moduleResolutionNoResolve.ts] //// + +//// [a.ts] + +import a = require('./b'); + +//// [b.ts] +export var c = ''; + + +//// [a.js] +//// [b.js] +exports.c = ''; diff --git a/tests/baselines/reference/moduleResolutionNoResolve.symbols b/tests/baselines/reference/moduleResolutionNoResolve.symbols new file mode 100644 index 0000000000000..17ccfeab49680 --- /dev/null +++ b/tests/baselines/reference/moduleResolutionNoResolve.symbols @@ -0,0 +1,9 @@ +=== tests/cases/compiler/a.ts === + +import a = require('./b'); +>a : Symbol(a, Decl(a.ts, 0, 0)) + +=== tests/cases/compiler/b.ts === +export var c = ''; +>c : Symbol(c, Decl(b.ts, 0, 10)) + diff --git a/tests/baselines/reference/moduleResolutionNoResolve.types b/tests/baselines/reference/moduleResolutionNoResolve.types new file mode 100644 index 0000000000000..3e96ed2b19762 --- /dev/null +++ b/tests/baselines/reference/moduleResolutionNoResolve.types @@ -0,0 +1,10 @@ +=== tests/cases/compiler/a.ts === + +import a = require('./b'); +>a : typeof a + +=== tests/cases/compiler/b.ts === +export var c = ''; +>c : string +>'' : string + diff --git a/tests/cases/compiler/moduleResolutionNoResolve.ts b/tests/cases/compiler/moduleResolutionNoResolve.ts new file mode 100644 index 0000000000000..aea0208b5d68a --- /dev/null +++ b/tests/cases/compiler/moduleResolutionNoResolve.ts @@ -0,0 +1,8 @@ +// @module:commonjs +// @noResolve: true + +// @filename: a.ts +import a = require('./b'); + +// @filename: b.ts +export var c = '';