diff --git a/extensions/typescript/src/features/codeActionProvider.ts b/extensions/typescript/src/features/codeActionProvider.ts index 925eac1fff4678432bc4b999be70a59c4d5d3ab6..76051c6e5058dcc9441eba6b15cb6b7b60cab6c9 100644 --- a/extensions/typescript/src/features/codeActionProvider.ts +++ b/extensions/typescript/src/features/codeActionProvider.ts @@ -7,7 +7,7 @@ import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionC import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, rangeToFileRange } from '../utils/convert'; interface NumberSet { [key: number]: boolean; @@ -68,11 +68,7 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider formattingOptions: formattingOptions }; const args: Proto.CodeFixRequestArgs = { - file: file, - startLine: range.start.line + 1, - endLine: range.end.line + 1, - startOffset: range.start.character + 1, - endOffset: range.end.character + 1, + ...rangeToFileRange(file, range), errorCodes: Array.from(supportedActions) }; const response = await this.client.execute('getCodeFixes', args, token); diff --git a/extensions/typescript/src/features/completionItemProvider.ts b/extensions/typescript/src/features/completionItemProvider.ts index 759642b929d8b540c1453e04578d3a21019c26dd..b225fa375c0e4e54fc9121ff068931ea64be5153 100644 --- a/extensions/typescript/src/features/completionItemProvider.ts +++ b/extensions/typescript/src/features/completionItemProvider.ts @@ -9,9 +9,9 @@ import { ITypescriptServiceClient } from '../typescriptService'; import TypingsStatus from '../utils/typingsStatus'; import * as PConst from '../protocol.const'; -import { CompletionEntry, CompletionsRequestArgs, CompletionDetailsRequestArgs, CompletionEntryDetails, FileLocationRequestArgs } from '../protocol'; +import { CompletionEntry, CompletionsRequestArgs, CompletionDetailsRequestArgs, CompletionEntryDetails } from '../protocol'; import * as Previewer from './previewer'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; import * as nls from 'vscode-nls'; let localize = nls.loadMessageBundle(); @@ -175,12 +175,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP if (!file) { return Promise.resolve([]); } - const args: CompletionsRequestArgs = { - file: file, - line: position.line + 1, - offset: position.character + 1 - }; - + const args: CompletionsRequestArgs = positionToFileLocation(file, position); return this.client.execute('completions', args, token).then((msg) => { // This info has to come from the tsserver. See https://github.com/Microsoft/TypeScript/issues/2831 // let isMemberCompletion = false; @@ -270,11 +265,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP } private isValidFunctionCompletionContext(filepath: string, position: Position): Promise { - const args: FileLocationRequestArgs = { - file: filepath, - line: position.line + 1, - offset: position.character + 1 - }; + const args = positionToFileLocation(filepath, position); // Workaround for https://github.com/Microsoft/TypeScript/issues/12677 // Don't complete function calls inside of destructive assigments or imports return this.client.execute('quickinfo', args).then(infoResponse => { diff --git a/extensions/typescript/src/features/definitionProviderBase.ts b/extensions/typescript/src/features/definitionProviderBase.ts index e137a1e3de793c5cdd2e6d2db49d8b4b4f2daa3b..7f241eadc6a17f72fff658e7fc571d1d8d97b170 100644 --- a/extensions/typescript/src/features/definitionProviderBase.ts +++ b/extensions/typescript/src/features/definitionProviderBase.ts @@ -7,7 +7,7 @@ import { TextDocument, Position, CancellationToken, Location } from 'vscode'; import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; export default class TypeScriptDefinitionProviderBase { constructor( @@ -23,11 +23,7 @@ export default class TypeScriptDefinitionProviderBase { if (!filepath) { return Promise.resolve(null); } - const args: Proto.FileLocationRequestArgs = { - file: filepath, - line: position.line + 1, - offset: position.character + 1 - }; + const args = positionToFileLocation(filepath, position); return this.client.execute(definitionType, args, token).then(response => { const locations: Proto.FileSpan[] = (response && response.body) || []; if (!locations || locations.length === 0) { diff --git a/extensions/typescript/src/features/documentHighlightProvider.ts b/extensions/typescript/src/features/documentHighlightProvider.ts index 97733afb1ce658e659a252e2aa89a77e77c28f9b..283a88ef8806140b3051a8224a0281bb5159872e 100644 --- a/extensions/typescript/src/features/documentHighlightProvider.ts +++ b/extensions/typescript/src/features/documentHighlightProvider.ts @@ -5,9 +5,8 @@ import { DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, TextDocument, Position, Range, CancellationToken } from 'vscode'; -import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; export default class TypeScriptDocumentHighlightProvider implements DocumentHighlightProvider { @@ -19,11 +18,7 @@ export default class TypeScriptDocumentHighlightProvider implements DocumentHigh if (!filepath) { return Promise.resolve([]); } - const args: Proto.FileLocationRequestArgs = { - file: filepath, - line: position.line + 1, - offset: position.character + 1 - }; + const args = positionToFileLocation(filepath, position); return this.client.execute('occurrences', args, token).then((response): DocumentHighlight[] => { let data = response.body; if (data && data.length) { diff --git a/extensions/typescript/src/features/hoverProvider.ts b/extensions/typescript/src/features/hoverProvider.ts index 89971ba5b61afc82810bfa8d2d24a4afab493778..693e990fe254f7a3e10792f0c7d92fe04250b76b 100644 --- a/extensions/typescript/src/features/hoverProvider.ts +++ b/extensions/typescript/src/features/hoverProvider.ts @@ -8,7 +8,7 @@ import { HoverProvider, Hover, TextDocument, Position, CancellationToken } from import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; import { tagsMarkdownPreview } from './previewer'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; export default class TypeScriptHoverProvider implements HoverProvider { @@ -20,12 +20,7 @@ export default class TypeScriptHoverProvider implements HoverProvider { if (!filepath) { return undefined; } - const args: Proto.FileLocationRequestArgs = { - file: filepath, - line: position.line + 1, - offset: position.character + 1 - }; - + const args = positionToFileLocation(filepath, position); try { const response = await this.client.execute('quickinfo', args, token); if (response && response.body) { diff --git a/extensions/typescript/src/features/implementationsCodeLensProvider.ts b/extensions/typescript/src/features/implementationsCodeLensProvider.ts index 9a6d1a79b42315543dc23ee34d0a8a8ecae13b1b..7890d6650848fc9ca2431ba0f391dab992ad83cd 100644 --- a/extensions/typescript/src/features/implementationsCodeLensProvider.ts +++ b/extensions/typescript/src/features/implementationsCodeLensProvider.ts @@ -9,7 +9,7 @@ import * as PConst from '../protocol.const'; import { TypeScriptBaseCodeLensProvider, ReferencesCodeLens } from './baseCodeLensProvider'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -36,11 +36,7 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise { const codeLens = inputCodeLens as ReferencesCodeLens; - const args: Proto.FileLocationRequestArgs = { - file: codeLens.file, - line: codeLens.range.start.line + 1, - offset: codeLens.range.start.character + 1 - }; + const args = positionToFileLocation(codeLens.file, codeLens.range.start); return this.client.execute('implementation', args, token).then(response => { if (!response || !response.body) { throw codeLens; diff --git a/extensions/typescript/src/features/jsDocCompletionProvider.ts b/extensions/typescript/src/features/jsDocCompletionProvider.ts index 50f0147cbc0ce2ba01e102c924dc7d3323faf8ea..c78116fb09e0241768d2a264f4c11cb3f4e37670 100644 --- a/extensions/typescript/src/features/jsDocCompletionProvider.ts +++ b/extensions/typescript/src/features/jsDocCompletionProvider.ts @@ -6,9 +6,10 @@ import { Position, Range, CompletionItemProvider, CompletionItemKind, TextDocument, CancellationToken, CompletionItem, window, Uri, ProviderResult, TextEditor, SnippetString, workspace } from 'vscode'; import { ITypescriptServiceClient } from '../typescriptService'; -import { FileLocationRequestArgs, DocCommandTemplateResponse } from '../protocol'; +import { DocCommandTemplateResponse } from '../protocol'; import * as nls from 'vscode-nls'; +import { positionToFileLocation } from '../utils/convert'; const localize = nls.loadMessageBundle(); const configurationNamespace = 'jsDocCompletion'; @@ -118,11 +119,7 @@ export class TryCompleteJsDocCommand { } private tryInsertJsDocFromTemplate(editor: TextEditor, file: string, position: Position): Promise { - const args: FileLocationRequestArgs = { - file: file, - line: position.line + 1, - offset: position.character + 1 - }; + const args = positionToFileLocation(file, position); return Promise.race([ this.lazyClient().execute('docCommentTemplate', args), new Promise((_, reject) => setTimeout(reject, 250)) diff --git a/extensions/typescript/src/features/refactorProvider.ts b/extensions/typescript/src/features/refactorProvider.ts index 563160640c9a8c8f4e9edd9fd563cb6a2d467451..a67ce08f2c71ca7da338b972accab855dba3e1c2 100644 --- a/extensions/typescript/src/features/refactorProvider.ts +++ b/extensions/typescript/src/features/refactorProvider.ts @@ -9,7 +9,7 @@ import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionC import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, rangeToFileRange } from '../utils/convert'; export default class TypeScriptRefactorProvider implements CodeActionProvider { @@ -43,14 +43,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider { return []; } - const args: Proto.GetApplicableRefactorsRequestArgs = { - file: file, - startLine: range.start.line + 1, - startOffset: range.start.character + 1, - endLine: range.end.line + 1, - endOffset: range.end.character + 1 - }; - + const args: Proto.GetApplicableRefactorsRequestArgs = rangeToFileRange(file, range); try { const response = await this.client.execute('getApplicableRefactors', args, token); if (!response || !response.body) { @@ -107,13 +100,9 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider { private async doRefactoring(file: string, refactor: string, action: string, range: Range): Promise { const args: Proto.GetEditsForRefactorRequestArgs = { - file, + ...rangeToFileRange(file, range), refactor, - action, - startLine: range.start.line + 1, - startOffset: range.start.character + 1, - endLine: range.end.line + 1, - endOffset: range.end.character + 1 + action }; const response = await this.client.execute('getEditsForRefactor', args); diff --git a/extensions/typescript/src/features/referenceProvider.ts b/extensions/typescript/src/features/referenceProvider.ts index b6af1f230338d85a783476958606ee6826f337d1..4e4847b110659047c798e782231820cb4987ff42 100644 --- a/extensions/typescript/src/features/referenceProvider.ts +++ b/extensions/typescript/src/features/referenceProvider.ts @@ -5,9 +5,8 @@ import { ReferenceProvider, Location, TextDocument, Position, CancellationToken } from 'vscode'; -import * as Proto from '../protocol'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; export default class TypeScriptReferenceSupport implements ReferenceProvider { public constructor( @@ -18,11 +17,7 @@ export default class TypeScriptReferenceSupport implements ReferenceProvider { if (!filepath) { return Promise.resolve([]); } - const args: Proto.FileLocationRequestArgs = { - file: filepath, - line: position.line + 1, - offset: position.character + 1 - }; + const args = positionToFileLocation(filepath, position); const apiVersion = this.client.apiVersion; return this.client.execute('references', args, token).then((msg) => { const result: Location[] = []; diff --git a/extensions/typescript/src/features/referencesCodeLensProvider.ts b/extensions/typescript/src/features/referencesCodeLensProvider.ts index 40c56f48df90d2b6cf643e3ed933ca34308b3321..11cd28b7ef7c52ebc6a0c27c00d3ef0a698a5f2f 100644 --- a/extensions/typescript/src/features/referencesCodeLensProvider.ts +++ b/extensions/typescript/src/features/referencesCodeLensProvider.ts @@ -9,7 +9,7 @@ import * as PConst from '../protocol.const'; import { TypeScriptBaseCodeLensProvider, ReferencesCodeLens } from './baseCodeLensProvider'; import { ITypescriptServiceClient } from '../typescriptService'; -import { textSpanToRange } from '../utils/convert'; +import { textSpanToRange, positionToFileLocation } from '../utils/convert'; import * as nls from 'vscode-nls'; const localize = nls.loadMessageBundle(); @@ -36,11 +36,7 @@ export default class TypeScriptReferencesCodeLensProvider extends TypeScriptBase resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise { const codeLens = inputCodeLens as ReferencesCodeLens; - const args: Proto.FileLocationRequestArgs = { - file: codeLens.file, - line: codeLens.range.start.line + 1, - offset: codeLens.range.start.character + 1 - }; + const args = positionToFileLocation(codeLens.file, codeLens.range.start); return this.client.execute('references', args, token).then(response => { if (!response || !response.body) { throw codeLens; diff --git a/extensions/typescript/src/utils/convert.ts b/extensions/typescript/src/utils/convert.ts index 92511d1fb1afaa4a9ac9f94b8c8216463e0cd641..40e2dbef7b1f825b316f7868218da649e9a088fd 100644 --- a/extensions/typescript/src/utils/convert.ts +++ b/extensions/typescript/src/utils/convert.ts @@ -3,12 +3,25 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import { Range } from 'vscode'; - +import * as vscode from 'vscode'; import * as Proto from '../protocol'; export const textSpanToRange = (span: Proto.TextSpan) => - new Range( + new vscode.Range( span.start.line - 1, span.start.offset - 1, - span.end.line - 1, span.end.offset - 1); \ No newline at end of file + span.end.line - 1, span.end.offset - 1); + +export const positionToFileLocation = (file: string, position: vscode.Position): Proto.FileLocationRequestArgs => ({ + file, + line: position.line + 1, + offset: position.character + 1 +}); + +export const rangeToFileRange = (file: string, range: vscode.Range): Proto.FileRangeRequestArgs => ({ + file, + startLine: range.start.line + 1, + startOffset: range.start.character + 1, + endLine: range.end.line + 1, + endOffset: range.end.character + 1 +}); \ No newline at end of file