From f86f05d9149103b968288f0758ebfd092adf8dd5 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Thu, 19 Feb 2015 15:20:32 -0800 Subject: [PATCH 1/8] Split Iterator into Iterator and IterableIterator in es6.d.ts --- src/lib/es6.d.ts | 107 ++++++++++++++++++++++++----------------------- 1 file changed, 55 insertions(+), 52 deletions(-) diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index 50238e94bb4..0d69f543aa8 100644 --- a/src/lib/es6.d.ts +++ b/src/lib/es6.d.ts @@ -230,22 +230,22 @@ interface ArrayLike { interface Array { /** Iterator */ - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, T]>; + entries(): IterableIterator<[number, T]>; /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; /** * Returns the value of the first element in the array where predicate is true, and undefined @@ -329,7 +329,7 @@ interface ArrayConstructor { interface String { /** Iterator */ - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; /** * Returns a nonnegative integer Number less than 1114112 (0x110000) that is the code point @@ -447,14 +447,17 @@ interface IteratorResult { } interface Iterator { - [Symbol.iterator](): Iterator; next(): IteratorResult; + return?(value?: any): IteratorResult; + throw?(e?: any): IteratorResult; } interface Iterable { [Symbol.iterator](): Iterator; } +interface IterableIterator extends Iterable, Iterator { } + interface GeneratorFunction extends Function { } @@ -470,7 +473,7 @@ interface GeneratorFunctionConstructor { } declare var GeneratorFunction: GeneratorFunctionConstructor; -interface Generator extends Iterator { +interface Generator extends IterableIterator { next(value?: any): IteratorResult; throw (exception: any): IteratorResult; return (value: T): IteratorResult; @@ -641,15 +644,15 @@ interface RegExp { interface Map { clear(): void; delete(key: K): boolean; - entries(): Iterator<[K, V]>; + entries(): IterableIterator<[K, V]>; forEach(callbackfn: (value: V, index: K, map: Map) => void, thisArg?: any): void; get(key: K): V; has(key: K): boolean; - keys(): Iterator; + keys(): IterableIterator; set(key: K, value?: V): Map; size: number; - values(): Iterator; - [Symbol.iterator]():Iterator<[K,V]>; + values(): IterableIterator; + [Symbol.iterator]():IterableIterator<[K,V]>; [Symbol.toStringTag]: string; } @@ -680,13 +683,13 @@ interface Set { add(value: T): Set; clear(): void; delete(value: T): boolean; - entries(): Iterator<[T, T]>; + entries(): IterableIterator<[T, T]>; forEach(callbackfn: (value: T, index: T, set: Set) => void, thisArg?: any): void; has(value: T): boolean; - keys(): Iterator; + keys(): IterableIterator; size: number; - values(): Iterator; - [Symbol.iterator]():Iterator; + values(): IterableIterator; + [Symbol.iterator]():IterableIterator; [Symbol.toStringTag]: string; } @@ -917,7 +920,7 @@ interface Int8Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -997,7 +1000,7 @@ interface Int8Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -1134,10 +1137,10 @@ interface Int8Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Int8ArrayConstructor { @@ -1207,7 +1210,7 @@ interface Uint8Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -1287,7 +1290,7 @@ interface Uint8Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -1424,10 +1427,10 @@ interface Uint8Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Uint8ArrayConstructor { @@ -1497,7 +1500,7 @@ interface Uint8ClampedArray { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -1577,7 +1580,7 @@ interface Uint8ClampedArray { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -1714,10 +1717,10 @@ interface Uint8ClampedArray { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Uint8ClampedArrayConstructor { @@ -1787,7 +1790,7 @@ interface Int16Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -1867,7 +1870,7 @@ interface Int16Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -2004,10 +2007,10 @@ interface Int16Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Int16ArrayConstructor { @@ -2077,7 +2080,7 @@ interface Uint16Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -2157,7 +2160,7 @@ interface Uint16Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -2294,10 +2297,10 @@ interface Uint16Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Uint16ArrayConstructor { @@ -2367,7 +2370,7 @@ interface Int32Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -2447,7 +2450,7 @@ interface Int32Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -2584,10 +2587,10 @@ interface Int32Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Int32ArrayConstructor { @@ -2657,7 +2660,7 @@ interface Uint32Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -2737,7 +2740,7 @@ interface Uint32Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -2874,10 +2877,10 @@ interface Uint32Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Uint32ArrayConstructor { @@ -2947,7 +2950,7 @@ interface Float32Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -3027,7 +3030,7 @@ interface Float32Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -3164,10 +3167,10 @@ interface Float32Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Float32ArrayConstructor { @@ -3237,7 +3240,7 @@ interface Float64Array { /** * Returns an array of key, value pairs for every entry in the array */ - entries(): Iterator<[number, number]>; + entries(): IterableIterator<[number, number]>; /** * Determines whether all the members of an array satisfy the specified test. @@ -3317,7 +3320,7 @@ interface Float64Array { /** * Returns an list of keys in the array */ - keys(): Iterator; + keys(): IterableIterator; /** * Returns the index of the last occurrence of a value in an array. @@ -3454,10 +3457,10 @@ interface Float64Array { /** * Returns an list of values in the array */ - values(): Iterator; + values(): IterableIterator; [index: number]: number; - [Symbol.iterator] (): Iterator; + [Symbol.iterator](): IterableIterator; } interface Float64ArrayConstructor { @@ -3516,7 +3519,7 @@ declare var Reflect: { construct(target: Function, argumentsList: ArrayLike): any; defineProperty(target: any, propertyKey: PropertyKey, attributes: PropertyDescriptor): boolean; deleteProperty(target: any, propertyKey: PropertyKey): boolean; - enumerate(target: any): Iterator; + enumerate(target: any): IterableIterator; get(target: any, propertyKey: PropertyKey, receiver?: any): any; getOwnPropertyDescriptor(target: any, propertyKey: PropertyKey): PropertyDescriptor; getPrototypeOf(target: any): any; From 395a1e6bc78093e7bcc228c5fcf43ea649113427 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Fri, 20 Feb 2015 17:17:56 -0800 Subject: [PATCH 2/8] Make IterableIterator deeply iterable --- src/lib/es6.d.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index 0d69f543aa8..bb098c9c717 100644 --- a/src/lib/es6.d.ts +++ b/src/lib/es6.d.ts @@ -456,7 +456,9 @@ interface Iterable { [Symbol.iterator](): Iterator; } -interface IterableIterator extends Iterable, Iterator { } +interface IterableIterator extends Iterator { + [Symbol.iterator](): IterableIterator; +} interface GeneratorFunction extends Function { From f19619e22b32a286ae6bf47b50158fb119fddcfe Mon Sep 17 00:00:00 2001 From: steveluc Date: Sun, 22 Feb 2015 00:44:14 -0800 Subject: [PATCH 3/8] Add maxResultCount optional field to NavtoRequestArgs. Change session.ts to use this field. Remove sort of nav items from getNavigateToItems in sesion.ts because LS now does the sort. Removed no content throw in quick info as this happens frequently with Sublime (every cursor move calls quick info, and quick info is only available on symbols). Added mechanism for other commands to avoid throwing and instead return a specific error message, so that we don't make the log unreadable (as it was with hundreds of quick info stack traces). --- src/server/client.ts | 4 ++-- src/server/protocol.d.ts | 6 +++++- src/server/session.ts | 39 +++++++++++---------------------------- 3 files changed, 18 insertions(+), 31 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index 60486e80371..4cee592fb6c 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -208,9 +208,9 @@ module ts.server { return response.body[0]; } - getNavigateToItems(searchTerm: string): NavigateToItem[] { + getNavigateToItems(searchValue: string): NavigateToItem[] { var args: protocol.NavtoRequestArgs = { - searchTerm, + searchValue, file: this.host.getScriptFileNames()[0] }; diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index b07fb20d48d..a4541d2666d 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -676,7 +676,11 @@ declare module ts.server.protocol { * Search term to navigate to from current location; term can * be '.*' or an identifier prefix. */ - searchTerm: string; + searchValue: string; + /** + * Optional limit on the number of items to return. + */ + maxResultCount?: number; } /** diff --git a/src/server/session.ts b/src/server/session.ts index 19f6cd3645e..319690f3bfe 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -52,30 +52,6 @@ module ts.server { return 1; } } - - function sortNavItems(items: ts.NavigateToItem[]) { - return items.sort((a, b) => { - if (a.matchKind < b.matchKind) { - return -1; - } - else if (a.matchKind == b.matchKind) { - var lowa = a.name.toLowerCase(); - var lowb = b.name.toLowerCase(); - if (lowa < lowb) { - return -1; - } - else if (lowa == lowb) { - return 0; - } - else { - return 1; - } - } - else { - return 1; - } - }) - } function formatDiag(fileName: string, project: Project, diag: ts.Diagnostic) { return { @@ -404,7 +380,7 @@ module ts.server { var position = compilerService.host.lineColToPosition(file, line, col); var quickInfo = compilerService.languageService.getQuickInfoAtPosition(file, position); if (!quickInfo) { - throw Errors.NoContent; + return undefined; } var displayString = ts.displayPartsToString(quickInfo.displayParts); @@ -625,7 +601,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - getNavigateToItems(searchTerm: string, fileName: string): protocol.NavtoItem[] { + getNavigateToItems(searchValue: string, fileName: string, maxResultCount?: number): protocol.NavtoItem[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -633,7 +609,7 @@ module ts.server { } var compilerService = project.compilerService; - var navItems = sortNavItems(compilerService.languageService.getNavigateToItems(searchTerm)); + var navItems = compilerService.languageService.getNavigateToItems(searchValue, maxResultCount); if (!navItems) { throw Errors.NoContent; } @@ -690,6 +666,7 @@ module ts.server { try { var request = JSON.parse(message); var response: any; + var errorMessage: string; switch (request.command) { case CommandNames.Definition: { var defArgs = request.arguments; @@ -714,6 +691,9 @@ module ts.server { case CommandNames.Quickinfo: { var quickinfoArgs = request.arguments; response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); + if (!response) { + errorMessage = "No info at this location"; + } break; } case CommandNames.Format: { @@ -765,7 +745,7 @@ module ts.server { } case CommandNames.Navto: { var navtoArgs = request.arguments; - response = this.getNavigateToItems(navtoArgs.searchTerm, navtoArgs.file); + response = this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount); break; } case CommandNames.Brace: { @@ -788,6 +768,9 @@ module ts.server { if (response) { this.output(response, request.command, request.seq); } + else if (errorMessage) { + this.output(undefined, request.command, request.seq, errorMessage); + } } catch (err) { if (err instanceof OperationCanceledException) { From f9518b252b00288212181978aae3e66a437e0258 Mon Sep 17 00:00:00 2001 From: steveluc Date: Sun, 22 Feb 2015 23:27:45 -0800 Subject: [PATCH 4/8] Added update of project structure on idle following change (if no changes in last s seconds (where s is currently 1.5), then check project structure to account for references that may have changed. Turned this off pending fix for getScriptFileNames returning only the root names. Added event handler for deleted file, so that session can update error messages upon deletion of a file from a project. --- src/server/editorServices.ts | 69 ++++++++++++++++++++++++++++++------ src/server/server.ts | 9 +---- src/server/session.ts | 27 ++++++++++++-- 3 files changed, 85 insertions(+), 20 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 5b5ee27d707..d7eda52ce38 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -65,6 +65,7 @@ module ts.server { ls: ts.LanguageService = null; compilationSettings: ts.CompilerOptions; filenameToScript: ts.Map = {}; + roots: ScriptInfo[] = []; constructor(public host: ServerHost, public project: Project) { } @@ -144,7 +145,7 @@ module ts.server { var scriptInfo = ts.lookUp(this.filenameToScript, info.fileName); if (!scriptInfo) { this.filenameToScript[info.fileName] = info; - return info; + this.roots.push(info); } } @@ -286,10 +287,12 @@ module ts.server { return this.filenameToSourceFile[info.fileName]; } - getSourceFileFromName(filename: string) { + getSourceFileFromName(filename: string, requireOpen?: boolean) { var info = this.projectService.getScriptInfo(filename); if (info) { - return this.getSourceFile(info); + if ((!requireOpen) || info.isOpen) { + return this.getSourceFile(info); + } } } @@ -324,7 +327,7 @@ module ts.server { // add a root file to project addRoot(info: ScriptInfo) { info.defaultProject = this; - return this.compilerService.host.addRoot(info); + this.compilerService.host.addRoot(info); } filesToString() { @@ -360,7 +363,7 @@ module ts.server { } interface ProjectServiceEventHandler { - (eventName: string, project: Project): void; + (eventName: string, project: Project, fileName: string): void; } export class ProjectService { @@ -392,7 +395,6 @@ module ts.server { } } - log(msg: string, type = "Err") { this.psLogger.msg(msg, type); } @@ -423,7 +425,20 @@ module ts.server { for (var i = 0, len = referencingProjects.length; i < len; i++) { referencingProjects[i].removeReferencedFile(info); } + for (var j = 0, flen = this.openFileRoots.length; j < flen; j++) { + var openFile = this.openFileRoots[j]; + if (this.eventHandler) { + this.eventHandler("context", openFile.defaultProject, openFile.fileName); + } + } + for (var j = 0, flen = this.openFilesReferenced.length; j < flen; j++) { + var openFile = this.openFilesReferenced[j]; + if (this.eventHandler) { + this.eventHandler("context", openFile.defaultProject, openFile.fileName); + } + } } + this.printProjects(); } @@ -503,19 +518,52 @@ module ts.server { info.close(); } - findReferencingProjects(info: ScriptInfo) { + findReferencingProjects(info: ScriptInfo, excludedProject?: Project) { var referencingProjects: Project[] = []; info.defaultProject = undefined; for (var i = 0, len = this.inferredProjects.length; i < len; i++) { this.inferredProjects[i].updateGraph(); - if (this.inferredProjects[i].getSourceFile(info)) { - info.defaultProject = this.inferredProjects[i]; - referencingProjects.push(this.inferredProjects[i]); + if (this.inferredProjects[i] != excludedProject) { + if (this.inferredProjects[i].getSourceFile(info)) { + info.defaultProject = this.inferredProjects[i]; + referencingProjects.push(this.inferredProjects[i]); + } } } return referencingProjects; } + updateProjectStructure() { + this.log("updating project structure from ...", "Info"); + this.printProjects(); + 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 openFileRoots: ScriptInfo[] = []; + for (var i = 0, len = this.openFileRoots.length; i < len; i++) { + var rootFile = this.openFileRoots[i]; + var rootedProject = rootFile.defaultProject; + var referencingProjects = this.findReferencingProjects(rootFile, rootedProject); + if (referencingProjects.length == 0) { + rootFile.defaultProject = rootedProject; + openFileRoots.push(rootFile); + } + else { + // remove project from inferred projects list + this.inferredProjects = copyListRemovingItem(rootedProject, this.inferredProjects); + this.openFilesReferenced.push(rootFile); + } + } + this.openFileRoots = openFileRoots; + this.printProjects(); + } + getScriptInfo(filename: string) { filename = ts.normalizePath(filename); return ts.lookUp(this.filenameToScriptInfo, filename); @@ -621,6 +669,7 @@ module ts.server { this.psLogger.startGroup(); for (var i = 0, len = this.inferredProjects.length; i < len; i++) { var project = this.inferredProjects[i]; + project.updateGraph(); this.psLogger.info("Project " + i.toString()); this.psLogger.info(project.filesToString()); this.psLogger.info("-----------------------------------------------"); diff --git a/src/server/server.ts b/src/server/server.ts index 8921a4b4768..2b9040b4df3 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -82,7 +82,6 @@ module ts.server { private watchedFiles: WatchedFile[] = []; private nextFileToCheck = 0; private watchTimer: NodeJS.Timer; - private static fileDeleted = 34; // average async stat takes about 30 microseconds // set chunk size to do 30 files in < 1 millisecond @@ -111,13 +110,7 @@ module ts.server { fs.stat(watchedFile.fileName,(err, stats) => { if (err) { - var msg = err.message; - if (err.errno) { - msg += " errno: " + err.errno.toString(); - } - if (err.errno == WatchedFileSet.fileDeleted) { - watchedFile.callback(watchedFile.fileName); - } + watchedFile.callback(watchedFile.fileName); } else if (watchedFile.mtime.getTime() != stats.mtime.getTime()) { watchedFile.mtime = WatchedFileSet.getModifiedTime(watchedFile.fileName); diff --git a/src/server/session.ts b/src/server/session.ts index 319690f3bfe..07642671c7c 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -114,7 +114,18 @@ module ts.server { changeSeq = 0; constructor(private host: ServerHost, private logger: Logger) { - this.projectService = new ProjectService(host, logger); + this.projectService = + new ProjectService(host, logger, (eventName,project,fileName) => { + this.handleEvent(eventName, project, fileName); + }); + } + + handleEvent(eventName: string, project: Project, fileName: string) { + if (eventName == "context") { + this.projectService.log("got context event, updating diagnostics for" + fileName, "Info"); + this.updateErrorCheck([{ fileName, project }], this.changeSeq, + (n) => n == this.changeSeq, 100); + } } logError(err: Error, cmd: string) { @@ -191,6 +202,14 @@ module ts.server { this.semanticCheck(file, project); } + updateProjectStructure(seq: number, matchSeq: (seq: number) => boolean, ms = 1500) { + setTimeout(() => { + if (matchSeq(seq)) { + this.projectService.updateProjectStructure(); + } + }, ms); + } + updateErrorCheck(checkList: PendingErrorCheck[], seq: number, matchSeq: (seq: number) => boolean, ms = 1500, followMs = 200) { if (followMs > ms) { @@ -207,7 +226,7 @@ module ts.server { var checkOne = () => { if (matchSeq(seq)) { var checkSpec = checkList[index++]; - if (checkSpec.project.getSourceFileFromName(checkSpec.fileName)) { + if (checkSpec.project.getSourceFileFromName(checkSpec.fileName, true)) { this.syntacticCheck(checkSpec.fileName, checkSpec.project); this.immediateId = setImmediate(() => { this.semanticCheck(checkSpec.fileName, checkSpec.project); @@ -535,6 +554,10 @@ 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); } } From 47d265b20ba8020b4b2c8035bc2dae975bc5812c Mon Sep 17 00:00:00 2001 From: steveluc Date: Sun, 22 Feb 2015 23:33:35 -0800 Subject: [PATCH 5/8] Changed no content action for completions from exception to error message. --- src/server/session.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/session.ts b/src/server/session.ts index 07642671c7c..310f7950bb3 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -489,7 +489,7 @@ module ts.server { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { - throw Errors.NoProject; + return undefined; } var compilerService = project.compilerService; @@ -732,6 +732,9 @@ module ts.server { case CommandNames.Completions: { var completionsArgs = request.arguments; response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); + if (!response) { + errorMessage = "No completions at this location"; + } break; } case CommandNames.CompletionDetails: { From b0c522d0d0f86c714ff1c640b160b3c01604493a Mon Sep 17 00:00:00 2001 From: steveluc Date: Mon, 23 Feb 2015 12:06:07 -0800 Subject: [PATCH 6/8] Add missed file from addNavtoLimit branch. --- src/server/session.ts | 41 ++++++++++++++++++++--------------------- 1 file changed, 20 insertions(+), 21 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 310f7950bb3..21238e88992 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -98,7 +98,6 @@ module ts.server { module Errors { export var NoProject = new Error("No Project."); - export var NoContent = new Error("No Content."); } export interface ServerHost extends ts.System { @@ -258,7 +257,7 @@ module ts.server { var definitions = compilerService.languageService.getDefinitionAtPosition(file, position); if (!definitions) { - throw Errors.NoContent; + return undefined; } return definitions.map(def => ({ @@ -279,7 +278,7 @@ module ts.server { var position = compilerService.host.lineColToPosition(file, line, col); var renameInfo = compilerService.languageService.getRenameInfo(file, position); if (!renameInfo) { - throw Errors.NoContent; + return undefined; } if (!renameInfo.canRename) { @@ -291,7 +290,7 @@ module ts.server { var renameLocations = compilerService.languageService.findRenameLocations(file, position, findInStrings, findInComments); if (!renameLocations) { - throw Errors.NoContent; + return undefined; } var bakedRenameLocs = renameLocations.map(location => ({ @@ -350,12 +349,12 @@ module ts.server { var references = compilerService.languageService.getReferencesAtPosition(file, position); if (!references) { - throw Errors.NoContent; + return undefined; } var nameInfo = compilerService.languageService.getQuickInfoAtPosition(file, position); if (!nameInfo) { - throw Errors.NoContent; + return undefined; } var displayString = ts.displayPartsToString(nameInfo.displayParts); @@ -428,7 +427,7 @@ module ts.server { // TODO: avoid duplicate code (with formatonkey) var edits = compilerService.languageService.getFormattingEditsForRange(file, startPosition, endPosition, compilerService.formatCodeOptions); if (!edits) { - throw Errors.NoContent; + return undefined; } return edits.map((edit) => { @@ -468,7 +467,7 @@ module ts.server { } if (!edits) { - throw Errors.NoContent; + return undefined; } return edits.map((edit) => { @@ -489,7 +488,7 @@ module ts.server { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { - return undefined; + throw Errors.NoProject; } var compilerService = project.compilerService; @@ -497,7 +496,7 @@ module ts.server { var completions = compilerService.languageService.getCompletionsAtPosition(file, position); if (!completions) { - throw Errors.NoContent; + return undefined; } return completions.entries.reduce((result: protocol.CompletionEntry[], entry: ts.CompletionEntry) => { @@ -618,7 +617,7 @@ module ts.server { var compilerService = project.compilerService; var items = compilerService.languageService.getNavigationBarItems(file); if (!items) { - throw Errors.NoContent; + return undefined; } return this.decorateNavigationBarItem(project, fileName, items); @@ -634,7 +633,7 @@ module ts.server { var compilerService = project.compilerService; var navItems = compilerService.languageService.getNavigateToItems(searchValue, maxResultCount); if (!navItems) { - throw Errors.NoContent; + return undefined; } return navItems.map((navItem) => { @@ -676,7 +675,7 @@ module ts.server { var spans = compilerService.languageService.getBraceMatchingAtPosition(file, position); if (!spans) { - throw Errors.NoContent; + return undefined; } return spans.map(span => ({ @@ -690,6 +689,7 @@ module ts.server { var request = JSON.parse(message); var response: any; var errorMessage: string; + var responseRequired = true; switch (request.command) { case CommandNames.Definition: { var defArgs = request.arguments; @@ -709,14 +709,12 @@ module ts.server { case CommandNames.Open: { var openArgs = request.arguments; this.openClientFile(openArgs.file); + responseRequired = false; break; } case CommandNames.Quickinfo: { var quickinfoArgs = request.arguments; response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.col, quickinfoArgs.file); - if (!response) { - errorMessage = "No info at this location"; - } break; } case CommandNames.Format: { @@ -732,9 +730,6 @@ module ts.server { case CommandNames.Completions: { var completionsArgs = request.arguments; response = this.getCompletions(request.arguments.line, request.arguments.col, completionsArgs.prefix, request.arguments.file); - if (!response) { - errorMessage = "No completions at this location"; - } break; } case CommandNames.CompletionDetails: { @@ -746,12 +741,14 @@ module ts.server { case CommandNames.Geterr: { var geterrArgs = request.arguments; response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); + responseRequired = false; break; } case CommandNames.Change: { var changeArgs = request.arguments; this.change(changeArgs.line, changeArgs.col, changeArgs.endLine, changeArgs.endCol, changeArgs.insertString, changeArgs.file); + responseRequired = false; break; } case CommandNames.Reload: { @@ -762,11 +759,13 @@ module ts.server { case CommandNames.Saveto: { var savetoArgs = request.arguments; this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); + responseRequired = false; break; } case CommandNames.Close: { var closeArgs = request.arguments; this.closeClientFile(closeArgs.file); + responseRequired = false; break; } case CommandNames.Navto: { @@ -794,8 +793,8 @@ module ts.server { if (response) { this.output(response, request.command, request.seq); } - else if (errorMessage) { - this.output(undefined, request.command, request.seq, errorMessage); + else if (responseRequired) { + this.output(undefined, request.command, request.seq, "No content available."); } } catch (err) { From 5bf919704f734c56d3b3d641761804e2badef426 Mon Sep 17 00:00:00 2001 From: Ron Buckton Date: Mon, 23 Feb 2015 13:07:12 -0800 Subject: [PATCH 7/8] Fixes overly-aggressive auto-collapse for "Collapse to Definitions" --- src/services/outliningElementsCollector.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index 0b39f54ca29..9234768779f 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -32,15 +32,7 @@ module ts { } function autoCollapse(node: Node) { - switch (node.kind) { - case SyntaxKind.ModuleBlock: - case SyntaxKind.ClassDeclaration: - case SyntaxKind.InterfaceDeclaration: - case SyntaxKind.EnumDeclaration: - return false; - } - - return true; + return isFunctionBlock(node) && node.parent.kind !== SyntaxKind.ArrowFunction; } var depth = 0; From 7711a454dd34b66a3086a7b320506509146d3ec6 Mon Sep 17 00:00:00 2001 From: Jason Freeman Date: Mon, 23 Feb 2015 13:53:25 -0800 Subject: [PATCH 8/8] [Symbol.iterator] of a Generator is a Generator --- src/lib/es6.d.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index bb098c9c717..3e6ac3f756c 100644 --- a/src/lib/es6.d.ts +++ b/src/lib/es6.d.ts @@ -477,8 +477,9 @@ declare var GeneratorFunction: GeneratorFunctionConstructor; interface Generator extends IterableIterator { next(value?: any): IteratorResult; - throw (exception: any): IteratorResult; - return (value: T): IteratorResult; + throw(exception: any): IteratorResult; + return(value: T): IteratorResult; + [Symbol.iterator](): Generator; [Symbol.toStringTag]: string; }