[WIP] pass ITypingsInstaller to ProjectService

This commit is contained in:
Vladimir Matveev
2016-08-12 14:01:23 -07:00
parent 51e2b02a31
commit b1871a5bf9
15 changed files with 113 additions and 85 deletions
+15 -1
View File
@@ -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(
+1
View File
@@ -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,
@@ -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 } );
+3 -3
View File
@@ -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
+32 -32
View File
@@ -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: `<html><script language="javascript">var x = 1;</></html>`
};
const host = createServerHost([file1]);
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false);
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ false, /*typingsInstaller*/ undefined);
const projectFileName = "projectFileName";
projectService.openExternalProject({ projectFileName, options: {}, rootFiles: [{ fileName: file1.path, scriptKind: ScriptKind.JS, hasMixedContent: true }] });
@@ -1336,7 +1336,7 @@ namespace ts {
content: "export let x: number"
};
const host = createServerHost([file1, modFile]);
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(modFile.path);
@@ -1353,7 +1353,7 @@ namespace ts {
content: "{x: 1}"
};
const host = createServerHost([file1]);
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ true);
const projectService = new server.ProjectService(host, nullLogger, nullCancellationToken, /*useSingleInferredProject*/ true, /*typingsInstaller*/ undefined);
projectService.setCompilerOptionsForInferredProjects({ target: ScriptTarget.ES5, allowJs: false });
projectService.openClientFile(file1.path);
projectService.inferredProjects[0].getLanguageService(/*ensureSynchronized*/ false).getOutliningSpans(file1.path);
@@ -1381,7 +1381,7 @@ namespace ts {
content: "{}"
};
const host = createServerHost([file1, file2, tsconfig1, tsconfig2]);
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, { configuredProjects: 1 });
+2
View File
@@ -176,11 +176,13 @@ namespace ts.server {
public readonly logger: Logger,
public readonly cancellationToken: HostCancellationToken,
private readonly useSingleInferredProject: boolean,
private typingsInstaller: ITypingsInstaller,
private readonly eventHandler?: ProjectServiceEventHandler) {
this.toCanonicalFileName = createGetCanonicalFileName(host.useCaseSensitiveFileNames);
this.directoryWatchers = new DirectoryWatchers(this);
this.throttledOperations = new ThrottledOperations(host);
this.typingsCache = new TypingsCache(typingsInstaller || nullTypingsInstaller);
// ts.disableIncrementalParsing = true;
this.hostConfiguration = {
+1 -1
View File
@@ -233,7 +233,7 @@ namespace ts.server {
}
this.projectStructureVersion++;
}
return hasChanges;
return !hasChanges;
}
setTypings(typings: string[]): boolean {
+2 -1
View File
@@ -153,7 +153,8 @@ namespace ts.server {
class IOSession extends Session {
constructor(host: ServerHost, cancellationToken: HostCancellationToken, useSingleInferredProject: boolean, logger: ts.server.Logger) {
super(host, cancellationToken, useSingleInferredProject, Buffer.byteLength, maxUncompressedMessageSize, compress, process.hrtime, logger);
// TODO: fixme
super(host, cancellationToken, useSingleInferredProject, undefined, Buffer.byteLength, maxUncompressedMessageSize, compress, process.hrtime, logger);
}
exit() {
+2 -15
View File
@@ -8,26 +8,12 @@ namespace ts.server {
stack?: string;
}
export interface CompressedData {
length: number;
compressionKind: string;
data: any;
}
function hrTimeToMilliseconds(time: number[]): number {
const seconds = time[0];
const nanoseconds = time[1];
return ((1e9 * seconds) + nanoseconds) / 1000000.0;
}
export interface ServerHost extends System {
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
clearTimeout(timeoutId: any): void;
setImmediate(callback: (...args: any[]) => void, ...args: any[]): any;
clearImmediate(timeoutId: any): void;
writeCompressedData(prefix: string, data: CompressedData, suffix: string): void;
}
interface FileStart {
file: string;
start: ILineInfo;
@@ -157,13 +143,14 @@ namespace ts.server {
private host: ServerHost,
cancellationToken: HostCancellationToken,
useSingleInferredProject: boolean,
typingsInstaller: ITypingsInstaller,
private byteLength: (buf: string, encoding?: string) => number,
private maxUncompressedMessageSize: number,
private compress: (s: string) => CompressedData,
private hrtime: (start?: number[]) => number[],
protected logger: Logger) {
this.projectService =
new ProjectService(host, logger, cancellationToken, useSingleInferredProject, (eventName, project, fileName) => {
new ProjectService(host, logger, cancellationToken, useSingleInferredProject, typingsInstaller, (eventName, project, fileName) => {
this.handleEvent(eventName, project, fileName);
});
this.gcTimer = new GcTimer(host, /*delay*/ 15000, logger);
+37
View File
@@ -0,0 +1,37 @@
declare namespace ts.server {
export interface InstallTypingsRequest {
readonly projectName: string;
readonly fileNames: string[];
readonly projectRootPath: ts.Path;
readonly safeListPath: ts.Path;
readonly packageNameToTypingLocation: ts.Map<string>;
readonly typingOptions: ts.TypingOptions;
readonly compilerOptions: ts.CompilerOptions;
readonly cachePath: string;
}
export interface CompressedData {
length: number;
compressionKind: string;
data: any;
}
export interface ServerHost extends System {
setTimeout(callback: (...args: any[]) => void, ms: number, ...args: any[]): any;
clearTimeout(timeoutId: any): void;
setImmediate(callback: (...args: any[]) => void, ...args: any[]): any;
clearImmediate(timeoutId: any): void;
writeCompressedData(prefix: string, data: CompressedData, suffix: string): void;
}
export interface InstallTypingsResponse {
readonly projectName: string;
readonly typingOptions: ts.TypingOptions;
readonly compilerOptions: ts.CompilerOptions;
readonly typings: string[];
}
export interface InstallTypingHost extends JsTyping.TypingResolutionHost {
writeFile(path: string, content: string): void;
}
}
+11 -5
View File
@@ -5,6 +5,10 @@ namespace ts.server {
enqueueInstallTypingsRequest(p: Project): void;
}
export const nullTypingsInstaller: ITypingsInstaller = {
enqueueInstallTypingsRequest: () => {}
};
class TypingsCacheEntry {
readonly typingOptions: TypingOptions;
readonly compilerOptions: CompilerOptions;
@@ -19,8 +23,8 @@ namespace ts.server {
return (<ConfiguredProject>proj).getTypingOptions();
}
const enableAutoDiscovery =
proj.projectKind === ProjectKind.Inferred &&
const enableAutoDiscovery =
proj.projectKind === ProjectKind.Inferred &&
proj.getCompilerOptions().allowJs &&
proj.getFileNames().every(f => fileExtensionIsAny(f, jsOrDts));
@@ -35,7 +39,9 @@ namespace ts.server {
if ((arr1 || emptyArray).length === 0 && (arr2 || emptyArray).length === 0) {
return true;
}
/* tslint:disable:no-null-keyword */
const set: Map<boolean> = Object.create(null);
/* tslint:enable:no-null-keyword */
let unique = 0;
for (const v of arr1) {
@@ -59,7 +65,7 @@ namespace ts.server {
function typingOptionsChanged(opt1: TypingOptions, opt2: TypingOptions): boolean {
return opt1.enableAutoDiscovery !== opt2.enableAutoDiscovery ||
!setIsEqualTo(opt1.include, opt2.include) ||
!setIsEqualTo(opt1.exclude, opt2.exclude);
!setIsEqualTo(opt1.exclude, opt2.exclude);
}
function compilerOptionsChanged(opt1: CompilerOptions, opt2: CompilerOptions): boolean {
@@ -76,7 +82,7 @@ namespace ts.server {
getTypingsForProject(project: Project): Path[] {
const typingOptions = getTypingOptionsForProjects(project);
if(!typingOptions.enableAutoDiscovery) {
if (!typingOptions.enableAutoDiscovery) {
return emptyArray;
}
@@ -84,7 +90,7 @@ namespace ts.server {
if (!entry || typingOptionsChanged(typingOptions, entry.typingOptions) || compilerOptionsChanged(project.getCompilerOptions(), entry.compilerOptions)) {
this.installer.enqueueInstallTypingsRequest(project);
}
return entry? entry.typings : emptyArray;
return entry ? entry.typings : emptyArray;
}
deleteTypingsForProject(project: Project) {
@@ -1,4 +1,5 @@
/// <reference path="typingsInstaller.ts"/>
/// <reference types="node" />
namespace ts.server.typingsInstaller {
export class NodeTypingsInstaller extends TypingsInstaller {
+1 -1
View File
@@ -14,7 +14,7 @@
},
"files": [
"../../services/services.ts",
"../utilities.ts",
"../types.d.ts",
"typingsInstaller.ts",
"nodeTypingsInstaller.ts"
]
@@ -1,5 +1,6 @@
/// <reference path="../../services/services.ts"/>
/// <reference path="../utilities.ts"/>
/// <reference path="../../services/JsTyping.ts"/>
/// <reference path="../../services/shims.ts"/>
/// <reference path="../types.d.ts"/>
namespace ts.server.typingsInstaller {
+1 -23
View File
@@ -1,4 +1,5 @@
/// <reference path="..\services\services.ts" />
/// <reference path="types.d.ts" />
namespace ts.server {
export enum LogLevel {
@@ -8,28 +9,6 @@ namespace ts.server {
verbose
}
export interface InstallTypingsRequest {
readonly projectName: string;
readonly fileNames: string[];
readonly projectRootPath: ts.Path;
readonly safeListPath: ts.Path;
readonly packageNameToTypingLocation: ts.Map<string>;
readonly typingOptions: ts.TypingOptions;
readonly compilerOptions: ts.CompilerOptions;
readonly cachePath: string;
}
export interface InstallTypingsResponse {
readonly projectName: string;
readonly typingOptions: ts.TypingOptions;
readonly compilerOptions: ts.CompilerOptions;
readonly typings: string[];
}
export interface InstallTypingHost extends JsTyping.TypingResolutionHost {
writeFile(path: string, content: string): void;
}
export interface Logger {
close(): void;
hasLevel(level: LogLevel): boolean;
@@ -145,7 +124,6 @@ namespace ts.server {
};
}
function throwLanguageServiceIsDisabledError() {
;
throw new Error("LanguageService is disabled");
}