Skip to content

Commit de40000

Browse files
authored
switch FileExtensionInfo to always mean .js file and deduplicate entries in getSupportedExtensions (microsoft#14046)
* - switch FileExtensionInfo to always mean .js file - deduplicate entries in getSupportedExtensions * (PR feedback): updated comment
1 parent 7cd0e1a commit de40000

File tree

6 files changed

+56
-24
lines changed

6 files changed

+56
-24
lines changed

src/compiler/commandLineParser.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -840,7 +840,7 @@ namespace ts {
840840
* @param basePath A root directory to resolve relative path entries in the config
841841
* file to. e.g. outDir
842842
*/
843-
export function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions: CompilerOptions = {}, configFileName?: string, resolutionStack: Path[] = [], extraFileExtensions: FileExtensionInfo[] = []): ParsedCommandLine {
843+
export function parseJsonConfigFileContent(json: any, host: ParseConfigHost, basePath: string, existingOptions: CompilerOptions = {}, configFileName?: string, resolutionStack: Path[] = [], extraFileExtensions: JsFileExtensionInfo[] = []): ParsedCommandLine {
844844
const errors: Diagnostic[] = [];
845845
basePath = normalizeSlashes(basePath);
846846
const getCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames);
@@ -1186,7 +1186,7 @@ namespace ts {
11861186
* @param host The host used to resolve files and directories.
11871187
* @param errors An array for diagnostic reporting.
11881188
*/
1189-
function matchFileNames(fileNames: string[], include: string[], exclude: string[], basePath: string, options: CompilerOptions, host: ParseConfigHost, errors: Diagnostic[], extraFileExtensions: FileExtensionInfo[]): ExpandResult {
1189+
function matchFileNames(fileNames: string[], include: string[], exclude: string[], basePath: string, options: CompilerOptions, host: ParseConfigHost, errors: Diagnostic[], extraFileExtensions: JsFileExtensionInfo[]): ExpandResult {
11901190
basePath = normalizePath(basePath);
11911191

11921192
// The exclude spec list is converted into a regular expression, which allows us to quickly
@@ -1361,7 +1361,7 @@ namespace ts {
13611361
*/
13621362
function hasFileWithHigherPriorityExtension(file: string, literalFiles: Map<string>, wildcardFiles: Map<string>, extensions: string[], keyMapper: (value: string) => string) {
13631363
const extensionPriority = getExtensionPriority(file, extensions);
1364-
const adjustedExtensionPriority = adjustExtensionPriority(extensionPriority);
1364+
const adjustedExtensionPriority = adjustExtensionPriority(extensionPriority, extensions);
13651365
for (let i = ExtensionPriority.Highest; i < adjustedExtensionPriority; i++) {
13661366
const higherPriorityExtension = extensions[i];
13671367
const higherPriorityPath = keyMapper(changeExtension(file, higherPriorityExtension));
@@ -1383,7 +1383,7 @@ namespace ts {
13831383
*/
13841384
function removeWildcardFilesWithLowerPriorityExtension(file: string, wildcardFiles: Map<string>, extensions: string[], keyMapper: (value: string) => string) {
13851385
const extensionPriority = getExtensionPriority(file, extensions);
1386-
const nextExtensionPriority = getNextLowestExtensionPriority(extensionPriority);
1386+
const nextExtensionPriority = getNextLowestExtensionPriority(extensionPriority, extensions);
13871387
for (let i = nextExtensionPriority; i < extensions.length; i++) {
13881388
const lowerPriorityExtension = extensions[i];
13891389
const lowerPriorityPath = keyMapper(changeExtension(file, lowerPriorityExtension));

src/compiler/core.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2020,14 +2020,14 @@ namespace ts {
20202020
export const supportedJavascriptExtensions = [".js", ".jsx"];
20212021
const allSupportedExtensions = supportedTypeScriptExtensions.concat(supportedJavascriptExtensions);
20222022

2023-
export function getSupportedExtensions(options?: CompilerOptions, extraFileExtensions?: FileExtensionInfo[]): string[] {
2023+
export function getSupportedExtensions(options?: CompilerOptions, extraFileExtensions?: JsFileExtensionInfo[]): string[] {
20242024
const needAllExtensions = options && options.allowJs;
2025-
if (!extraFileExtensions || extraFileExtensions.length === 0) {
2025+
if (!extraFileExtensions || extraFileExtensions.length === 0 || !needAllExtensions) {
20262026
return needAllExtensions ? allSupportedExtensions : supportedTypeScriptExtensions;
20272027
}
2028-
const extensions = (needAllExtensions ? allSupportedExtensions : supportedTypeScriptExtensions).slice(0);
2028+
const extensions = allSupportedExtensions.slice(0);
20292029
for (const extInfo of extraFileExtensions) {
2030-
if (needAllExtensions || extInfo.scriptKind === ScriptKind.TS) {
2030+
if (extensions.indexOf(extInfo.extension) === -1) {
20312031
extensions.push(extInfo.extension);
20322032
}
20332033
}
@@ -2042,7 +2042,7 @@ namespace ts {
20422042
return forEach(supportedTypeScriptExtensions, extension => fileExtensionIs(fileName, extension));
20432043
}
20442044

2045-
export function isSupportedSourceFileName(fileName: string, compilerOptions?: CompilerOptions, extraFileExtensions?: FileExtensionInfo[]) {
2045+
export function isSupportedSourceFileName(fileName: string, compilerOptions?: CompilerOptions, extraFileExtensions?: JsFileExtensionInfo[]) {
20462046
if (!fileName) { return false; }
20472047

20482048
for (const extension of getSupportedExtensions(compilerOptions, extraFileExtensions)) {
@@ -2061,7 +2061,6 @@ namespace ts {
20612061
export const enum ExtensionPriority {
20622062
TypeScriptFiles = 0,
20632063
DeclarationAndJavaScriptFiles = 2,
2064-
Limit = 5,
20652064

20662065
Highest = TypeScriptFiles,
20672066
Lowest = DeclarationAndJavaScriptFiles,
@@ -2070,7 +2069,7 @@ namespace ts {
20702069
export function getExtensionPriority(path: string, supportedExtensions: string[]): ExtensionPriority {
20712070
for (let i = supportedExtensions.length - 1; i >= 0; i--) {
20722071
if (fileExtensionIs(path, supportedExtensions[i])) {
2073-
return adjustExtensionPriority(<ExtensionPriority>i);
2072+
return adjustExtensionPriority(<ExtensionPriority>i, supportedExtensions);
20742073
}
20752074
}
20762075

@@ -2082,27 +2081,26 @@ namespace ts {
20822081
/**
20832082
* Adjusts an extension priority to be the highest priority within the same range.
20842083
*/
2085-
export function adjustExtensionPriority(extensionPriority: ExtensionPriority): ExtensionPriority {
2084+
export function adjustExtensionPriority(extensionPriority: ExtensionPriority, supportedExtensions: string[]): ExtensionPriority {
20862085
if (extensionPriority < ExtensionPriority.DeclarationAndJavaScriptFiles) {
20872086
return ExtensionPriority.TypeScriptFiles;
20882087
}
2089-
else if (extensionPriority < ExtensionPriority.Limit) {
2088+
else if (extensionPriority < supportedExtensions.length) {
20902089
return ExtensionPriority.DeclarationAndJavaScriptFiles;
20912090
}
20922091
else {
2093-
return ExtensionPriority.Limit;
2094-
}
2095-
}
2092+
return supportedExtensions.length;
2093+
} }
20962094

20972095
/**
20982096
* Gets the next lowest extension priority for a given priority.
20992097
*/
2100-
export function getNextLowestExtensionPriority(extensionPriority: ExtensionPriority): ExtensionPriority {
2098+
export function getNextLowestExtensionPriority(extensionPriority: ExtensionPriority, supportedExtensions: string[]): ExtensionPriority {
21012099
if (extensionPriority < ExtensionPriority.DeclarationAndJavaScriptFiles) {
21022100
return ExtensionPriority.DeclarationAndJavaScriptFiles;
21032101
}
21042102
else {
2105-
return ExtensionPriority.Limit;
2103+
return supportedExtensions.length;
21062104
}
21072105
}
21082106

src/compiler/types.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3153,9 +3153,8 @@
31533153
ThisProperty
31543154
}
31553155

3156-
export interface FileExtensionInfo {
3156+
export interface JsFileExtensionInfo {
31573157
extension: string;
3158-
scriptKind: ScriptKind;
31593158
isMixedContent: boolean;
31603159
}
31613160

src/harness/unittests/tsserverProjectSystem.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1589,6 +1589,41 @@ namespace ts.projectSystem {
15891589
checkProjectActualFiles(projectService.inferredProjects[1], [file2.path]);
15901590
});
15911591

1592+
it ("loading files with correct priority", () => {
1593+
const f1 = {
1594+
path: "/a/main.ts",
1595+
content: "let x = 1"
1596+
};
1597+
const f2 = {
1598+
path: "/a/main.js",
1599+
content: "var y = 1"
1600+
};
1601+
const config = {
1602+
path: "/a/tsconfig.json",
1603+
content: JSON.stringify({
1604+
compilerOptions: { allowJs: true }
1605+
})
1606+
};
1607+
const host = createServerHost([f1, f2, config]);
1608+
const projectService = createProjectService(host);
1609+
projectService.setHostConfiguration({
1610+
extraFileExtensions: [
1611+
{ extension: ".js", isMixedContent: false },
1612+
{ extension: ".html", isMixedContent: true }
1613+
]
1614+
});
1615+
projectService.openClientFile(f1.path);
1616+
projectService.checkNumberOfProjects({ configuredProjects: 1 });
1617+
checkProjectActualFiles(projectService.configuredProjects[0], [ f1.path ]);
1618+
1619+
projectService.closeClientFile(f1.path);
1620+
1621+
projectService.openClientFile(f2.path);
1622+
projectService.checkNumberOfProjects({ configuredProjects: 1, inferredProjects: 1 });
1623+
checkProjectActualFiles(projectService.configuredProjects[0], [ f1.path ]);
1624+
checkProjectActualFiles(projectService.inferredProjects[0], [ f2.path ]);
1625+
});
1626+
15921627
it("tsconfig script block support", () => {
15931628
const file1 = {
15941629
path: "/a/b/f1.ts",

src/server/editorServices.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ namespace ts.server {
107107
export interface HostConfiguration {
108108
formatCodeOptions: FormatCodeSettings;
109109
hostInfo: string;
110-
extraFileExtensions?: FileExtensionInfo[];
110+
extraFileExtensions?: JsFileExtensionInfo[];
111111
}
112112

113113
interface ConfigFileConversionResult {
@@ -132,7 +132,7 @@ namespace ts.server {
132132
interface FilePropertyReader<T> {
133133
getFileName(f: T): string;
134134
getScriptKind(f: T): ScriptKind;
135-
hasMixedContent(f: T, extraFileExtensions: FileExtensionInfo[]): boolean;
135+
hasMixedContent(f: T, extraFileExtensions: JsFileExtensionInfo[]): boolean;
136136
}
137137

138138
const fileNamePropertyReader: FilePropertyReader<string> = {

src/server/protocol.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,9 +1001,9 @@ namespace ts.server.protocol {
10011001
formatOptions?: FormatCodeSettings;
10021002

10031003
/**
1004-
* The host's additional supported file extensions
1004+
* The host's additional supported .js file extensions
10051005
*/
1006-
extraFileExtensions?: FileExtensionInfo[];
1006+
extraFileExtensions?: JsFileExtensionInfo[];
10071007
}
10081008

10091009
/**

0 commit comments

Comments
 (0)