diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index d1041e55d0e..8916c2d4189 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -46,7 +46,6 @@ namespace ts { } onProjectClosed(p: server.Project) { - } attach(projectService: server.ProjectService) { @@ -114,6 +113,32 @@ namespace ts { fileOrFolderList); } + interface CreateProjectServiceParameters { + cancellationToken?: HostCancellationToken; + logger?: server.Logger; + useSingleInferredProject?: boolean; + typingsInstaller?: server.ITypingsInstaller; + eventHandler?: server.ProjectServiceEventHandler; + } + + + class TestProjectService extends server.ProjectService { + constructor(host: server.ServerHost, logger: server.Logger, cancellationToken: HostCancellationToken, useSingleInferredProject: boolean, + typingsInstaller: server.ITypingsInstaller, eventHandler: server.ProjectServiceEventHandler) { + super(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, eventHandler); + } + + checkNumberOfProjects(count: { inferredProjects?: number, configuredProjects?: number, externalProjects?: number }) { + checkNumberOfProjects(this, count); + } + } + function createProjectService(host: server.ServerHost, parameters: CreateProjectServiceParameters = {}) { + const cancellationToken = parameters.cancellationToken || nullCancellationToken; + const logger = parameters.logger || nullLogger; + const useSingleInferredProject = parameters.useSingleInferredProject !== undefined ? parameters.useSingleInferredProject : false; + return new TestProjectService(host, logger, cancellationToken, useSingleInferredProject, parameters.typingsInstaller, parameters.eventHandler); + } + interface FileOrFolder { path: string; content?: string; @@ -495,7 +520,7 @@ namespace ts { content: `export let x: number` }; const host = createServerHost([appFile, moduleFile, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); const { configFileName } = projectService.openClientFile(appFile.path); assert(!configFileName, `should not find config, got: '${configFileName}`); @@ -533,7 +558,7 @@ namespace ts { }; const host = createServerHost([configFile, libFile, file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); const { configFileName, configFileErrors } = projectService.openClientFile(file1.path); assert(configFileName, "should find config file"); @@ -560,7 +585,7 @@ namespace ts { const host = createServerHost(filesWithoutConfig); const filesWithConfig = [libFile, commonFile1, commonFile2, configFile]; - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); projectService.openClientFile(commonFile2.path); @@ -591,7 +616,7 @@ namespace ts { content: `{}` }; const host = createServerHost([commonFile1, libFile, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); checkWatchedDirectories(host, ["/a/b"]); checkNumberOfConfiguredProjects(projectService, 1); @@ -619,7 +644,7 @@ namespace ts { }` }; const host = createServerHost([commonFile1, commonFile2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); projectService.openClientFile(commonFile2.path); @@ -635,7 +660,7 @@ namespace ts { content: `{}` }; const host = createServerHost([commonFile1, commonFile2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -665,7 +690,7 @@ namespace ts { }; const files = [commonFile1, commonFile2, configFile]; const host = createServerHost(files); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); const project = projectService.configuredProjects[0]; @@ -698,7 +723,7 @@ namespace ts { }; const host = createServerHost([commonFile1, commonFile2, excludedFile1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(commonFile1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -732,7 +757,7 @@ namespace ts { }; const files = [file1, nodeModuleFile, classicModuleFile, configFile]; const host = createServerHost(files); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); projectService.openClientFile(nodeModuleFile.path); projectService.openClientFile(classicModuleFile.path); @@ -773,7 +798,7 @@ namespace ts { }` }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); projectService.closeClientFile(file1.path); projectService.openClientFile(file2.path); @@ -800,7 +825,7 @@ namespace ts { }` }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); projectService.closeClientFile(file1.path); projectService.openClientFile(file2.path); @@ -833,7 +858,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host, { useSingleInferredProject: true }); projectService.openClientFile(file1.path); projectService.openClientFile(file2.path); projectService.openClientFile(file3.path); @@ -866,7 +891,7 @@ namespace ts { }` }; const host = createServerHost([file1, configFile, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host, { useSingleInferredProject: true }); projectService.openClientFile(file1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -885,7 +910,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openExternalProject({ rootFiles: toExternalFiles([file1.path, file2.path]), options: {}, @@ -943,7 +968,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, file2, file3, config1, config2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openExternalProject({ rootFiles: toExternalFiles([config1.path, config2.path, file3.path]), options: {}, @@ -981,7 +1006,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1012,7 +1037,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1047,7 +1072,7 @@ namespace ts { content: `export let y = 1;` }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); @@ -1084,7 +1109,7 @@ namespace ts { content: `export let y = 1;` }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); @@ -1123,7 +1148,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { inferredProjects: 1 }); @@ -1156,7 +1181,7 @@ namespace ts { content: "export let y = 1;" }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file2.path); checkNumberOfProjects(projectService, { inferredProjects: 1 }); @@ -1191,7 +1216,7 @@ namespace ts { }; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1222,7 +1247,7 @@ namespace ts { }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1255,7 +1280,7 @@ namespace ts { }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1283,7 +1308,7 @@ namespace ts { content: "let y = 1" }; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openExternalProject({ projectFileName: "project", options: {}, rootFiles: toExternalFiles([file1.path]) }); checkNumberOfProjects(projectService, { externalProjects: 1 }); @@ -1309,7 +1334,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openExternalProject({ projectFileName: "project", options: { moduleResolution: ModuleResolutionKind.NodeJs }, rootFiles: toExternalFiles([file1.path, file2.path]) }); checkNumberOfProjects(projectService, { externalProjects: 1 }); @@ -1336,7 +1361,7 @@ namespace ts { content: JSON.stringify({ compilerOptions: {} }) }; const host = createServerHost([file1, file2, config]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1364,7 +1389,7 @@ namespace ts { content: "export let x = 1" }; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); + const projectService = createProjectService(host); projectService.openClientFile(file1.path); projectService.openClientFile(file2.path); @@ -1389,7 +1414,7 @@ namespace ts { content: `