From fa504f68087ab89d965f8dbf49db95b804014702 Mon Sep 17 00:00:00 2001 From: steveluc Date: Mon, 23 Feb 2015 23:44:15 -0800 Subject: [PATCH 1/2] Update project structure after change. After each change a timer is started. If timer finishes before another change takes place, project structure will be updated to reflect any changes in reference comments or import statements. --- src/server/editorServices.ts | 30 ++++++++++++++++-------------- src/server/server.ts | 7 +++++-- src/server/session.ts | 32 ++++++++++++++++++++------------ 3 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index d7eda52ce3..d3bf1718a2 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -101,13 +101,7 @@ module ts.server { } getScriptFileNames() { - var filenames: string[] = []; - for (var filename in this.filenameToScript) { - if (this.filenameToScript[filename] && this.filenameToScript[filename].isOpen) { - filenames.push(filename); - } - } - return filenames; + return this.roots.map(root => root.fileName); } getScriptVersion(filename: string) { @@ -536,15 +530,20 @@ module ts.server { updateProjectStructure() { this.log("updating project structure from ...", "Info"); this.printProjects(); + var openFilesReferenced: ScriptInfo[] = []; + var unattachedOpenFiles: ScriptInfo[] = []; for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { - var refdFile = this.openFilesReferenced[i]; - refdFile.defaultProject.updateGraph(); - var sourceFile = refdFile.defaultProject.getSourceFile(refdFile); - if (!sourceFile) { - this.openFilesReferenced = copyListRemovingItem(refdFile, this.openFilesReferenced); - this.addOpenFile(refdFile); + var referencedFile = this.openFilesReferenced[i]; + referencedFile.defaultProject.updateGraph(); + var sourceFile = referencedFile.defaultProject.getSourceFile(referencedFile); + if (sourceFile) { + openFilesReferenced.push(referencedFile); + } + else { + unattachedOpenFiles.push(referencedFile); } } + this.openFilesReferenced = openFilesReferenced; var openFileRoots: ScriptInfo[] = []; for (var i = 0, len = this.openFileRoots.length; i < len; i++) { var rootFile = this.openFileRoots[i]; @@ -555,12 +554,15 @@ module ts.server { openFileRoots.push(rootFile); } else { - // remove project from inferred projects list + // remove project from inferred projects list because root captured this.inferredProjects = copyListRemovingItem(rootedProject, this.inferredProjects); this.openFilesReferenced.push(rootFile); } } this.openFileRoots = openFileRoots; + for (var i = 0, len = unattachedOpenFiles.length; i < len; i++) { + this.addOpenFile(unattachedOpenFiles[i]); + } this.printProjects(); } diff --git a/src/server/server.ts b/src/server/server.ts index 2b9040b4df..c48ba95134 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -206,7 +206,10 @@ module ts.server { } }; - + var ioSession = new IOSession(ts.sys, logger); + process.on('uncaughtException', function(err: Error) { + ioSession.logError(err, "unknown"); + }); // Start listening - new IOSession(ts.sys, logger).listen(); + ioSession.listen(); } \ No newline at end of file diff --git a/src/server/session.ts b/src/server/session.ts index 21238e8899..7e9c6972a1 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -181,18 +181,29 @@ module ts.server { } semanticCheck(file: string, project: Project) { - var diags = project.compilerService.languageService.getSemanticDiagnostics(file); - if (diags) { - var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: file, diagnostics: bakedDiags }, "semanticDiag"); + try { + var diags = project.compilerService.languageService.getSemanticDiagnostics(file); + + if (diags) { + var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); + this.event({ file: file, diagnostics: bakedDiags }, "semanticDiag"); + } + } + catch (err) { + this.logError(err, "semantic check"); } } syntacticCheck(file: string, project: Project) { - var diags = project.compilerService.languageService.getSyntacticDiagnostics(file); - if (diags) { - var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); - this.event({ file: file, diagnostics: bakedDiags }, "syntaxDiag"); + try { + var diags = project.compilerService.languageService.getSyntacticDiagnostics(file); + if (diags) { + var bakedDiags = diags.map((diag) => formatDiag(file, project, diag)); + this.event({ file: file, diagnostics: bakedDiags }, "syntaxDiag"); + } + } + catch (err) { + this.logError(err, "syntactic check"); } } @@ -553,10 +564,7 @@ module ts.server { compilerService.host.editScript(file, start, end, insertString); this.changeSeq++; } - // update project structure on idle commented out - // until we can have the host return only the root files - // from getScriptFileNames() - //this.updateProjectStructure(this.changeSeq, (n) => n == this.changeSeq); + this.updateProjectStructure(this.changeSeq, (n) => n == this.changeSeq); } } From 68049ea5035884216b45215d6d2dcfa37619e798 Mon Sep 17 00:00:00 2001 From: steveluc Date: Tue, 24 Feb 2015 00:08:34 -0800 Subject: [PATCH 2/2] Added comments for updateProjectStructure. --- src/server/editorServices.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index d3bf1718a2..49a1ac4784 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -530,8 +530,15 @@ module ts.server { updateProjectStructure() { this.log("updating project structure from ...", "Info"); this.printProjects(); + + // First loop through all open files that are referenced by projects but are not + // project roots. For each referenced file, see if the default project still + // references that file. If so, then just keep the file in the referenced list. + // If not, add the file to an unattached list, to be rechecked later. + var openFilesReferenced: ScriptInfo[] = []; var unattachedOpenFiles: ScriptInfo[] = []; + for (var i = 0, len = this.openFilesReferenced.length; i < len; i++) { var referencedFile = this.openFilesReferenced[i]; referencedFile.defaultProject.updateGraph(); @@ -544,6 +551,14 @@ module ts.server { } } this.openFilesReferenced = openFilesReferenced; + + // Then, loop through all of the open files that are project roots. + // For each root file, note the project that it roots. Then see if + // any other projects newly reference the file. If zero projects + // newly reference the file, keep it as a root. If one or more + // projects newly references the file, remove its project from the + // inferred projects list (since it is no longer a root) and add + // the file to the open, referenced file list. var openFileRoots: ScriptInfo[] = []; for (var i = 0, len = this.openFileRoots.length; i < len; i++) { var rootFile = this.openFileRoots[i]; @@ -560,6 +575,10 @@ module ts.server { } } this.openFileRoots = openFileRoots; + + // Finally, if we found any open, referenced files that are no longer + // referenced by their default project, treat them as newly opened + // by the editor. for (var i = 0, len = unattachedOpenFiles.length; i < len; i++) { this.addOpenFile(unattachedOpenFiles[i]); }