Skip to content

Commit 45ba0ac

Browse files
committed
Set the scriptKind from the host configuration if present
1 parent 3220ebc commit 45ba0ac

File tree

4 files changed

+33
-5
lines changed

4 files changed

+33
-5
lines changed

src/compiler/core.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2691,6 +2691,16 @@ namespace ts {
26912691
return find<Extension>(supportedTypescriptExtensionsForExtractExtension, e => fileExtensionIs(path, e)) || find(supportedJavascriptExtensions, e => fileExtensionIs(path, e));
26922692
}
26932693

2694+
// Retrieves any string from the final "." onwards from a base file name.
2695+
// Unlike extensionFromPath, which throws an exception on unrecognized extensions.
2696+
export function getAnyExtensionFromPath(path: string): string | undefined {
2697+
const baseFileName = getBaseFileName(path);
2698+
const extensionIndex = baseFileName.lastIndexOf(".");
2699+
if (extensionIndex >= 0) {
2700+
return baseFileName.substring(extensionIndex);
2701+
}
2702+
}
2703+
26942704
export function isCheckJsEnabledForFile(sourceFile: SourceFile, compilerOptions: CompilerOptions) {
26952705
return sourceFile.checkJsDirective ? sourceFile.checkJsDirective.enabled : compilerOptions.checkJs;
26962706
}

src/compiler/program.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,8 +1278,10 @@ namespace ts {
12781278
const typeChecker = getDiagnosticsProducingTypeChecker();
12791279

12801280
Debug.assert(!!sourceFile.bindDiagnostics);
1281-
// For JavaScript files, we don't want to report semantic errors unless explicitly requested.
1282-
const includeBindAndCheckDiagnostics = !isSourceFileJavaScript(sourceFile) || isCheckJsEnabledForFile(sourceFile, options);
1281+
1282+
// By default, only type-check .ts, .tsx, and 'External' files (external files are added by plugins)
1283+
const includeBindAndCheckDiagnostics = sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX ||
1284+
sourceFile.scriptKind === ScriptKind.External || isCheckJsEnabledForFile(sourceFile, options);
12831285
const bindDiagnostics = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray;
12841286
const checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray;
12851287
const fileProcessingDiagnosticsInFile = fileProcessingDiagnostics.getDiagnostics(sourceFile.fileName);

src/compiler/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3626,6 +3626,7 @@ namespace ts {
36263626
export interface JsFileExtensionInfo {
36273627
extension: string;
36283628
isMixedContent: boolean;
3629+
scriptKind?: ScriptKind;
36293630
}
36303631

36313632
export interface DiagnosticMessage {

src/server/editorServices.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -220,13 +220,28 @@ namespace ts.server {
220220

221221
interface FilePropertyReader<T> {
222222
getFileName(f: T): string;
223-
getScriptKind(f: T): ScriptKind;
223+
getScriptKind(f: T, extraFileExtensions?: JsFileExtensionInfo[]): ScriptKind;
224224
hasMixedContent(f: T, extraFileExtensions: JsFileExtensionInfo[]): boolean;
225225
}
226226

227227
const fileNamePropertyReader: FilePropertyReader<string> = {
228228
getFileName: x => x,
229-
getScriptKind: _ => undefined,
229+
getScriptKind: (fileName, extraFileExtensions) => {
230+
let result: ScriptKind;
231+
if (extraFileExtensions) {
232+
const fileExtension = getAnyExtensionFromPath(fileName);
233+
if (fileExtension) {
234+
some(extraFileExtensions, info => {
235+
if (info.extension === fileExtension) {
236+
result = info.scriptKind;
237+
return true;
238+
}
239+
return false;
240+
});
241+
}
242+
}
243+
return result;
244+
},
230245
hasMixedContent: (fileName, extraFileExtensions) => some(extraFileExtensions, ext => ext.isMixedContent && fileExtensionIs(fileName, ext.extension)),
231246
};
232247

@@ -1504,7 +1519,7 @@ namespace ts.server {
15041519
scriptInfo = normalizedPath;
15051520
}
15061521
else {
1507-
const scriptKind = propertyReader.getScriptKind(f);
1522+
const scriptKind = propertyReader.getScriptKind(f, this.hostConfiguration.extraFileExtensions);
15081523
const hasMixedContent = propertyReader.hasMixedContent(f, this.hostConfiguration.extraFileExtensions);
15091524
scriptInfo = this.getOrCreateScriptInfoNotOpenedByClientForNormalizedPath(normalizedPath, scriptKind, hasMixedContent, project.directoryStructureHost);
15101525
path = scriptInfo.path;

0 commit comments

Comments
 (0)