Skip to content

Commit 6f519d8

Browse files
author
Andy
authored
Merge pull request #11899 from Microsoft/optional_extension
Make `extension` property of `ResolvedModule` optional
2 parents a143f97 + 0f8003f commit 6f519d8

File tree

8 files changed

+35
-30
lines changed

8 files changed

+35
-30
lines changed

src/compiler/moduleNameResolver.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ namespace ts {
4545
}
4646

4747
/** Adds `isExernalLibraryImport` to a Resolved to get a ResolvedModule. */
48-
function resolvedModuleFromResolved({ path, extension }: Resolved, isExternalLibraryImport: boolean): ResolvedModule {
48+
function resolvedModuleFromResolved({ path, extension }: Resolved, isExternalLibraryImport: boolean): ResolvedModuleFull {
4949
return { resolvedFileName: path, extension, isExternalLibraryImport };
5050
}
5151

src/compiler/program.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -329,16 +329,16 @@ namespace ts {
329329
// Map storing if there is emit blocking diagnostics for given input
330330
const hasEmitBlockingDiagnostics = createFileMap<boolean>(getCanonicalFileName);
331331

332-
let resolveModuleNamesWorker: (moduleNames: string[], containingFile: string) => ResolvedModule[];
332+
let resolveModuleNamesWorker: (moduleNames: string[], containingFile: string) => ResolvedModuleFull[];
333333
if (host.resolveModuleNames) {
334334
resolveModuleNamesWorker = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile).map(resolved => {
335335
// An older host may have omitted extension, in which case we should infer it from the file extension of resolvedFileName.
336-
if (!resolved || resolved.extension !== undefined) {
337-
return resolved;
336+
if (!resolved || (resolved as ResolvedModuleFull).extension !== undefined) {
337+
return resolved as ResolvedModuleFull;
338338
}
339-
resolved = clone(resolved);
340-
resolved.extension = extensionFromPath(resolved.resolvedFileName);
341-
return resolved;
339+
const withExtension = clone(resolved) as ResolvedModuleFull;
340+
withExtension.extension = extensionFromPath(resolved.resolvedFileName);
341+
return withExtension;
342342
});
343343
}
344344
else {
@@ -1294,7 +1294,7 @@ namespace ts {
12941294
function processImportedModules(file: SourceFile) {
12951295
collectExternalModuleReferences(file);
12961296
if (file.imports.length || file.moduleAugmentations.length) {
1297-
file.resolvedModules = createMap<ResolvedModule>();
1297+
file.resolvedModules = createMap<ResolvedModuleFull>();
12981298
const moduleNames = map(concatenate(file.imports, file.moduleAugmentations), getTextOfLiteral);
12991299
const resolutions = resolveModuleNamesWorker(moduleNames, getNormalizedAbsolutePath(file.fileName, currentDirectory));
13001300
Debug.assert(resolutions.length === moduleNames.length);
@@ -1573,7 +1573,7 @@ namespace ts {
15731573
* The DiagnosticMessage's parameters are the imported module name, and the filename it resolved to.
15741574
* This returns a diagnostic even if the module will be an untyped module.
15751575
*/
1576-
export function getResolutionDiagnostic(options: CompilerOptions, { extension }: ResolvedModule): DiagnosticMessage | undefined {
1576+
export function getResolutionDiagnostic(options: CompilerOptions, { extension }: ResolvedModuleFull): DiagnosticMessage | undefined {
15771577
switch (extension) {
15781578
case Extension.Ts:
15791579
case Extension.Dts:

src/compiler/types.ts

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ namespace ts {
423423
ThisNodeHasError = 1 << 19, // If the parser encountered an error when parsing the code that created this node
424424
JavaScriptFile = 1 << 20, // If node was parsed in a JavaScript
425425
ThisNodeOrAnySubNodesHasError = 1 << 21, // If this node or any of its children had an error
426-
HasAggregatedChildData = 1 << 22, // If we've computed data from children and cached it in this node
426+
HasAggregatedChildData = 1 << 22, // If we've computed data from children and cached it in this node
427427

428428
BlockScoped = Let | Const,
429429

@@ -2083,7 +2083,7 @@ namespace ts {
20832083
// Stores a mapping 'external module reference text' -> 'resolved file name' | undefined
20842084
// It is used to resolve module names in the checker.
20852085
// Content of this field should never be used directly - use getResolvedModuleFileName/setResolvedModuleFileName functions instead
2086-
/* @internal */ resolvedModules: Map<ResolvedModule>;
2086+
/* @internal */ resolvedModules: Map<ResolvedModuleFull>;
20872087
/* @internal */ resolvedTypeReferenceDirectiveNames: Map<ResolvedTypeReferenceDirective>;
20882088
/* @internal */ imports: LiteralExpression[];
20892089
/* @internal */ moduleAugmentations: LiteralExpression[];
@@ -3352,14 +3352,11 @@ namespace ts {
33523352
* Module resolution will pick up tsx/jsx/js files even if '--jsx' and '--allowJs' are turned off.
33533353
* The Program will then filter results based on these flags.
33543354
*
3355-
* At least one of `resolvedTsFileName` or `resolvedJsFileName` must be defined,
3356-
* else resolution should just return `undefined` instead of a ResolvedModule.
3355+
* Prefer to return a `ResolvedModuleFull` so that the file type does not have to be inferred.
33573356
*/
33583357
export interface ResolvedModule {
33593358
/** Path of the file the module was resolved to. */
33603359
resolvedFileName: string;
3361-
/** Extension of resolvedFileName. This must match what's at the end of resolvedFileName. */
3362-
extension: Extension;
33633360
/**
33643361
* Denotes if 'resolvedFileName' is isExternalLibraryImport and thus should be a proper external module:
33653362
* - be a .d.ts file
@@ -3369,6 +3366,18 @@ namespace ts {
33693366
isExternalLibraryImport?: boolean;
33703367
}
33713368

3369+
/**
3370+
* ResolvedModule with an explicitly provided `extension` property.
3371+
* Prefer this over `ResolvedModule`.
3372+
*/
3373+
export interface ResolvedModuleFull extends ResolvedModule {
3374+
/**
3375+
* Extension of resolvedFileName. This must match what's at the end of resolvedFileName.
3376+
* This is optional for backwards-compatibility, but will be added if not provided.
3377+
*/
3378+
extension: Extension;
3379+
}
3380+
33723381
export enum Extension {
33733382
Ts,
33743383
Tsx,
@@ -3379,7 +3388,7 @@ namespace ts {
33793388
}
33803389

33813390
export interface ResolvedModuleWithFailedLookupLocations {
3382-
resolvedModule: ResolvedModule | undefined;
3391+
resolvedModule: ResolvedModuleFull | undefined;
33833392
failedLookupLocations: string[];
33843393
}
33853394

src/compiler/utilities.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,13 @@ namespace ts {
8787
return !!(sourceFile && sourceFile.resolvedModules && sourceFile.resolvedModules[moduleNameText]);
8888
}
8989

90-
export function getResolvedModule(sourceFile: SourceFile, moduleNameText: string): ResolvedModule {
90+
export function getResolvedModule(sourceFile: SourceFile, moduleNameText: string): ResolvedModuleFull {
9191
return hasResolvedModule(sourceFile, moduleNameText) ? sourceFile.resolvedModules[moduleNameText] : undefined;
9292
}
9393

94-
export function setResolvedModule(sourceFile: SourceFile, moduleNameText: string, resolvedModule: ResolvedModule): void {
94+
export function setResolvedModule(sourceFile: SourceFile, moduleNameText: string, resolvedModule: ResolvedModuleFull): void {
9595
if (!sourceFile.resolvedModules) {
96-
sourceFile.resolvedModules = createMap<ResolvedModule>();
96+
sourceFile.resolvedModules = createMap<ResolvedModuleFull>();
9797
}
9898

9999
sourceFile.resolvedModules[moduleNameText] = resolvedModule;
@@ -108,11 +108,7 @@ namespace ts {
108108
}
109109

110110
/* @internal */
111-
/**
112-
* Considers two ResolvedModules equal if they have the same `resolvedFileName`.
113-
* Thus `{ ts: foo, js: bar }` is equal to `{ ts: foo, js: baz }` because `ts` is preferred.
114-
*/
115-
export function moduleResolutionIsEqualTo(oldResolution: ResolvedModule, newResolution: ResolvedModule): boolean {
111+
export function moduleResolutionIsEqualTo(oldResolution: ResolvedModuleFull, newResolution: ResolvedModuleFull): boolean {
116112
return oldResolution.isExternalLibraryImport === newResolution.isExternalLibraryImport &&
117113
oldResolution.extension === newResolution.extension &&
118114
oldResolution.resolvedFileName === newResolution.resolvedFileName;

src/harness/unittests/moduleResolution.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/// <reference path="..\harness.ts" />
22

33
namespace ts {
4-
export function checkResolvedModule(expected: ResolvedModule, actual: ResolvedModule): boolean {
4+
export function checkResolvedModule(expected: ResolvedModuleFull, actual: ResolvedModuleFull): boolean {
55
if (!expected === !actual) {
66
if (expected) {
77
assert.isTrue(expected.resolvedFileName === actual.resolvedFileName, `'resolvedFileName': expected '${expected.resolvedFileName}' to be equal to '${actual.resolvedFileName}'`);
@@ -13,13 +13,13 @@ namespace ts {
1313
return false;
1414
}
1515

16-
export function checkResolvedModuleWithFailedLookupLocations(actual: ResolvedModuleWithFailedLookupLocations, expectedResolvedModule: ResolvedModule, expectedFailedLookupLocations: string[]): void {
16+
export function checkResolvedModuleWithFailedLookupLocations(actual: ResolvedModuleWithFailedLookupLocations, expectedResolvedModule: ResolvedModuleFull, expectedFailedLookupLocations: string[]): void {
1717
assert.isTrue(actual.resolvedModule !== undefined, "module should be resolved");
1818
checkResolvedModule(actual.resolvedModule, expectedResolvedModule);
1919
assert.deepEqual(actual.failedLookupLocations, expectedFailedLookupLocations);
2020
}
2121

22-
export function createResolvedModule(resolvedFileName: string, isExternalLibraryImport = false): ResolvedModule {
22+
export function createResolvedModule(resolvedFileName: string, isExternalLibraryImport = false): ResolvedModuleFull {
2323
return { resolvedFileName, extension: extensionFromPath(resolvedFileName), isExternalLibraryImport };
2424
}
2525

src/server/lsHost.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ namespace ts.server {
151151
m => m.resolvedTypeReferenceDirective, r => r.resolvedFileName, /*logChanges*/ false);
152152
}
153153

154-
resolveModuleNames(moduleNames: string[], containingFile: string): ResolvedModule[] {
154+
resolveModuleNames(moduleNames: string[], containingFile: string): ResolvedModuleFull[] {
155155
return this.resolveNamesWithLocalCache(moduleNames, containingFile, this.resolvedModuleNames, this.resolveModuleName,
156156
m => m.resolvedModule, r => r.resolvedFileName, /*logChanges*/ true);
157157
}

src/services/services.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -467,7 +467,7 @@ namespace ts {
467467
public languageVariant: LanguageVariant;
468468
public identifiers: Map<string>;
469469
public nameTable: Map<number>;
470-
public resolvedModules: Map<ResolvedModule>;
470+
public resolvedModules: Map<ResolvedModuleFull>;
471471
public resolvedTypeReferenceDirectiveNames: Map<ResolvedTypeReferenceDirective>;
472472
public imports: LiteralExpression[];
473473
public moduleAugmentations: LiteralExpression[];

src/services/shims.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,7 @@ namespace ts {
316316
private loggingEnabled = false;
317317
private tracingEnabled = false;
318318

319-
public resolveModuleNames: (moduleName: string[], containingFile: string) => ResolvedModule[];
319+
public resolveModuleNames: (moduleName: string[], containingFile: string) => ResolvedModuleFull[];
320320
public resolveTypeReferenceDirectives: (typeDirectiveNames: string[], containingFile: string) => ResolvedTypeReferenceDirective[];
321321
public directoryExists: (directoryName: string) => boolean;
322322

0 commit comments

Comments
 (0)