diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 0b8d0cedea1..01b74f56973 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -918,7 +918,7 @@ namespace Harness.LanguageService { const proxy = makeDefaultProxy(info); proxy.getSemanticDiagnostics = filename => { const prev = info.languageService.getSemanticDiagnostics(filename); - const sourceFile: ts.SourceFile = info.project.getSourceFile(ts.toPath(filename, /*basePath*/ undefined, ts.createGetCanonicalFileName(info.serverHost.useCaseSensitiveFileNames)))!; + const sourceFile: ts.SourceFile = info.project.getSourceFile(ts.toPath(filename, /*basePath*/ undefined, ts.createGetCanonicalFileName(info.fsHost.useCaseSensitiveFileNames)))!; prev.push({ category: ts.DiagnosticCategory.Warning, file: sourceFile, @@ -945,7 +945,7 @@ namespace Harness.LanguageService { const proxy = makeDefaultProxy(info); proxy.getSemanticDiagnostics = filename => { const prev = info.languageService.getSemanticDiagnostics(filename); - const sourceFile: ts.SourceFile = info.project.getSourceFile(ts.toPath(filename, /*basePath*/ undefined, ts.createGetCanonicalFileName(info.serverHost.useCaseSensitiveFileNames)))!; + const sourceFile: ts.SourceFile = info.project.getSourceFile(ts.toPath(filename, /*basePath*/ undefined, ts.createGetCanonicalFileName(info.fsHost.useCaseSensitiveFileNames)))!; prev.push({ category: ts.DiagnosticCategory.Error, file: sourceFile, diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index f37329f2000..2e1ae4b702e 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -760,7 +760,7 @@ namespace ts.server { readonly currentDirectory: NormalizedPath; readonly toCanonicalFileName: (f: string) => string; - public readonly host: ServerHost; + public readonly host: RuntimeServerHost; public readonly fshost: FileServerHost; public readonly logger: Logger; public readonly cancellationToken: HostCancellationToken; @@ -808,7 +808,7 @@ namespace ts.server { constructor(opts: ProjectServiceOptions) { this.host = opts.host; - this.fshost = opts.fshost || this.host; + this.fshost = opts.fshost || (this.host as ServerHost); this.logger = opts.logger; this.cancellationToken = opts.cancellationToken; this.useSingleInferredProject = opts.useSingleInferredProject; diff --git a/src/server/project.ts b/src/server/project.ts index bd55843d6fa..91351448c7d 100644 --- a/src/server/project.ts +++ b/src/server/project.ts @@ -84,7 +84,7 @@ namespace ts.server { project: Project; languageService: LanguageService; languageServiceHost: LanguageServiceHost; - serverHost: ServerHost; + serverHost: RuntimeServerHost; fsHost: FileServerHost; session?: Session; config: any; @@ -234,8 +234,8 @@ namespace ts.server { return hasOneOrMoreJsAndNoTsFiles(this); } - public static resolveModule(moduleName: string, initialDir: string, host: ServerHost, log: (message: string) => void, logErrors?: (message: string) => void): {} | undefined { - const resolvedPath = normalizeSlashes(host.resolvePath(combinePaths(initialDir, "node_modules"))); + public static resolveModule(moduleName: string, initialDir: string, host: RuntimeServerHost, fshost: FileServerHost, log: (message: string) => void, logErrors?: (message: string) => void): {} | undefined { + const resolvedPath = normalizeSlashes(fshost.resolvePath(combinePaths(initialDir, "node_modules"))); log(`Loading ${moduleName} from ${initialDir} (resolved to ${resolvedPath})`); const result = host.require!(resolvedPath, moduleName); // TODO: GH#18217 if (result.error) { @@ -381,7 +381,7 @@ namespace ts.server { } getNewLine() { - return this.projectService.host.newLine; + return this.projectService.fshost.newLine; } getProjectVersion() { @@ -1608,7 +1608,7 @@ namespace ts.server { (errorLogs || (errorLogs = [])).push(message); }; const resolvedModule = firstDefined(searchPaths, searchPath => - Project.resolveModule(pluginConfigEntry.name, searchPath, this.projectService.host, log, logError) as PluginModuleFactory | undefined); + Project.resolveModule(pluginConfigEntry.name, searchPath, this.projectService.host, this.projectService.fshost, log, logError) as PluginModuleFactory | undefined); if (resolvedModule) { const configurationOverride = pluginConfigOverrides && pluginConfigOverrides.get(pluginConfigEntry.name); if (configurationOverride) { @@ -1998,7 +1998,7 @@ namespace ts.server { compilerOptions, /*compileOnSaveEnabled*/ false, /*watchOptions*/ undefined, - projectService.host, + projectService.fshost, /*currentDirectory*/ undefined); } diff --git a/src/server/types.ts b/src/server/types.ts index e398dc92f77..1badf968b3d 100644 --- a/src/server/types.ts +++ b/src/server/types.ts @@ -23,4 +23,5 @@ declare namespace ts.server { | "getDirectories" | "getCurrentDirectory" | "getExecutingFilePath" | "realpath" | "resolvePath" | "createDirectory" | "setModifiedTime" | "deleteFile" | "readDirectory" | "watchFile" | "watchDirectory" | "useCaseSensitiveFileNames" | "newLine">; + export type RuntimeServerHost = Omit } diff --git a/src/server/utilities.ts b/src/server/utilities.ts index c5a6489b667..547921fb742 100644 --- a/src/server/utilities.ts +++ b/src/server/utilities.ts @@ -3,7 +3,7 @@ namespace ts.server { export class ThrottledOperations { private readonly pendingTimeouts = new Map(); private readonly logger?: Logger | undefined; - constructor(private readonly host: ServerHost, logger: Logger) { + constructor(private readonly host: RuntimeServerHost, logger: Logger) { this.logger = logger.hasLevel(LogLevel.verbose) ? logger : undefined; } diff --git a/src/testRunner/unittests/tsserver/externalProjects.ts b/src/testRunner/unittests/tsserver/externalProjects.ts index 3bcb5789daa..7a6937a20c5 100644 --- a/src/testRunner/unittests/tsserver/externalProjects.ts +++ b/src/testRunner/unittests/tsserver/externalProjects.ts @@ -66,7 +66,7 @@ namespace ts.projectSystem { const proxy = Harness.LanguageService.makeDefaultProxy(info); proxy.getSemanticDiagnostics = filename => { const prev = info.languageService.getSemanticDiagnostics(filename); - const sourceFile: SourceFile = info.project.getSourceFile(toPath(filename, /*basePath*/ undefined, createGetCanonicalFileName(info.serverHost.useCaseSensitiveFileNames)))!; + const sourceFile: SourceFile = info.project.getSourceFile(toPath(filename, /*basePath*/ undefined, createGetCanonicalFileName(info.fsHost.useCaseSensitiveFileNames)))!; prev.push({ category: DiagnosticCategory.Warning, file: sourceFile, diff --git a/tests/baselines/reference/api/tsserverlibrary.d.ts b/tests/baselines/reference/api/tsserverlibrary.d.ts index fa864bdb710..8887ab13bb7 100644 --- a/tests/baselines/reference/api/tsserverlibrary.d.ts +++ b/tests/baselines/reference/api/tsserverlibrary.d.ts @@ -6986,6 +6986,7 @@ declare namespace ts.server { require?(initialPath: string, moduleName: string): RequireResult; } type FileServerHost = Pick; + type RuntimeServerHost = Omit; } declare namespace ts.server { enum LogLevel { @@ -9991,7 +9992,7 @@ declare namespace ts.server { project: Project; languageService: LanguageService; languageServiceHost: LanguageServiceHost; - serverHost: ServerHost; + serverHost: RuntimeServerHost; fsHost: FileServerHost; session?: Session; config: any; @@ -10057,7 +10058,7 @@ declare namespace ts.server { private readonly cancellationToken; isNonTsProject(): boolean; isJsOnlyProject(): boolean; - static resolveModule(moduleName: string, initialDir: string, host: ServerHost, log: (message: string) => void, logErrors?: (message: string) => void): {} | undefined; + static resolveModule(moduleName: string, initialDir: string, host: RuntimeServerHost, fshost: FileServerHost, log: (message: string) => void, logErrors?: (message: string) => void): {} | undefined; isKnownTypesPackageName(name: string): boolean; installPackage(options: InstallPackageOptions): Promise; private get typingsCache(); @@ -10442,7 +10443,7 @@ declare namespace ts.server { private pendingProjectUpdates; readonly currentDirectory: NormalizedPath; readonly toCanonicalFileName: (f: string) => string; - readonly host: ServerHost; + readonly host: RuntimeServerHost; readonly fshost: FileServerHost; readonly logger: Logger; readonly cancellationToken: HostCancellationToken;