From 45ba0ac3b91a1bc80cfa489b979599cef33f5392 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Mon, 16 Oct 2017 13:38:28 -0700 Subject: [PATCH 1/2] Set the scriptKind from the host configuration if present --- src/compiler/core.ts | 10 ++++++++++ src/compiler/program.ts | 6 ++++-- src/compiler/types.ts | 1 + src/server/editorServices.ts | 21 ++++++++++++++++++--- 4 files changed, 33 insertions(+), 5 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index 90dcc1ad5d..d794b81776 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -2691,6 +2691,16 @@ namespace ts { return find(supportedTypescriptExtensionsForExtractExtension, e => fileExtensionIs(path, e)) || find(supportedJavascriptExtensions, e => fileExtensionIs(path, e)); } + // Retrieves any string from the final "." onwards from a base file name. + // Unlike extensionFromPath, which throws an exception on unrecognized extensions. + export function getAnyExtensionFromPath(path: string): string | undefined { + const baseFileName = getBaseFileName(path); + const extensionIndex = baseFileName.lastIndexOf("."); + if (extensionIndex >= 0) { + return baseFileName.substring(extensionIndex); + } + } + export function isCheckJsEnabledForFile(sourceFile: SourceFile, compilerOptions: CompilerOptions) { return sourceFile.checkJsDirective ? sourceFile.checkJsDirective.enabled : compilerOptions.checkJs; } diff --git a/src/compiler/program.ts b/src/compiler/program.ts index b8c402dbb7..1d325983f5 100755 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1278,8 +1278,10 @@ namespace ts { const typeChecker = getDiagnosticsProducingTypeChecker(); Debug.assert(!!sourceFile.bindDiagnostics); - // For JavaScript files, we don't want to report semantic errors unless explicitly requested. - const includeBindAndCheckDiagnostics = !isSourceFileJavaScript(sourceFile) || isCheckJsEnabledForFile(sourceFile, options); + + // By default, only type-check .ts, .tsx, and 'External' files (external files are added by plugins) + const includeBindAndCheckDiagnostics = sourceFile.scriptKind === ScriptKind.TS || sourceFile.scriptKind === ScriptKind.TSX || + sourceFile.scriptKind === ScriptKind.External || isCheckJsEnabledForFile(sourceFile, options); const bindDiagnostics = includeBindAndCheckDiagnostics ? sourceFile.bindDiagnostics : emptyArray; const checkDiagnostics = includeBindAndCheckDiagnostics ? typeChecker.getDiagnostics(sourceFile, cancellationToken) : emptyArray; const fileProcessingDiagnosticsInFile = fileProcessingDiagnostics.getDiagnostics(sourceFile.fileName); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 6226e4f98c..3f9b492f90 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -3626,6 +3626,7 @@ namespace ts { export interface JsFileExtensionInfo { extension: string; isMixedContent: boolean; + scriptKind?: ScriptKind; } export interface DiagnosticMessage { diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 70598313a7..ad08cd63da 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -220,13 +220,28 @@ namespace ts.server { interface FilePropertyReader { getFileName(f: T): string; - getScriptKind(f: T): ScriptKind; + getScriptKind(f: T, extraFileExtensions?: JsFileExtensionInfo[]): ScriptKind; hasMixedContent(f: T, extraFileExtensions: JsFileExtensionInfo[]): boolean; } const fileNamePropertyReader: FilePropertyReader = { getFileName: x => x, - getScriptKind: _ => undefined, + getScriptKind: (fileName, extraFileExtensions) => { + let result: ScriptKind; + if (extraFileExtensions) { + const fileExtension = getAnyExtensionFromPath(fileName); + if (fileExtension) { + some(extraFileExtensions, info => { + if (info.extension === fileExtension) { + result = info.scriptKind; + return true; + } + return false; + }); + } + } + return result; + }, hasMixedContent: (fileName, extraFileExtensions) => some(extraFileExtensions, ext => ext.isMixedContent && fileExtensionIs(fileName, ext.extension)), }; @@ -1504,7 +1519,7 @@ namespace ts.server { scriptInfo = normalizedPath; } else { - const scriptKind = propertyReader.getScriptKind(f); + const scriptKind = propertyReader.getScriptKind(f, this.hostConfiguration.extraFileExtensions); const hasMixedContent = propertyReader.hasMixedContent(f, this.hostConfiguration.extraFileExtensions); scriptInfo = this.getOrCreateScriptInfoNotOpenedByClientForNormalizedPath(normalizedPath, scriptKind, hasMixedContent, project.directoryStructureHost); path = scriptInfo.path; From 9da745d37ba757026f0847ef3d6942a259a87ee7 Mon Sep 17 00:00:00 2001 From: Bill Ticehurst Date: Tue, 17 Oct 2017 16:50:32 -0700 Subject: [PATCH 2/2] Update API baselines --- tests/baselines/reference/api/tsserverlibrary.d.ts | 1 + tests/baselines/reference/api/typescript.d.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index 15eca3da32..52132ae832 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -2158,6 +2158,7 @@ declare namespace ts { interface JsFileExtensionInfo { extension: string; isMixedContent: boolean; + scriptKind?: ScriptKind; } interface DiagnosticMessage { key: string; diff --git a/tests/baselines/reference/api/typescript.d.ts b/tests/baselines/reference/api/typescript.d.ts index f3180b9d10..976d50942a 100644 --- a/tests/baselines/reference/api/typescript.d.ts +++ b/tests/baselines/reference/api/typescript.d.ts @@ -2158,6 +2158,7 @@ declare namespace ts { interface JsFileExtensionInfo { extension: string; isMixedContent: boolean; + scriptKind?: ScriptKind; } interface DiagnosticMessage { key: string;