Skip to content

Commit 09321b3

Browse files
author
Andy
authored
Convert Extension to a string enum (#16425)
1 parent 13b7d17 commit 09321b3

16 files changed

+55
-70
lines changed

src/compiler/core.ts

+11-25
Original file line numberDiff line numberDiff line change
@@ -2131,13 +2131,13 @@ namespace ts {
21312131
export function getScriptKindFromFileName(fileName: string): ScriptKind {
21322132
const ext = fileName.substr(fileName.lastIndexOf("."));
21332133
switch (ext.toLowerCase()) {
2134-
case ".js":
2134+
case Extension.Js:
21352135
return ScriptKind.JS;
2136-
case ".jsx":
2136+
case Extension.Jsx:
21372137
return ScriptKind.JSX;
2138-
case ".ts":
2138+
case Extension.Ts:
21392139
return ScriptKind.TS;
2140-
case ".tsx":
2140+
case Extension.Tsx:
21412141
return ScriptKind.TSX;
21422142
default:
21432143
return ScriptKind.Unknown;
@@ -2147,18 +2147,18 @@ namespace ts {
21472147
/**
21482148
* List of supported extensions in order of file resolution precedence.
21492149
*/
2150-
export const supportedTypeScriptExtensions = [".ts", ".tsx", ".d.ts"];
2150+
export const supportedTypeScriptExtensions = [Extension.Ts, Extension.Tsx, Extension.Dts];
21512151
/** Must have ".d.ts" first because if ".ts" goes first, that will be detected as the extension instead of ".d.ts". */
2152-
export const supportedTypescriptExtensionsForExtractExtension = [".d.ts", ".ts", ".tsx"];
2153-
export const supportedJavascriptExtensions = [".js", ".jsx"];
2152+
export const supportedTypescriptExtensionsForExtractExtension = [Extension.Dts, Extension.Ts, Extension.Tsx];
2153+
export const supportedJavascriptExtensions = [Extension.Js, Extension.Jsx];
21542154
const allSupportedExtensions = supportedTypeScriptExtensions.concat(supportedJavascriptExtensions);
21552155

21562156
export function getSupportedExtensions(options?: CompilerOptions, extraFileExtensions?: JsFileExtensionInfo[]): string[] {
21572157
const needAllExtensions = options && options.allowJs;
21582158
if (!extraFileExtensions || extraFileExtensions.length === 0 || !needAllExtensions) {
21592159
return needAllExtensions ? allSupportedExtensions : supportedTypeScriptExtensions;
21602160
}
2161-
const extensions = allSupportedExtensions.slice(0);
2161+
const extensions: string[] = allSupportedExtensions.slice(0);
21622162
for (const extInfo of extraFileExtensions) {
21632163
if (extensions.indexOf(extInfo.extension) === -1) {
21642164
extensions.push(extInfo.extension);
@@ -2237,7 +2237,7 @@ namespace ts {
22372237
}
22382238
}
22392239

2240-
const extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"];
2240+
const extensionsToRemove = [Extension.Dts, Extension.Ts, Extension.Js, Extension.Tsx, Extension.Jsx];
22412241
export function removeFileExtension(path: string): string {
22422242
for (const ext of extensionsToRemove) {
22432243
const extensionless = tryRemoveExtension(path, ext);
@@ -2491,7 +2491,7 @@ namespace ts {
24912491

24922492
/** True if an extension is one of the supported TypeScript extensions. */
24932493
export function extensionIsTypeScript(ext: Extension): boolean {
2494-
return ext <= Extension.LastTypeScriptExtension;
2494+
return ext === Extension.Ts || ext === Extension.Tsx || ext === Extension.Dts;
24952495
}
24962496

24972497
/**
@@ -2506,21 +2506,7 @@ namespace ts {
25062506
Debug.fail(`File ${path} has unknown extension.`);
25072507
}
25082508
export function tryGetExtensionFromPath(path: string): Extension | undefined {
2509-
if (fileExtensionIs(path, ".d.ts")) {
2510-
return Extension.Dts;
2511-
}
2512-
if (fileExtensionIs(path, ".ts")) {
2513-
return Extension.Ts;
2514-
}
2515-
if (fileExtensionIs(path, ".tsx")) {
2516-
return Extension.Tsx;
2517-
}
2518-
if (fileExtensionIs(path, ".js")) {
2519-
return Extension.Js;
2520-
}
2521-
if (fileExtensionIs(path, ".jsx")) {
2522-
return Extension.Jsx;
2523-
}
2509+
return find(supportedTypescriptExtensionsForExtractExtension, e => fileExtensionIs(path, e)) || find(supportedJavascriptExtensions, e => fileExtensionIs(path, e));
25242510
}
25252511

25262512
export function isCheckJsEnabledForFile(sourceFile: SourceFile, compilerOptions: CompilerOptions) {

src/compiler/moduleNameResolver.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -815,15 +815,15 @@ namespace ts {
815815

816816
switch (extensions) {
817817
case Extensions.DtsOnly:
818-
return tryExtension(".d.ts", Extension.Dts);
818+
return tryExtension(Extension.Dts);
819819
case Extensions.TypeScript:
820-
return tryExtension(".ts", Extension.Ts) || tryExtension(".tsx", Extension.Tsx) || tryExtension(".d.ts", Extension.Dts);
820+
return tryExtension(Extension.Ts) || tryExtension(Extension.Tsx) || tryExtension(Extension.Dts);
821821
case Extensions.JavaScript:
822-
return tryExtension(".js", Extension.Js) || tryExtension(".jsx", Extension.Jsx);
822+
return tryExtension(Extension.Js) || tryExtension(Extension.Jsx);
823823
}
824824

825-
function tryExtension(ext: string, extension: Extension): Resolved | undefined {
826-
const path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state);
825+
function tryExtension(extension: Extension): Resolved | undefined {
826+
const path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state);
827827
return path && { path, extension };
828828
}
829829
}

src/compiler/parser.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -764,7 +764,7 @@ namespace ts {
764764
sourceFile.languageVersion = languageVersion;
765765
sourceFile.fileName = normalizePath(fileName);
766766
sourceFile.languageVariant = getLanguageVariant(scriptKind);
767-
sourceFile.isDeclarationFile = fileExtensionIs(sourceFile.fileName, ".d.ts");
767+
sourceFile.isDeclarationFile = fileExtensionIs(sourceFile.fileName, Extension.Dts);
768768
sourceFile.scriptKind = scriptKind;
769769

770770
return sourceFile;

src/compiler/program.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1495,7 +1495,7 @@ namespace ts {
14951495
}
14961496

14971497
const sourceFileWithAddedExtension = forEach(supportedExtensions, extension => getSourceFile(fileName + extension));
1498-
if (fail && !sourceFileWithAddedExtension) fail(Diagnostics.File_0_not_found, fileName + ".ts");
1498+
if (fail && !sourceFileWithAddedExtension) fail(Diagnostics.File_0_not_found, fileName + Extension.Ts);
14991499
return sourceFileWithAddedExtension;
15001500
}
15011501
}

src/compiler/types.ts

+6-7
Original file line numberDiff line numberDiff line change
@@ -3881,13 +3881,12 @@ namespace ts {
38813881
extension: Extension;
38823882
}
38833883

3884-
export enum Extension {
3885-
Ts,
3886-
Tsx,
3887-
Dts,
3888-
Js,
3889-
Jsx,
3890-
LastTypeScriptExtension = Dts
3884+
export const enum Extension {
3885+
Ts = ".ts",
3886+
Tsx = ".tsx",
3887+
Dts = ".d.ts",
3888+
Js = ".js",
3889+
Jsx = ".jsx"
38913890
}
38923891

38933892
export interface ResolvedModuleWithFailedLookupLocations {

src/compiler/utilities.ts

+7-7
Original file line numberDiff line numberDiff line change
@@ -2501,7 +2501,7 @@ namespace ts {
25012501
const path = outputDir
25022502
? getSourceFilePathInNewDir(sourceFile, host, outputDir)
25032503
: sourceFile.fileName;
2504-
return removeFileExtension(path) + ".d.ts";
2504+
return removeFileExtension(path) + Extension.Dts;
25052505
}
25062506

25072507
export interface EmitFileNames {
@@ -2560,7 +2560,7 @@ namespace ts {
25602560
if (sourceFiles.length) {
25612561
const jsFilePath = options.outFile || options.out;
25622562
const sourceMapFilePath = getSourceMapFilePath(jsFilePath, options);
2563-
const declarationFilePath = options.declaration ? removeFileExtension(jsFilePath) + ".d.ts" : "";
2563+
const declarationFilePath = options.declaration ? removeFileExtension(jsFilePath) + Extension.Dts : "";
25642564
action({ jsFilePath, sourceMapFilePath, declarationFilePath }, createBundle(sourceFiles), emitOnlyDtsFiles);
25652565
}
25662566
}
@@ -2581,19 +2581,19 @@ namespace ts {
25812581
// JavaScript files are always LanguageVariant.JSX, as JSX syntax is allowed in .js files also.
25822582
// So for JavaScript files, '.jsx' is only emitted if the input was '.jsx', and JsxEmit.Preserve.
25832583
// For TypeScript, the only time to emit with a '.jsx' extension, is on JSX input, and JsxEmit.Preserve
2584-
function getOutputExtension(sourceFile: SourceFile, options: CompilerOptions): string {
2584+
function getOutputExtension(sourceFile: SourceFile, options: CompilerOptions): Extension {
25852585
if (options.jsx === JsxEmit.Preserve) {
25862586
if (isSourceFileJavaScript(sourceFile)) {
2587-
if (fileExtensionIs(sourceFile.fileName, ".jsx")) {
2588-
return ".jsx";
2587+
if (fileExtensionIs(sourceFile.fileName, Extension.Jsx)) {
2588+
return Extension.Jsx;
25892589
}
25902590
}
25912591
else if (sourceFile.languageVariant === LanguageVariant.JSX) {
25922592
// TypeScript source file preserving JSX syntax
2593-
return ".jsx";
2593+
return Extension.Jsx;
25942594
}
25952595
}
2596-
return ".js";
2596+
return Extension.Js;
25972597
}
25982598

25992599
export function getSourceFilePathInNewDir(sourceFile: SourceFile, host: EmitHost, newDirPath: string) {

src/harness/compilerRunner.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class CompilerBaselineRunner extends RunnerBase {
9090
}
9191

9292
lastUnit = units[units.length - 1];
93-
hasNonDtsFiles = ts.forEach(units, unit => !ts.fileExtensionIs(unit.name, ".d.ts"));
93+
hasNonDtsFiles = ts.forEach(units, unit => !ts.fileExtensionIs(unit.name, ts.Extension.Dts));
9494
// We need to assemble the list of input files for the compiler and other related files on the 'filesystem' (ie in a multi-file test)
9595
// If the last file in a test uses require or a triple slash reference we'll assume all other files will be brought in via references,
9696
// otherwise, assume all files are just meant to be in the same compilation session without explicit references to one another.

src/harness/fourslash.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1459,7 +1459,7 @@ namespace FourSlash {
14591459
let baselineFile = this.testData.globalOptions[metadataOptionNames.baselineFile];
14601460
if (!baselineFile) {
14611461
baselineFile = this.activeFile.fileName.replace(this.basePath + "/breakpointValidation", "bpSpan");
1462-
baselineFile = baselineFile.replace(".ts", ".baseline");
1462+
baselineFile = baselineFile.replace(ts.Extension.Ts, ".baseline");
14631463

14641464
}
14651465
Harness.Baseline.runBaseline(
@@ -1529,7 +1529,7 @@ namespace FourSlash {
15291529
public baselineQuickInfo() {
15301530
let baselineFile = this.testData.globalOptions[metadataOptionNames.baselineFile];
15311531
if (!baselineFile) {
1532-
baselineFile = ts.getBaseFileName(this.activeFile.fileName).replace(".ts", ".baseline");
1532+
baselineFile = ts.getBaseFileName(this.activeFile.fileName).replace(ts.Extension.Ts, ".baseline");
15331533
}
15341534

15351535
Harness.Baseline.runBaseline(

src/harness/harness.ts

+9-9
Original file line numberDiff line numberDiff line change
@@ -1249,7 +1249,7 @@ namespace Harness {
12491249
sourceFileName = outFile;
12501250
}
12511251

1252-
const dTsFileName = ts.removeFileExtension(sourceFileName) + ".d.ts";
1252+
const dTsFileName = ts.removeFileExtension(sourceFileName) + ts.Extension.Dts;
12531253

12541254
return ts.forEach(result.declFilesCode, declFile => declFile.fileName === dTsFileName ? declFile : undefined);
12551255
}
@@ -1465,7 +1465,7 @@ namespace Harness {
14651465
// When calling this function from rwc-runner, the baselinePath will have no extension.
14661466
// As rwc test- file is stored in json which ".json" will get stripped off.
14671467
// When calling this function from compiler-runner, the baselinePath will then has either ".ts" or ".tsx" extension
1468-
const outputFileName = ts.endsWith(baselinePath, ".ts") || ts.endsWith(baselinePath, ".tsx") ?
1468+
const outputFileName = ts.endsWith(baselinePath, ts.Extension.Ts) || ts.endsWith(baselinePath, ts.Extension.Tsx) ?
14691469
baselinePath.replace(/\.tsx?/, fullExtension) : baselinePath.concat(fullExtension);
14701470
Harness.Baseline.runBaseline(outputFileName, () => fullBaseLine, opts);
14711471
}
@@ -1563,7 +1563,7 @@ namespace Harness {
15631563
}
15641564

15651565
// check js output
1566-
Harness.Baseline.runBaseline(baselinePath.replace(/\.tsx?/, ".js"), () => {
1566+
Harness.Baseline.runBaseline(baselinePath.replace(/\.tsx?/, ts.Extension.Js), () => {
15671567
let tsCode = "";
15681568
const tsSources = otherFiles.concat(toBeCompiled);
15691569
if (tsSources.length > 1) {
@@ -1651,22 +1651,22 @@ namespace Harness {
16511651
}
16521652

16531653
export function isTS(fileName: string) {
1654-
return ts.endsWith(fileName, ".ts");
1654+
return ts.endsWith(fileName, ts.Extension.Ts);
16551655
}
16561656

16571657
export function isTSX(fileName: string) {
1658-
return ts.endsWith(fileName, ".tsx");
1658+
return ts.endsWith(fileName, ts.Extension.Tsx);
16591659
}
16601660

16611661
export function isDTS(fileName: string) {
1662-
return ts.endsWith(fileName, ".d.ts");
1662+
return ts.endsWith(fileName, ts.Extension.Dts);
16631663
}
16641664

16651665
export function isJS(fileName: string) {
1666-
return ts.endsWith(fileName, ".js");
1666+
return ts.endsWith(fileName, ts.Extension.Js);
16671667
}
16681668
export function isJSX(fileName: string) {
1669-
return ts.endsWith(fileName, ".jsx");
1669+
return ts.endsWith(fileName, ts.Extension.Jsx);
16701670
}
16711671

16721672
export function isJSMap(fileName: string) {
@@ -1973,7 +1973,7 @@ namespace Harness {
19731973
export function isDefaultLibraryFile(filePath: string): boolean {
19741974
// We need to make sure that the filePath is prefixed with "lib." not just containing "lib." and end with ".d.ts"
19751975
const fileName = ts.getBaseFileName(ts.normalizeSlashes(filePath));
1976-
return ts.startsWith(fileName, "lib.") && ts.endsWith(fileName, ".d.ts");
1976+
return ts.startsWith(fileName, "lib.") && ts.endsWith(fileName, ts.Extension.Dts);
19771977
}
19781978

19791979
export function isBuiltFile(filePath: string): boolean {

src/harness/projectsRunner.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,8 @@ class ProjectRunner extends RunnerBase {
325325
// we need to instead create files that can live in the project reference folder
326326
// but make sure extension of these files matches with the fileName the compiler asked to write
327327
diskRelativeName = "diskFile" + nonSubfolderDiskFiles +
328-
(Harness.Compiler.isDTS(fileName) ? ".d.ts" :
329-
Harness.Compiler.isJS(fileName) ? ".js" : ".js.map");
328+
(Harness.Compiler.isDTS(fileName) ? ts.Extension.Dts :
329+
Harness.Compiler.isJS(fileName) ? ts.Extension.Js : ".js.map");
330330
nonSubfolderDiskFiles++;
331331
}
332332

@@ -386,14 +386,14 @@ class ProjectRunner extends RunnerBase {
386386
emitOutputFilePathWithoutExtension = ts.removeFileExtension(sourceFile.fileName);
387387
}
388388

389-
const outputDtsFileName = emitOutputFilePathWithoutExtension + ".d.ts";
389+
const outputDtsFileName = emitOutputFilePathWithoutExtension + ts.Extension.Dts;
390390
const file = findOutputDtsFile(outputDtsFileName);
391391
if (file) {
392392
allInputFiles.unshift(file);
393393
}
394394
}
395395
else {
396-
const outputDtsFileName = ts.removeFileExtension(compilerOptions.outFile || compilerOptions.out) + ".d.ts";
396+
const outputDtsFileName = ts.removeFileExtension(compilerOptions.outFile || compilerOptions.out) + ts.Extension.Dts;
397397
const outputDtsFile = findOutputDtsFile(outputDtsFileName);
398398
if (!ts.contains(allInputFiles, outputDtsFile)) {
399399
allInputFiles.unshift(outputDtsFile);

src/harness/unittests/compileOnSave.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -513,7 +513,7 @@ namespace ts.projectSystem {
513513
const lines = ["var x = 1;", "var y = 2;"];
514514
const path = "/a/app";
515515
const f = {
516-
path: path + ".ts",
516+
path: path + ts.Extension.Ts,
517517
content: lines.join(newLine)
518518
};
519519
const host = createServerHost([f], { newLine });
@@ -530,7 +530,7 @@ namespace ts.projectSystem {
530530
command: "compileOnSaveEmitFile",
531531
arguments: { file: f.path }
532532
});
533-
const emitOutput = host.readFile(path + ".js");
533+
const emitOutput = host.readFile(path + ts.Extension.Js);
534534
assert.equal(emitOutput, f.content + newLine, "content of emit output should be identical with the input + newline");
535535
}
536536
});

src/harness/unittests/moduleResolution.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ namespace ts {
55
if (!expected === !actual) {
66
if (expected) {
77
assert.isTrue(expected.resolvedFileName === actual.resolvedFileName, `'resolvedFileName': expected '${expected.resolvedFileName}' to be equal to '${actual.resolvedFileName}'`);
8-
assert.isTrue(expected.extension === actual.extension, `'ext': expected '${Extension[expected.extension]}' to be equal to '${Extension[actual.extension]}'`);
8+
assert.isTrue(expected.extension === actual.extension, `'ext': expected '${expected.extension}' to be equal to '${actual.extension}'`);
99
assert.isTrue(expected.isExternalLibraryImport === actual.isExternalLibraryImport, `'isExternalLibraryImport': expected '${expected.isExternalLibraryImport}' to be equal to '${actual.isExternalLibraryImport}'`);
1010
}
1111
return true;

src/harness/unittests/transpile.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ namespace ts {
3636

3737
transpileOptions.reportDiagnostics = true;
3838

39-
justName = "transpile/" + name.replace(/[^a-z0-9\-. ]/ig, "") + (transpileOptions.compilerOptions.jsx ? ".tsx" : ".ts");
39+
justName = "transpile/" + name.replace(/[^a-z0-9\-. ]/ig, "") + (transpileOptions.compilerOptions.jsx ? Extension.Tsx : Extension.Ts);
4040
toBeCompiled = [{
4141
unitName: transpileOptions.fileName,
4242
content: input
@@ -88,7 +88,7 @@ namespace ts {
8888
}
8989

9090
it("Correct output for " + justName, () => {
91-
Harness.Baseline.runBaseline(justName.replace(/\.tsx?$/, ".js"), () => {
91+
Harness.Baseline.runBaseline(justName.replace(/\.tsx?$/, ts.Extension.Js), () => {
9292
if (transpileResult.outputText) {
9393
return transpileResult.outputText;
9494
}

src/server/project.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ namespace ts.server {
2525
result.jsx += 1;
2626
break;
2727
case ScriptKind.TS:
28-
fileExtensionIs(info.fileName, ".d.ts")
28+
fileExtensionIs(info.fileName, Extension.Dts)
2929
? result.dts += 1
3030
: result.ts += 1;
3131
break;

src/server/session.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1569,7 +1569,7 @@ namespace ts.server {
15691569
else {
15701570
const info = this.projectService.getScriptInfo(fileNameInProject);
15711571
if (!info.isScriptOpen()) {
1572-
if (fileNameInProject.indexOf(".d.ts") > 0) {
1572+
if (fileNameInProject.indexOf(Extension.Dts) > 0) {
15731573
veryLowPriorityFiles.push(fileNameInProject);
15741574
}
15751575
else {

src/services/navigateTo.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ namespace ts.NavigateTo {
1010
for (const sourceFile of sourceFiles) {
1111
cancellationToken.throwIfCancellationRequested();
1212

13-
if (excludeDtsFiles && fileExtensionIs(sourceFile.fileName, ".d.ts")) {
13+
if (excludeDtsFiles && fileExtensionIs(sourceFile.fileName, Extension.Dts)) {
1414
continue;
1515
}
1616

0 commit comments

Comments
 (0)