From 5b6c65ffe09bbdb150f8e8efee79b8124ed019e6 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:31:09 -0700 Subject: [PATCH 1/9] Added support for getOccurrences to the server. --- src/server/client.ts | 22 +++++++++++++++++++++- src/server/protocol.d.ts | 19 +++++++++++++++++++ src/server/session.ts | 1 + 3 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/server/client.ts b/src/server/client.ts index d395d2a832..dfda9f23ed 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -446,6 +446,7 @@ module ts.server { if (!response.body) { return undefined; } + var helpItems: protocol.SignatureHelpItems = response.body; var span = helpItems.applicableSpan; var start = this.lineOffsetToPosition(fileName, span.start); @@ -465,7 +466,26 @@ module ts.server { } getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - throw new Error("Not Implemented Yet."); + var lineOffset = this.positionToOneBasedLineOffset(fileName, position); + var args: protocol.FileLocationRequestArgs = { + file: fileName, + line: lineOffset.line, + offset: lineOffset.offset, + }; + + var request = this.processRequest(CommandNames.Occurrences, args); + var response = this.processResponse(request); + + return response.body.map(entry => { + var fileName = entry.file; + var start = this.lineOffsetToPosition(fileName, entry.start); + var end = this.lineOffsetToPosition(fileName, entry.end); + return { + fileName, + textSpan: ts.createTextSpanFromBounds(start, end), + isWriteAccess: entry.isWriteAccess, + }; + }); } getOutliningSpans(fileName: string): OutliningSpan[] { diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index 1d685be5d3..5bc1ffbe4d 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -165,6 +165,25 @@ declare module ts.server.protocol { body?: FileSpan[]; } + /** + * Get occurrences request; value of command field is + * "occurrences". Return response giving spans that are relevant + * in the file at a given line and column. + */ + export interface OccurrencesRequest extends FileLocationRequest { + } + + export interface OccurrencesResponseItem extends FileSpan { + /** + * True if the occurrence is a write location, false otherwise. + */ + isWriteAccess: boolean; + } + + export interface OccurrencesResponse extends Response { + body?: OccurrencesResponseItem[]; + } + /** * Find references request; value of command field is * "references". Return response giving the file locations that diff --git a/src/server/session.ts b/src/server/session.ts index 560f5869c0..f35235554e 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -89,6 +89,7 @@ module ts.server { export var Geterr = "geterr"; export var NavBar = "navbar"; export var Navto = "navto"; + export var Occurrences = "occurrences"; export var Open = "open"; export var Quickinfo = "quickinfo"; export var References = "references"; From 6b997487ee077c2cd3f46248af9682b72d39fd8d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:34:45 -0700 Subject: [PATCH 2/9] Fixed /// +/// //////curly braces ////module Foo [|{ diff --git a/tests/cases/fourslash/server/completions.ts b/tests/cases/fourslash/server/completions.ts index 2af0393283..a837a74849 100644 --- a/tests/cases/fourslash/server/completions.ts +++ b/tests/cases/fourslash/server/completions.ts @@ -1,4 +1,4 @@ -/// +/// ////var x: string[] = []; ////x.forEach(function (y) { y/*1*/ diff --git a/tests/cases/fourslash/server/completions2.ts b/tests/cases/fourslash/server/completions2.ts index 3e7e77b588..b6c39a5c72 100644 --- a/tests/cases/fourslash/server/completions2.ts +++ b/tests/cases/fourslash/server/completions2.ts @@ -1,4 +1,4 @@ -/// +/// ////class Foo { ////} diff --git a/tests/cases/fourslash/server/definition.ts b/tests/cases/fourslash/server/definition.ts index f403965fe1..8bf6e73c84 100644 --- a/tests/cases/fourslash/server/definition.ts +++ b/tests/cases/fourslash/server/definition.ts @@ -1,4 +1,4 @@ -/// +/// // @Filename: b.ts ////import n = require('a/*1*/'); diff --git a/tests/cases/fourslash/server/format.ts b/tests/cases/fourslash/server/format.ts index 75d06eef0c..f454115220 100644 --- a/tests/cases/fourslash/server/format.ts +++ b/tests/cases/fourslash/server/format.ts @@ -1,4 +1,4 @@ -/// +/// /////**/module Default{var x= ( { } ) ;} diff --git a/tests/cases/fourslash/server/formatonkey.ts b/tests/cases/fourslash/server/formatonkey.ts index 64cd74ca85..73e817ce3b 100644 --- a/tests/cases/fourslash/server/formatonkey.ts +++ b/tests/cases/fourslash/server/formatonkey.ts @@ -1,4 +1,4 @@ -/// +/// ////switch (1) { //// case 1: diff --git a/tests/cases/fourslash/server/navbar.ts b/tests/cases/fourslash/server/navbar.ts index 67e14fe100..82ded5e6f5 100644 --- a/tests/cases/fourslash/server/navbar.ts +++ b/tests/cases/fourslash/server/navbar.ts @@ -1,4 +1,4 @@ -/// +/// ////// Interface ////{| "itemName": "IPoint", "kind": "interface", "parentName": "" |}interface IPoint { diff --git a/tests/cases/fourslash/server/navto.ts b/tests/cases/fourslash/server/navto.ts index ba907e985f..1072c64494 100644 --- a/tests/cases/fourslash/server/navto.ts +++ b/tests/cases/fourslash/server/navto.ts @@ -1,4 +1,4 @@ -/// +/// /////// Module ////{| "itemName": "MyShapes", "kind": "module", "parentName": "", "matchKind": "substring" |}module MyShapes { diff --git a/tests/cases/fourslash/server/quickinfo.ts b/tests/cases/fourslash/server/quickinfo.ts index 5292eb6c2c..9008505e44 100644 --- a/tests/cases/fourslash/server/quickinfo.ts +++ b/tests/cases/fourslash/server/quickinfo.ts @@ -1,4 +1,4 @@ -/// +/// ////interface One { //// commonProperty: number; diff --git a/tests/cases/fourslash/server/references.ts b/tests/cases/fourslash/server/references.ts index 55b2161555..0ecbeb43de 100644 --- a/tests/cases/fourslash/server/references.ts +++ b/tests/cases/fourslash/server/references.ts @@ -1,4 +1,4 @@ -/// +/// // Global class reference. diff --git a/tests/cases/fourslash/server/rename.ts b/tests/cases/fourslash/server/rename.ts index 4f8b7b98cd..2da25f87ba 100644 --- a/tests/cases/fourslash/server/rename.ts +++ b/tests/cases/fourslash/server/rename.ts @@ -1,4 +1,4 @@ -/// +/// /////// diff --git a/tests/cases/fourslash/server/signatureHelp.ts b/tests/cases/fourslash/server/signatureHelp.ts index 294df367f0..73303ecce4 100644 --- a/tests/cases/fourslash/server/signatureHelp.ts +++ b/tests/cases/fourslash/server/signatureHelp.ts @@ -1,4 +1,4 @@ -/// +/// ////function foo(data: number) { ////} From de0347fa0f5da14873ae64fa988ed179b6a2d245 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:39:13 -0700 Subject: [PATCH 3/9] Rename tests. --- tests/cases/fourslash/server/{brace.ts => brace01.ts} | 0 tests/cases/fourslash/server/{completions.ts => completions01.ts} | 0 .../cases/fourslash/server/{completions2.ts => completions02.ts} | 0 tests/cases/fourslash/server/{definition.ts => definition01.ts} | 0 tests/cases/fourslash/server/{format.ts => format01.ts} | 0 tests/cases/fourslash/server/{formatonkey.ts => formatonkey01.ts} | 0 tests/cases/fourslash/server/{navbar.ts => navbar01.ts} | 0 tests/cases/fourslash/server/{navto.ts => navto01.ts} | 0 tests/cases/fourslash/server/{quickinfo.ts => quickinfo01.ts} | 0 tests/cases/fourslash/server/{references.ts => references01.ts} | 0 tests/cases/fourslash/server/{rename.ts => rename01.ts} | 0 .../fourslash/server/{signatureHelp.ts => signatureHelp01.ts} | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename tests/cases/fourslash/server/{brace.ts => brace01.ts} (100%) rename tests/cases/fourslash/server/{completions.ts => completions01.ts} (100%) rename tests/cases/fourslash/server/{completions2.ts => completions02.ts} (100%) rename tests/cases/fourslash/server/{definition.ts => definition01.ts} (100%) rename tests/cases/fourslash/server/{format.ts => format01.ts} (100%) rename tests/cases/fourslash/server/{formatonkey.ts => formatonkey01.ts} (100%) rename tests/cases/fourslash/server/{navbar.ts => navbar01.ts} (100%) rename tests/cases/fourslash/server/{navto.ts => navto01.ts} (100%) rename tests/cases/fourslash/server/{quickinfo.ts => quickinfo01.ts} (100%) rename tests/cases/fourslash/server/{references.ts => references01.ts} (100%) rename tests/cases/fourslash/server/{rename.ts => rename01.ts} (100%) rename tests/cases/fourslash/server/{signatureHelp.ts => signatureHelp01.ts} (100%) diff --git a/tests/cases/fourslash/server/brace.ts b/tests/cases/fourslash/server/brace01.ts similarity index 100% rename from tests/cases/fourslash/server/brace.ts rename to tests/cases/fourslash/server/brace01.ts diff --git a/tests/cases/fourslash/server/completions.ts b/tests/cases/fourslash/server/completions01.ts similarity index 100% rename from tests/cases/fourslash/server/completions.ts rename to tests/cases/fourslash/server/completions01.ts diff --git a/tests/cases/fourslash/server/completions2.ts b/tests/cases/fourslash/server/completions02.ts similarity index 100% rename from tests/cases/fourslash/server/completions2.ts rename to tests/cases/fourslash/server/completions02.ts diff --git a/tests/cases/fourslash/server/definition.ts b/tests/cases/fourslash/server/definition01.ts similarity index 100% rename from tests/cases/fourslash/server/definition.ts rename to tests/cases/fourslash/server/definition01.ts diff --git a/tests/cases/fourslash/server/format.ts b/tests/cases/fourslash/server/format01.ts similarity index 100% rename from tests/cases/fourslash/server/format.ts rename to tests/cases/fourslash/server/format01.ts diff --git a/tests/cases/fourslash/server/formatonkey.ts b/tests/cases/fourslash/server/formatonkey01.ts similarity index 100% rename from tests/cases/fourslash/server/formatonkey.ts rename to tests/cases/fourslash/server/formatonkey01.ts diff --git a/tests/cases/fourslash/server/navbar.ts b/tests/cases/fourslash/server/navbar01.ts similarity index 100% rename from tests/cases/fourslash/server/navbar.ts rename to tests/cases/fourslash/server/navbar01.ts diff --git a/tests/cases/fourslash/server/navto.ts b/tests/cases/fourslash/server/navto01.ts similarity index 100% rename from tests/cases/fourslash/server/navto.ts rename to tests/cases/fourslash/server/navto01.ts diff --git a/tests/cases/fourslash/server/quickinfo.ts b/tests/cases/fourslash/server/quickinfo01.ts similarity index 100% rename from tests/cases/fourslash/server/quickinfo.ts rename to tests/cases/fourslash/server/quickinfo01.ts diff --git a/tests/cases/fourslash/server/references.ts b/tests/cases/fourslash/server/references01.ts similarity index 100% rename from tests/cases/fourslash/server/references.ts rename to tests/cases/fourslash/server/references01.ts diff --git a/tests/cases/fourslash/server/rename.ts b/tests/cases/fourslash/server/rename01.ts similarity index 100% rename from tests/cases/fourslash/server/rename.ts rename to tests/cases/fourslash/server/rename01.ts diff --git a/tests/cases/fourslash/server/signatureHelp.ts b/tests/cases/fourslash/server/signatureHelp01.ts similarity index 100% rename from tests/cases/fourslash/server/signatureHelp.ts rename to tests/cases/fourslash/server/signatureHelp01.ts From a6788d22ef79f35e7c61a19d5055ca205e0e8eeb Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Tue, 7 Apr 2015 23:53:47 -0700 Subject: [PATCH 4/9] Added occurrences tests. --- tests/cases/fourslash/server/occurrences01.ts | 27 +++++++++++++++++++ tests/cases/fourslash/server/occurrences02.ts | 16 +++++++++++ 2 files changed, 43 insertions(+) create mode 100644 tests/cases/fourslash/server/occurrences01.ts create mode 100644 tests/cases/fourslash/server/occurrences02.ts diff --git a/tests/cases/fourslash/server/occurrences01.ts b/tests/cases/fourslash/server/occurrences01.ts new file mode 100644 index 0000000000..62f445ac69 --- /dev/null +++ b/tests/cases/fourslash/server/occurrences01.ts @@ -0,0 +1,27 @@ +/// + +////foo: [|switch|] (10) { +//// [|case|] 1: +//// [|case|] 2: +//// [|case|] 3: +//// [|break|]; +//// [|break|] foo; +//// co/*1*/ntinue; +//// contin/*2*/ue foo; +////} + +let ranges = test.ranges(); + +for (let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for (let range of ranges) { + verify.occurrencesAtPositionContains(range, false); + } +} + +for (let m of test.markers()) { + goTo.position(m.position); + verify.occurrencesAtPositionCount(0); +} \ No newline at end of file diff --git a/tests/cases/fourslash/server/occurrences02.ts b/tests/cases/fourslash/server/occurrences02.ts new file mode 100644 index 0000000000..511e7887c2 --- /dev/null +++ b/tests/cases/fourslash/server/occurrences02.ts @@ -0,0 +1,16 @@ +/// + +////function [|f|](x: typeof [|f|]) { +//// [|f|]([|f|]); +////} + +let ranges = test.ranges(); + +for (let r of ranges) { + goTo.position(r.start); + verify.occurrencesAtPositionCount(ranges.length); + + for (let range of ranges) { + verify.occurrencesAtPositionContains(range, false); + } +} \ No newline at end of file From 93bb224545ec753bb4c40190dd811d365b48fcb4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 00:35:34 -0700 Subject: [PATCH 5/9] Actually implemented the session-side logic. --- src/server/session.ts | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/src/server/session.ts b/src/server/session.ts index f35235554e..9c77747f34 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -285,6 +285,36 @@ module ts.server { })); } + getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[] { + fileName = ts.normalizePath(fileName); + let project = this.projectService.getProjectForFile(fileName); + + if (!project) { + throw Errors.NoProject; + } + + let { compilerService } = project; + let position = compilerService.host.lineOffsetToPosition(fileName, line, offset); + + let occurrences = compilerService.languageService.getOccurrencesAtPosition(fileName, position); + + if (!occurrences) { + return undefined; + } + + return occurrences.map(occurrence => { + let { fileName, isWriteAccess, textSpan } = occurrence; + let start = compilerService.host.positionToLineOffset(fileName, textSpan.start); + let end = compilerService.host.positionToLineOffset(fileName, ts.textSpanEnd(textSpan)); + return { + start, + end, + file: fileName, + isWriteAccess + } + }); + } + getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -379,7 +409,7 @@ module ts.server { var nameSpan = nameInfo.textSpan; var nameColStart = compilerService.host.positionToLineOffset(file, nameSpan.start).offset; var nameText = compilerService.host.getScriptSnapshot(file).getText(nameSpan.start, ts.textSpanEnd(nameSpan)); - var bakedRefs: protocol.ReferencesResponseItem[] = references.map((ref) => { + var bakedRefs: protocol.ReferencesResponseItem[] = references.map(ref => { var start = compilerService.host.positionToLineOffset(ref.fileName, ref.textSpan.start); var refLineSpan = compilerService.host.lineToTextSpan(ref.fileName, start.line - 1); var snap = compilerService.host.getScriptSnapshot(ref.fileName); @@ -885,6 +915,10 @@ module ts.server { response = this.getNavigationBarItems(navBarArgs.file); break; } + case CommandNames.Occurrences: { + var occurrencesArgs = request.arguments; + response = this + } default: { this.projectService.log("Unrecognized JSON command: " + message); this.output(undefined, CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); From d8d494d4da42d8b79902affd39140f19b34acd62 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 00:41:12 -0700 Subject: [PATCH 6/9] *Actually dispatched* on the logic. --- src/server/session.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index 9c77747f34..faedce0e1a 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -916,8 +916,9 @@ module ts.server { break; } case CommandNames.Occurrences: { - var occurrencesArgs = request.arguments; - response = this + var { line, offset, file: fileName } = request.arguments; + response = this.getOccurrences(line, offset, fileName); + break; } default: { this.projectService.log("Unrecognized JSON command: " + message); From 81d62cf57d5ce411cc17883c455de6e48d5caa44 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 01:09:54 -0700 Subject: [PATCH 7/9] Fixed 'isWriteAccess' check. --- tests/cases/fourslash/server/occurrences02.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/cases/fourslash/server/occurrences02.ts b/tests/cases/fourslash/server/occurrences02.ts index 511e7887c2..e0d39cb92f 100644 --- a/tests/cases/fourslash/server/occurrences02.ts +++ b/tests/cases/fourslash/server/occurrences02.ts @@ -11,6 +11,6 @@ for (let r of ranges) { verify.occurrencesAtPositionCount(ranges.length); for (let range of ranges) { - verify.occurrencesAtPositionContains(range, false); + verify.occurrencesAtPositionContains(range); } } \ No newline at end of file From 12ccdb63dbd795ab4ecec98968bdb3fde4dc427a Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 01:19:45 -0700 Subject: [PATCH 8/9] Apparently our server tests can't handle negative tests. --- src/server/client.ts | 2 +- tests/cases/fourslash/server/occurrences01.ts | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/src/server/client.ts b/src/server/client.ts index dfda9f23ed..3306bd5a9d 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -104,7 +104,7 @@ module ts.server { var response: T = JSON.parse(responseBody); } catch (e) { - throw new Error("Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error detailes: " + e.message); + throw new Error("Malformed response: Failed to parse server response: " + lastMessage + ". \r\n Error details: " + e.message); } // verify the sequence numbers diff --git a/tests/cases/fourslash/server/occurrences01.ts b/tests/cases/fourslash/server/occurrences01.ts index 62f445ac69..db2fa64f38 100644 --- a/tests/cases/fourslash/server/occurrences01.ts +++ b/tests/cases/fourslash/server/occurrences01.ts @@ -6,8 +6,8 @@ //// [|case|] 3: //// [|break|]; //// [|break|] foo; -//// co/*1*/ntinue; -//// contin/*2*/ue foo; +//// continue; +//// continue foo; ////} let ranges = test.ranges(); @@ -17,11 +17,6 @@ for (let r of ranges) { verify.occurrencesAtPositionCount(ranges.length); for (let range of ranges) { - verify.occurrencesAtPositionContains(range, false); + verify.occurrencesAtPositionContains(range, /*isWriteAccess*/ false); } -} - -for (let m of test.markers()) { - goTo.position(m.position); - verify.occurrencesAtPositionCount(0); } \ No newline at end of file From 180f17d088215da098612f9f5b37d8ecc0ef058f Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Wed, 8 Apr 2015 17:02:42 -0700 Subject: [PATCH 9/9] Destructure arguments at dispatched calls. --- src/server/session.ts | 114 +++++++++++++++++------------------------- 1 file changed, 45 insertions(+), 69 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index faedce0e1a..09373d6bf9 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -118,7 +118,7 @@ module ts.server { constructor(private host: ServerHost, private logger: Logger) { this.projectService = - new ProjectService(host, logger, (eventName,project,fileName) => { + new ProjectService(host, logger, (eventName, project, fileName) => { this.handleEvent(eventName, project, fileName); }); } @@ -263,7 +263,7 @@ module ts.server { } } - getDefinition(line: number, offset: number, fileName: string): protocol.FileSpan[] { + getDefinition({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.FileSpan[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -285,7 +285,7 @@ module ts.server { })); } - getOccurrences(line: number, offset: number, fileName: string): protocol.OccurrencesResponseItem[] { + getOccurrences({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.OccurrencesResponseItem[] { fileName = ts.normalizePath(fileName); let project = this.projectService.getProjectForFile(fileName); @@ -315,7 +315,7 @@ module ts.server { }); } - getRenameLocations(line: number, offset: number, fileName: string,findInComments: boolean, findInStrings: boolean): protocol.RenameResponseBody { + getRenameLocations({line, offset, file: fileName, findInComments, findInStrings }: protocol.RenameRequestArgs): protocol.RenameResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -383,7 +383,7 @@ module ts.server { return { info: renameInfo, locs: bakedRenameLocs }; } - getReferences(line: number, offset: number, fileName: string): protocol.ReferencesResponseBody { + getReferences({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.ReferencesResponseBody { // TODO: get all projects for this file; report refs for all projects deleting duplicates // can avoid duplicates by eliminating same ref file from subsequent projects var file = ts.normalizePath(fileName); @@ -430,12 +430,12 @@ module ts.server { }; } - openClientFile(fileName: string) { + openClientFile({ file: fileName }: protocol.OpenRequestArgs) { var file = ts.normalizePath(fileName); this.projectService.openClientFile(file); } - getQuickInfo(line: number, offset: number, fileName: string): protocol.QuickInfoResponseBody { + getQuickInfo({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.QuickInfoResponseBody { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -461,7 +461,7 @@ module ts.server { }; } - getFormattingEditsForRange(line: number, offset: number, endLine: number, endOffset: number, fileName: string): protocol.CodeEdit[] { + getFormattingEditsForRange({line, offset, endLine, endOffset, file: fileName}: protocol.FormatRequestArgs): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -488,7 +488,7 @@ module ts.server { }); } - getFormattingEditsAfterKeystroke(line: number, offset: number, key: string, fileName: string): protocol.CodeEdit[] { + getFormattingEditsAfterKeystroke({line, offset, key, file: fileName}: protocol.FormatOnKeyRequestArgs): protocol.CodeEdit[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -561,7 +561,7 @@ module ts.server { }); } - getCompletions(line: number, offset: number, prefix: string, fileName: string): protocol.CompletionEntry[] { + getCompletions({ line, offset, prefix, file: fileName}: protocol.CompletionsRequestArgs): protocol.CompletionEntry[] { if (!prefix) { prefix = ""; } @@ -587,8 +587,7 @@ module ts.server { }, []).sort((a, b) => a.name.localeCompare(b.name)); } - getCompletionEntryDetails(line: number, offset: number, - entryNames: string[], fileName: string): protocol.CompletionEntryDetails[] { + getCompletionEntryDetails({ line, offset, entryNames, file: fileName}: protocol.CompletionDetailsRequestArgs): protocol.CompletionEntryDetails[] { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -607,20 +606,20 @@ module ts.server { }, []); } - getSignatureHelpItems(line: number, offset: number, fileName: string): protocol.SignatureHelpItems { + getSignatureHelpItems({ line, offset, file: fileName }: protocol.SignatureHelpRequestArgs): protocol.SignatureHelpItems { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { throw Errors.NoProject; } - + var compilerService = project.compilerService; var position = compilerService.host.lineOffsetToPosition(file, line, offset); var helpItems = compilerService.languageService.getSignatureHelpItems(file, position); if (!helpItems) { return undefined; } - + var span = helpItems.applicableSpan; var result: protocol.SignatureHelpItems = { items: helpItems.items, @@ -632,11 +631,11 @@ module ts.server { argumentIndex: helpItems.argumentIndex, argumentCount: helpItems.argumentCount, } - + return result; } - - getDiagnostics(delay: number, fileNames: string[]) { + + getDiagnostics({ delay, files: fileNames }: protocol.GeterrRequestArgs): void { var checkList = fileNames.reduce((accum: PendingErrorCheck[], fileName: string) => { fileName = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(fileName); @@ -647,11 +646,11 @@ module ts.server { }, []); if (checkList.length > 0) { - this.updateErrorCheck(checkList, this.changeSeq,(n) => n == this.changeSeq, delay) + this.updateErrorCheck(checkList, this.changeSeq, (n) => n == this.changeSeq, delay) } } - change(line: number, offset: number, endLine: number, endOffset: number, insertString: string, fileName: string) { + change({ line, offset, endLine, endOffset, insertString, file: fileName }: protocol.ChangeRequestArgs): void { var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (project) { @@ -666,7 +665,7 @@ module ts.server { } } - reload(fileName: string, tempFileName: string, reqSeq = 0) { + reload({ file: fileName, tmpfile: tempFileName }: protocol.ReloadRequestArgs, reqSeq = 0): void { var file = ts.normalizePath(fileName); var tmpfile = ts.normalizePath(tempFileName); var project = this.projectService.getProjectForFile(file); @@ -679,7 +678,7 @@ module ts.server { } } - saveToTmp(fileName: string, tempFileName: string) { + saveToTmp({ file: fileName, tmpfile: tempFileName }: protocol.SavetoRequestArgs): void { var file = ts.normalizePath(fileName); var tmpfile = ts.normalizePath(tempFileName); @@ -689,7 +688,7 @@ module ts.server { } } - closeClientFile(fileName: string) { + closeClientFile({ file: fileName }: protocol.FileRequestArgs) { var file = ts.normalizePath(fileName); this.projectService.closeClientFile(file); } @@ -713,7 +712,7 @@ module ts.server { })); } - getNavigationBarItems(fileName: string): protocol.NavigationBarItem[] { + getNavigationBarItems({ file: fileName }: protocol.FileRequestArgs): protocol.NavigationBarItem[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -729,7 +728,7 @@ module ts.server { return this.decorateNavigationBarItem(project, fileName, items); } - getNavigateToItems(searchValue: string, fileName: string, maxResultCount?: number): protocol.NavtoItem[] { + getNavigateToItems({ searchValue, file: fileName, maxResultCount }: protocol.NavtoRequestArgs): protocol.NavtoItem[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); if (!project) { @@ -768,7 +767,7 @@ module ts.server { }); } - getBraceMatching(line: number, offset: number, fileName: string): protocol.TextSpan[] { + getBraceMatching({ line, offset, file: fileName }: protocol.FileLocationRequestArgs): protocol.TextSpan[]{ var file = ts.normalizePath(fileName); var project = this.projectService.getProjectForFile(file); @@ -810,114 +809,91 @@ module ts.server { break; } case CommandNames.Definition: { - var defArgs = request.arguments; - response = this.getDefinition(defArgs.line, defArgs.offset, defArgs.file); + response = this.getDefinition(request.arguments); break; } case CommandNames.References: { - var refArgs = request.arguments; - response = this.getReferences(refArgs.line, refArgs.offset, refArgs.file); + response = this.getReferences(request.arguments); break; } case CommandNames.Rename: { - var renameArgs = request.arguments; - response = this.getRenameLocations(renameArgs.line, renameArgs.offset, renameArgs.file, renameArgs.findInComments, renameArgs.findInStrings); + response = this.getRenameLocations(request.arguments); break; } case CommandNames.Open: { - var openArgs = request.arguments; - this.openClientFile(openArgs.file); + this.openClientFile(request.arguments); responseRequired = false; break; } case CommandNames.Quickinfo: { - var quickinfoArgs = request.arguments; - response = this.getQuickInfo(quickinfoArgs.line, quickinfoArgs.offset, quickinfoArgs.file); + response = this.getQuickInfo(request.arguments); break; } case CommandNames.Format: { - var formatArgs = request.arguments; - response = this.getFormattingEditsForRange(formatArgs.line, formatArgs.offset, formatArgs.endLine, formatArgs.endOffset, formatArgs.file); + response = this.getFormattingEditsForRange(request.arguments); break; } case CommandNames.Formatonkey: { - var formatOnKeyArgs = request.arguments; - response = this.getFormattingEditsAfterKeystroke(formatOnKeyArgs.line, formatOnKeyArgs.offset, formatOnKeyArgs.key, formatOnKeyArgs.file); + response = this.getFormattingEditsAfterKeystroke(request.arguments); break; } case CommandNames.Completions: { - var completionsArgs = request.arguments; - response = this.getCompletions(completionsArgs.line, completionsArgs.offset, completionsArgs.prefix, completionsArgs.file); + response = this.getCompletions(request.arguments); break; } case CommandNames.CompletionDetails: { - var completionDetailsArgs = request.arguments; - response = - this.getCompletionEntryDetails(completionDetailsArgs.line,completionDetailsArgs.offset, - completionDetailsArgs.entryNames,completionDetailsArgs.file); + response = this.getCompletionEntryDetails(request.arguments); break; } case CommandNames.SignatureHelp: { - var signatureHelpArgs = request.arguments; - response = this.getSignatureHelpItems(signatureHelpArgs.line, signatureHelpArgs.offset, signatureHelpArgs.file); + response = this.getSignatureHelpItems(request.arguments); break; } case CommandNames.Geterr: { - var geterrArgs = request.arguments; - response = this.getDiagnostics(geterrArgs.delay, geterrArgs.files); + this.getDiagnostics(request.arguments); responseRequired = false; break; } case CommandNames.Change: { - var changeArgs = request.arguments; - this.change(changeArgs.line, changeArgs.offset, changeArgs.endLine, changeArgs.endOffset, - changeArgs.insertString, changeArgs.file); + this.change(request.arguments); responseRequired = false; break; } case CommandNames.Configure: { - var configureArgs = request.arguments; - this.projectService.setHostConfiguration(configureArgs); + this.projectService.setHostConfiguration(request.arguments); this.output(undefined, CommandNames.Configure, request.seq); responseRequired = false; break; } case CommandNames.Reload: { - var reloadArgs = request.arguments; - this.reload(reloadArgs.file, reloadArgs.tmpfile, request.seq); + this.reload(request.arguments); responseRequired = false; break; } case CommandNames.Saveto: { - var savetoArgs = request.arguments; - this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); + this.saveToTmp(request.arguments); responseRequired = false; break; } case CommandNames.Close: { - var closeArgs = request.arguments; - this.closeClientFile(closeArgs.file); + this.closeClientFile(request.arguments); responseRequired = false; break; } case CommandNames.Navto: { - var navtoArgs = request.arguments; - response = this.getNavigateToItems(navtoArgs.searchValue, navtoArgs.file, navtoArgs.maxResultCount); + response = this.getNavigateToItems(request.arguments); break; } case CommandNames.Brace: { - var braceArguments = request.arguments; - response = this.getBraceMatching(braceArguments.line, braceArguments.offset, braceArguments.file); + response = this.getBraceMatching(request.arguments); break; } case CommandNames.NavBar: { - var navBarArgs = request.arguments; - response = this.getNavigationBarItems(navBarArgs.file); + response = this.getNavigationBarItems(request.arguments); break; } case CommandNames.Occurrences: { - var { line, offset, file: fileName } = request.arguments; - response = this.getOccurrences(line, offset, fileName); + response = this.getOccurrences(request.arguments); break; } default: {