Simplify event sent on background project update since its anyways just to update the error list

This commit is contained in:
Sheetal Nandi
2017-09-12 18:11:45 -07:00
parent b536f9dade
commit 4f7c0e5e1c
6 changed files with 139 additions and 229 deletions

View File

@@ -9,14 +9,14 @@
namespace ts.server {
export const maxProgramSizeForNonTsFiles = 20 * 1024 * 1024;
export const ProjectChangedEvent = "projectChanged";
export const ProjectsUpdatedInBackgroundEvent = "projectsUpdatedInBackground";
export const ConfigFileDiagEvent = "configFileDiag";
export const ProjectLanguageServiceStateEvent = "projectLanguageServiceState";
export const ProjectInfoTelemetryEvent = "projectInfo";
export interface ProjectChangedEvent {
eventName: typeof ProjectChangedEvent;
data: { project: Project; filesToEmit: string[]; changedFiles: string[] };
export interface ProjectsUpdatedInBackgroundEvent {
eventName: typeof ProjectsUpdatedInBackgroundEvent;
data: { openFiles: string[]; };
}
export interface ConfigFileDiagEvent {
@@ -76,7 +76,7 @@ namespace ts.server {
readonly dts: number;
}
export type ProjectServiceEvent = ProjectChangedEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent;
export type ProjectServiceEvent = ProjectsUpdatedInBackgroundEvent | ConfigFileDiagEvent | ProjectLanguageServiceStateEvent | ProjectInfoTelemetryEvent;
export interface ProjectServiceEventHandler {
(event: ProjectServiceEvent): void;
@@ -517,9 +517,14 @@ namespace ts.server {
if (this.pendingProjectUpdates.size !== 0) {
this.delayInferredProjectsRefresh();
}
else if (this.pendingInferredProjectUpdate) {
this.pendingInferredProjectUpdate = false;
this.refreshInferredProjects();
else {
if (this.pendingInferredProjectUpdate) {
this.pendingInferredProjectUpdate = false;
this.refreshInferredProjects();
}
// Send the event to notify that there were background project updates
// send current list of open files
this.sendProjectsUpdatedInBackgroundEvent();
}
});
}
@@ -531,27 +536,18 @@ namespace ts.server {
if (this.pendingProjectUpdates.delete(projectName)) {
project.updateGraph();
}
// Send the update event to notify about the project changes
this.sendProjectChangedEvent(project);
});
}
private sendProjectChangedEvent(project: Project) {
if (project.isClosed() || !this.eventHandler || !project.languageServiceEnabled) {
private sendProjectsUpdatedInBackgroundEvent() {
if (!this.eventHandler) {
return;
}
const { filesToEmit, changedFiles } = project.getChangedFiles();
if (changedFiles.length === 0) {
return;
}
const event: ProjectChangedEvent = {
eventName: ProjectChangedEvent,
const event: ProjectsUpdatedInBackgroundEvent = {
eventName: ProjectsUpdatedInBackgroundEvent,
data: {
project,
filesToEmit: filesToEmit as string[],
changedFiles: changedFiles as string[]
openFiles: this.openFiles.map(f => f.fileName)
}
};
this.eventHandler(event);

View File

@@ -457,12 +457,6 @@ namespace ts.server {
return !emitSkipped;
}
getChangedFiles() {
Debug.assert(this.languageServiceEnabled);
this.ensureBuilder();
return this.builder.getChangedProgramFiles(this.program);
}
enableLanguageService() {
if (this.languageServiceEnabled) {
return;

View File

@@ -2040,27 +2040,17 @@ namespace ts.server.protocol {
languageServiceEnabled: boolean;
}
export type ProjectChangedEventName = "projectChanged";
export interface ProjectStructureChangedEvent extends Event {
event: ProjectChangedEventName;
body: ProjectChangedEventBody;
export type ProjectsUpdatedInBackgroundEventName = "projectsUpdatedInBackground";
export interface ProjectsUpdatedInBackgroundEvent extends Event {
event: ProjectsUpdatedInBackgroundEventName;
body: ProjectsUpdatedInBackgroundEventBody;
}
export interface ProjectChangedEventBody {
export interface ProjectsUpdatedInBackgroundEventBody {
/**
* Project name that has changes
* Current set of open files
*/
projectName: string;
/**
* Minimum set of file names to emit
*/
fileNamesToEmit: string[];
/**
* List of files that have changed/added/removed or could have been affected by the changed files
*/
changedFiles: string[];
openFiles: string[];
}
/**

View File

@@ -332,9 +332,9 @@ namespace ts.server {
private defaultEventHandler(event: ProjectServiceEvent) {
switch (event.eventName) {
case ProjectChangedEvent:
const { project, filesToEmit, changedFiles } = event.data;
this.projectChangedEvent(project, filesToEmit, changedFiles);
case ProjectsUpdatedInBackgroundEvent:
const { openFiles } = event.data;
this.projectsUpdatedInBackgroundEvent(openFiles);
break;
case ConfigFileDiagEvent:
const { triggerFile, configFileName: configFile, diagnostics } = event.data;
@@ -364,21 +364,19 @@ namespace ts.server {
}
}
private projectChangedEvent(project: Project, fileNamesToEmit: string[], changedFiles: string[]): void {
this.projectService.logger.info(`got project changed event, updating diagnostics for ${changedFiles}`);
if (changedFiles.length) {
const checkList = this.createCheckList(changedFiles, project);
private projectsUpdatedInBackgroundEvent(openFiles: string[]): void {
this.projectService.logger.info(`got projects updated in background, updating diagnostics for ${openFiles}`);
if (openFiles.length) {
const checkList = this.createCheckList(openFiles);
// For now only queue error checking for open files. We can change this to include non open files as well
this.errorCheck.startNew(next => this.updateErrorCheck(next, checkList, 100, /*requireOpen*/ true));
// Send project changed event
this.event<protocol.ProjectChangedEventBody>({
projectName: project.getProjectName(),
changedFiles,
fileNamesToEmit
}, "projectChanged");
this.event<protocol.ProjectsUpdatedInBackgroundEventBody>({
openFiles
}, "projectsUpdatedInBackground");
}
}