diff --git a/src/lib/es6.d.ts b/src/lib/es6.d.ts index 50238e94bb4..3e6ac3f756c 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,19 @@ 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 Iterator { + [Symbol.iterator](): IterableIterator; +} + interface GeneratorFunction extends Function { } @@ -470,10 +475,11 @@ 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; + throw(exception: any): IteratorResult; + return(value: T): IteratorResult; + [Symbol.iterator](): Generator; [Symbol.toStringTag]: string; } @@ -641,15 +647,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 +686,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 +923,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 +1003,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 +1140,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 +1213,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 +1293,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 +1430,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 +1503,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 +1583,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 +1720,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 +1793,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 +1873,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 +2010,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 +2083,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 +2163,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 +2300,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 +2373,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 +2453,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 +2590,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 +2663,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 +2743,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 +2880,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 +2953,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 +3033,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 +3170,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 +3243,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 +3323,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 +3460,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 +3522,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; 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/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/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/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 19f6cd3645e..21238e88992 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 { @@ -122,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 { @@ -138,7 +113,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) { @@ -215,6 +201,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) { @@ -231,7 +225,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); @@ -263,7 +257,7 @@ module ts.server { var definitions = compilerService.languageService.getDefinitionAtPosition(file, position); if (!definitions) { - throw Errors.NoContent; + return undefined; } return definitions.map(def => ({ @@ -284,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) { @@ -296,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 => ({ @@ -355,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); @@ -404,7 +398,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); @@ -433,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) => { @@ -473,7 +467,7 @@ module ts.server { } if (!edits) { - throw Errors.NoContent; + return undefined; } return edits.map((edit) => { @@ -502,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) => { @@ -559,6 +553,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); } } @@ -619,13 +617,13 @@ 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); } - 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,9 +631,9 @@ 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; + return undefined; } return navItems.map((navItem) => { @@ -677,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 +688,8 @@ module ts.server { try { 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,6 +709,7 @@ module ts.server { case CommandNames.Open: { var openArgs = request.arguments; this.openClientFile(openArgs.file); + responseRequired = false; break; } case CommandNames.Quickinfo: { @@ -740,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: { @@ -756,16 +759,18 @@ 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: { 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 +793,9 @@ module ts.server { if (response) { this.output(response, request.command, request.seq); } + else if (responseRequired) { + this.output(undefined, request.command, request.seq, "No content available."); + } } catch (err) { if (err instanceof OperationCanceledException) { diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index b65ad7e36c8..54b548336de 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;