From b1871a5bf99b507eec8c7d33faaf35847638f694 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 12 Aug 2016 14:01:23 -0700 Subject: [PATCH] [WIP] pass ITypingsInstaller to ProjectService --- Jakefile.js | 16 ++++- src/harness/harnessLanguageService.ts | 1 + .../unittests/cachingInServerLSHost.ts | 2 +- src/harness/unittests/session.ts | 6 +- .../unittests/tsserverProjectSystem.ts | 64 +++++++++---------- src/server/editorServices.ts | 2 + src/server/project.ts | 2 +- src/server/server.ts | 3 +- src/server/session.ts | 17 +---- src/server/types.d.ts | 37 +++++++++++ src/server/typingsCache.ts | 16 +++-- .../typingsInstaller/nodeTypingsInstaller.ts | 1 + src/server/typingsInstaller/tsconfig.json | 2 +- .../typingsInstaller/typingsInstaller.ts | 5 +- src/server/utilities.ts | 24 +------ 15 files changed, 113 insertions(+), 85 deletions(-) create mode 100644 src/server/types.d.ts diff --git a/Jakefile.js b/Jakefile.js index 7c620db00f4..8006a947105 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -11,6 +11,7 @@ var runTestsInParallel = require("./scripts/mocha-parallel").runTestsInParallel; var compilerDirectory = "src/compiler/"; var servicesDirectory = "src/services/"; var serverDirectory = "src/server/"; +var typingsInstallerDirectory = "src/server/typingsInstaller"; var harnessDirectory = "src/harness/"; var libraryDirectory = "src/lib/"; var scriptsDirectory = "scripts/"; @@ -102,6 +103,7 @@ var servicesSources = [ })); var serverCoreSources = [ + "types.d.ts", "utilities.ts", "scriptVersionCache.ts", "scriptInfo.ts", @@ -121,6 +123,14 @@ var cancellationTokenSources = [ return path.join(serverDirectory, f); }); +var typingsInstallerSources = [ + "../types.d.ts", + "typingsInstaller.ts", + "nodeTypingsInstaller.ts" +].map(function (f) { + return path.join(typingsInstallerDirectory, f); +}); + var serverSources = serverCoreSources.concat(servicesSources); var languageServiceLibrarySources = [ @@ -571,8 +581,12 @@ compileFile( var cancellationTokenFile = path.join(builtLocalDirectory, "cancellationToken.js"); compileFile(cancellationTokenFile, cancellationTokenSources, [builtLocalDirectory].concat(cancellationTokenSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { outDir: builtLocalDirectory, noOutFile: true }); +var typingsInstallerFile = path.join(builtLocalDirectory, "typingsInstaller.js"); +compileFile(typingsInstallerFile, typingsInstallerSources, [builtLocalDirectory].concat(typingsInstallerSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { outDir: builtLocalDirectory, noOutFile: false }); + var serverFile = path.join(builtLocalDirectory, "tsserver.js"); -compileFile(serverFile, serverSources,[builtLocalDirectory, copyright, cancellationTokenFile].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"] }); +compileFile(serverFile, serverSources,[builtLocalDirectory, copyright, cancellationTokenFile, typingsInstallerFile].concat(serverSources), /*prefixes*/ [copyright], /*useBuiltCompiler*/ true, { types: ["node"] }); + var tsserverLibraryFile = path.join(builtLocalDirectory, "tsserverlibrary.js"); var tsserverLibraryDefinitionFile = path.join(builtLocalDirectory, "tsserverlibrary.d.ts"); compileFile( diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 527705d8b4f..b5e48eb28f7 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -692,6 +692,7 @@ namespace Harness.LanguageService { const server = new ts.server.Session(serverHost, { isCancellationRequested: () => false }, /*useOneInferredProject*/ false, + /*typingsInstaller*/ undefined, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, diff --git a/src/harness/unittests/cachingInServerLSHost.ts b/src/harness/unittests/cachingInServerLSHost.ts index 432df9ac278..63291daba99 100644 --- a/src/harness/unittests/cachingInServerLSHost.ts +++ b/src/harness/unittests/cachingInServerLSHost.ts @@ -84,7 +84,7 @@ namespace ts { msg: (s: string, type?: string) => { } }; - const projectService = new server.ProjectService(serverHost, logger, { isCancellationRequested: () => false }, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(serverHost, logger, { isCancellationRequested: () => false }, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); const rootScriptInfo = projectService.getOrCreateScriptInfo(rootFile, /* openedByClient */true, /*containingProject*/ undefined); const project = projectService.createInferredProjectWithRootFileIfNecessary(rootScriptInfo); project.setCompilerOptions({ module: ts.ModuleKind.AMD } ); diff --git a/src/harness/unittests/session.ts b/src/harness/unittests/session.ts index 9239d57154f..ab137b9c246 100644 --- a/src/harness/unittests/session.ts +++ b/src/harness/unittests/session.ts @@ -43,7 +43,7 @@ namespace ts.server { let lastSent: protocol.Message; beforeEach(() => { - session = new Session(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); + session = new Session(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); session.send = (msg: protocol.Message) => { lastSent = msg; }; @@ -268,7 +268,7 @@ namespace ts.server { lastSent: protocol.Message; customHandler = "testhandler"; constructor() { - super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); + super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); this.addProtocolHandler(this.customHandler, () => { return { response: undefined, responseRequired: true }; }); @@ -326,7 +326,7 @@ namespace ts.server { class InProcSession extends Session { private queue: protocol.Request[] = []; constructor(private client: InProcClient) { - super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); + super(mockHost, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined, Utils.byteLength, Utils.maxUncompressedMessageSize, Utils.compress, process.hrtime, mockLogger); this.addProtocolHandler("echo", (req: protocol.Request) => ({ response: req.arguments, responseRequired: true diff --git a/src/harness/unittests/tsserverProjectSystem.ts b/src/harness/unittests/tsserverProjectSystem.ts index 31fed86d83d..20fad9f9fa0 100644 --- a/src/harness/unittests/tsserverProjectSystem.ts +++ b/src/harness/unittests/tsserverProjectSystem.ts @@ -404,7 +404,7 @@ namespace ts { content: `export let x: number` }; const host = createServerHost([appFile, moduleFile, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); const { configFileName } = projectService.openClientFile(appFile.path); assert(!configFileName, `should not find config, got: '${configFileName}`); @@ -442,7 +442,7 @@ namespace ts { }; const host = createServerHost([configFile, libFile, file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); const { configFileName, configFileErrors } = projectService.openClientFile(file1.path); assert(configFileName, "should find config file"); @@ -469,7 +469,7 @@ namespace ts { const host = createServerHost(filesWithoutConfig); const filesWithConfig = [libFile, commonFile1, commonFile2, configFile]; - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); projectService.openClientFile(commonFile2.path); @@ -500,7 +500,7 @@ namespace ts { content: `{}` }; const host = createServerHost([commonFile1, libFile, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); checkWatchedDirectories(host, ["/a/b"]); checkNumberOfConfiguredProjects(projectService, 1); @@ -528,7 +528,7 @@ namespace ts { }` }; const host = createServerHost([commonFile1, commonFile2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); projectService.openClientFile(commonFile2.path); @@ -544,7 +544,7 @@ namespace ts { content: `{}` }; const host = createServerHost([commonFile1, commonFile2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -574,7 +574,7 @@ namespace ts { }; const files = [commonFile1, commonFile2, configFile]; const host = createServerHost(files); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); const project = projectService.configuredProjects[0]; @@ -607,7 +607,7 @@ namespace ts { }; const host = createServerHost([commonFile1, commonFile2, excludedFile1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(commonFile1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -641,7 +641,7 @@ namespace ts { }; const files = [file1, nodeModuleFile, classicModuleFile, configFile]; const host = createServerHost(files); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); projectService.openClientFile(nodeModuleFile.path); projectService.openClientFile(classicModuleFile.path); @@ -682,7 +682,7 @@ namespace ts { }` }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); projectService.closeClientFile(file1.path); projectService.openClientFile(file2.path); @@ -709,7 +709,7 @@ namespace ts { }` }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); projectService.closeClientFile(file1.path); projectService.openClientFile(file2.path); @@ -742,7 +742,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); projectService.openClientFile(file2.path); projectService.openClientFile(file3.path); @@ -775,7 +775,7 @@ namespace ts { }` }; const host = createServerHost([file1, configFile, libFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ true, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfConfiguredProjects(projectService, 1); @@ -794,7 +794,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openExternalProject({ rootFiles: toExternalFiles([file1.path, file2.path]), options: {}, @@ -852,7 +852,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, file2, file3, config1, config2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openExternalProject({ rootFiles: toExternalFiles([config1.path, config2.path, file3.path]), options: {}, @@ -890,7 +890,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -921,7 +921,7 @@ namespace ts { }; const externalProjectName = "externalproject"; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useOneInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -956,7 +956,7 @@ namespace ts { content: `export let y = 1;` }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); @@ -993,7 +993,7 @@ namespace ts { content: `export let y = 1;` }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); @@ -1032,7 +1032,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { inferredProjects: 1 }); @@ -1065,7 +1065,7 @@ namespace ts { content: "export let y = 1;" }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file2.path); checkNumberOfProjects(projectService, { inferredProjects: 1 }); @@ -1100,7 +1100,7 @@ namespace ts { }; const host = createServerHost([file1, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1131,7 +1131,7 @@ namespace ts { }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1164,7 +1164,7 @@ namespace ts { }; const host = createServerHost([file1, file2, configFile]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1192,7 +1192,7 @@ namespace ts { content: "let y = 1" }; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openExternalProject({ projectFileName: "project", options: {}, rootFiles: toExternalFiles([file1.path]) }); checkNumberOfProjects(projectService, { externalProjects: 1 }); @@ -1218,7 +1218,7 @@ namespace ts { }; const host = createServerHost([file1, file2, file3]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openExternalProject({ projectFileName: "project", options: { moduleResolution: ModuleResolutionKind.NodeJs }, rootFiles: toExternalFiles([file1.path, file2.path]) }); checkNumberOfProjects(projectService, { externalProjects: 1 }); @@ -1245,7 +1245,7 @@ namespace ts { content: JSON.stringify({ compilerOptions: {} }) }; const host = createServerHost([file1, file2, config]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); checkNumberOfProjects(projectService, { configuredProjects: 1 }); @@ -1273,7 +1273,7 @@ namespace ts { content: "export let x = 1" }; const host = createServerHost([file1, file2]); - const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false); + const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined); projectService.openClientFile(file1.path); projectService.openClientFile(file2.path); @@ -1298,7 +1298,7 @@ namespace ts { content: `