提交 f1043f2b 编写于 作者: M Matt Bierner

Continue moving vs loc to ts loc location into single set of functions

上级 703e7408
......@@ -7,7 +7,7 @@ import { CodeLensProvider, CodeLens, CancellationToken, TextDocument, Range, Uri
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange } from '../utils/convert';
import { tsTextSpanToVsRange } from '../utils/convert';
export class ReferencesCodeLens extends CodeLens {
constructor(
......@@ -100,7 +100,7 @@ export abstract class TypeScriptBaseCodeLensProvider implements CodeLensProvider
return null;
}
const range = textSpanToRange(span);
const range = tsTextSpanToVsRange(span);
const text = document.getText(range);
const identifierMatch = new RegExp(`^(.*?(\\b|\\W))${(item.text || '').replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&')}(\\b|\\W)`, 'gm');
......
......@@ -7,7 +7,7 @@ import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionC
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, rangeToFileRange } from '../utils/convert';
import { tsTextSpanToVsRange, vsRangeToTsFileRange } from '../utils/convert';
interface NumberSet {
[key: number]: boolean;
......@@ -68,7 +68,7 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider
formattingOptions: formattingOptions
};
const args: Proto.CodeFixRequestArgs = {
...rangeToFileRange(file, range),
...vsRangeToTsFileRange(file, range),
errorCodes: Array.from(supportedActions)
};
const response = await this.client.execute('getCodeFixes', args, token);
......@@ -109,7 +109,7 @@ export default class TypeScriptCodeActionProvider implements CodeActionProvider
for (const change of action.changes) {
for (const textChange of change.textChanges) {
workspaceEdit.replace(this.client.asUrl(change.fileName),
textSpanToRange(textChange),
tsTextSpanToVsRange(textChange),
textChange.newText);
}
}
......
......@@ -11,7 +11,7 @@ import TypingsStatus from '../utils/typingsStatus';
import * as PConst from '../protocol.const';
import { CompletionEntry, CompletionsRequestArgs, CompletionDetailsRequestArgs, CompletionEntryDetails } from '../protocol';
import * as Previewer from './previewer';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
import * as nls from 'vscode-nls';
let localize = nls.loadMessageBundle();
......@@ -33,7 +33,7 @@ class MyCompletionItem extends CompletionItem {
let span: protocol.TextSpan = entry.replacementSpan;
// The indexing for the range returned by the server uses 1-based indexing.
// We convert to 0-based indexing.
this.textEdit = TextEdit.replace(textSpanToRange(span), entry.name);
this.textEdit = TextEdit.replace(tsTextSpanToVsRange(span), entry.name);
} else {
// Try getting longer, prefix based range for completions that span words
const wordRange = document.getWordRangeAtPosition(position);
......@@ -175,7 +175,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP
if (!file) {
return Promise.resolve<CompletionItem[]>([]);
}
const args: CompletionsRequestArgs = positionToFileLocation(file, position);
const args: CompletionsRequestArgs = vsPositionToTsFileLocation(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;
......@@ -234,9 +234,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP
return null;
}
const args: CompletionDetailsRequestArgs = {
file: filepath,
line: item.position.line + 1,
offset: item.position.character + 1,
...vsPositionToTsFileLocation(filepath, item.position),
entryNames: [item.label]
};
return this.client.execute('completionEntryDetails', args, token).then((response) => {
......@@ -265,7 +263,7 @@ export default class TypeScriptCompletionItemProvider implements CompletionItemP
}
private isValidFunctionCompletionContext(filepath: string, position: Position): Promise<boolean> {
const args = positionToFileLocation(filepath, position);
const args = vsPositionToTsFileLocation(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 => {
......
......@@ -7,7 +7,7 @@ import { TextDocument, Position, CancellationToken, Location } from 'vscode';
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptDefinitionProviderBase {
constructor(
......@@ -23,7 +23,7 @@ export default class TypeScriptDefinitionProviderBase {
if (!filepath) {
return Promise.resolve(null);
}
const args = positionToFileLocation(filepath, position);
const args = vsPositionToTsFileLocation(filepath, position);
return this.client.execute(definitionType, args, token).then(response => {
const locations: Proto.FileSpan[] = (response && response.body) || [];
if (!locations || locations.length === 0) {
......@@ -34,7 +34,7 @@ export default class TypeScriptDefinitionProviderBase {
if (resource === null) {
return null;
} else {
return new Location(resource, textSpanToRange(location));
return new Location(resource, tsTextSpanToVsRange(location));
}
}).filter(x => x !== null) as Location[];
}, () => {
......
......@@ -6,7 +6,7 @@
import { DocumentHighlightProvider, DocumentHighlight, DocumentHighlightKind, TextDocument, Position, Range, CancellationToken } from 'vscode';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptDocumentHighlightProvider implements DocumentHighlightProvider {
......@@ -18,7 +18,7 @@ export default class TypeScriptDocumentHighlightProvider implements DocumentHigh
if (!filepath) {
return Promise.resolve<DocumentHighlight[]>([]);
}
const args = positionToFileLocation(filepath, position);
const args = vsPositionToTsFileLocation(filepath, position);
return this.client.execute('occurrences', args, token).then((response): DocumentHighlight[] => {
let data = response.body;
if (data && data.length) {
......@@ -35,7 +35,7 @@ export default class TypeScriptDocumentHighlightProvider implements DocumentHigh
}
return data.map(item =>
new DocumentHighlight(
textSpanToRange(item),
tsTextSpanToVsRange(item),
item.isWriteAccess ? DocumentHighlightKind.Write : DocumentHighlightKind.Read));
}
return [];
......
......@@ -8,7 +8,7 @@ import { DocumentSymbolProvider, SymbolInformation, SymbolKind, TextDocument, Lo
import * as Proto from '../protocol';
import * as PConst from '../protocol.const';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange } from '../utils/convert';
import { tsTextSpanToVsRange } from '../utils/convert';
const outlineTypeTable: { [kind: string]: SymbolKind } = Object.create(null);
outlineTypeTable[PConst.Kind.module] = SymbolKind.Module;
......@@ -71,7 +71,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
let result = new SymbolInformation(item.text,
outlineTypeTable[item.kind as string] || SymbolKind.Variable,
containerLabel ? containerLabel : '',
new Location(resource, textSpanToRange(item.spans[0])));
new Location(resource, tsTextSpanToVsRange(item.spans[0])));
foldingMap[key] = result;
bucket.push(result);
}
......@@ -86,7 +86,7 @@ export default class TypeScriptDocumentSymbolProvider implements DocumentSymbolP
const result = new SymbolInformation(item.text,
outlineTypeTable[item.kind as string] || SymbolKind.Variable,
containerLabel ? containerLabel : '',
new Location(resource, textSpanToRange(item.spans[0]))
new Location(resource, tsTextSpanToVsRange(item.spans[0]))
);
if (item.childItems && item.childItems.length > 0) {
for (const child of item.childItems) {
......
......@@ -7,7 +7,7 @@ import { workspace as Workspace, DocumentRangeFormattingEditProvider, OnTypeForm
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange } from '../utils/convert';
import { tsTextSpanToVsRange } from '../utils/convert';
interface Configuration {
enable: boolean;
......@@ -206,7 +206,7 @@ export class TypeScriptFormattingProvider implements DocumentRangeFormattingEdit
}
private codeEdit2SingleEditOperation(edit: Proto.CodeEdit): TextEdit {
return new TextEdit(textSpanToRange(edit), edit.newText);
return new TextEdit(tsTextSpanToVsRange(edit), edit.newText);
}
private getFormatOptions(options: FormattingOptions): Proto.FormatCodeSettings {
......
......@@ -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, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptHoverProvider implements HoverProvider {
......@@ -20,14 +20,14 @@ export default class TypeScriptHoverProvider implements HoverProvider {
if (!filepath) {
return undefined;
}
const args = positionToFileLocation(filepath, position);
const args = vsPositionToTsFileLocation(filepath, position);
try {
const response = await this.client.execute('quickinfo', args, token);
if (response && response.body) {
const data = response.body;
return new Hover(
TypeScriptHoverProvider.getContents(data),
textSpanToRange(data));
tsTextSpanToVsRange(data));
}
} catch (e) {
// noop
......
......@@ -9,7 +9,7 @@ import * as PConst from '../protocol.const';
import { TypeScriptBaseCodeLensProvider, ReferencesCodeLens } from './baseCodeLensProvider';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
......@@ -36,7 +36,7 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip
resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise<CodeLens> {
const codeLens = inputCodeLens as ReferencesCodeLens;
const args = positionToFileLocation(codeLens.file, codeLens.range.start);
const args = vsPositionToTsFileLocation(codeLens.file, codeLens.range.start);
return this.client.execute('implementation', args, token).then(response => {
if (!response || !response.body) {
throw codeLens;
......@@ -47,7 +47,7 @@ export default class TypeScriptImplementationsCodeLensProvider extends TypeScrip
// Only take first line on implementation: https://github.com/Microsoft/vscode/issues/23924
new Location(this.client.asUrl(reference.file),
reference.start.line === reference.end.line
? textSpanToRange(reference)
? tsTextSpanToVsRange(reference)
: new Range(
reference.start.line - 1, reference.start.offset - 1,
reference.start.line, 0)))
......
......@@ -9,7 +9,7 @@ import { ITypescriptServiceClient } from '../typescriptService';
import { DocCommandTemplateResponse } from '../protocol';
import * as nls from 'vscode-nls';
import { positionToFileLocation } from '../utils/convert';
import { vsPositionToTsFileLocation } from '../utils/convert';
const localize = nls.loadMessageBundle();
const configurationNamespace = 'jsDocCompletion';
......@@ -119,7 +119,7 @@ export class TryCompleteJsDocCommand {
}
private tryInsertJsDocFromTemplate(editor: TextEditor, file: string, position: Position): Promise<boolean> {
const args = positionToFileLocation(file, position);
const args = vsPositionToTsFileLocation(file, position);
return Promise.race([
this.lazyClient().execute('docCommentTemplate', args),
new Promise((_, reject) => setTimeout(reject, 250))
......
......@@ -5,11 +5,11 @@
'use strict';
import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionContext, Command, commands, workspace, WorkspaceEdit, window, QuickPickItem, Selection, Position } from 'vscode';
import { CodeActionProvider, TextDocument, Range, CancellationToken, CodeActionContext, Command, commands, workspace, WorkspaceEdit, window, QuickPickItem, Selection } from 'vscode';
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, rangeToFileRange } from '../utils/convert';
import { tsTextSpanToVsRange, vsRangeToTsFileRange, tsLocationToVsPosition } from '../utils/convert';
export default class TypeScriptRefactorProvider implements CodeActionProvider {
......@@ -25,7 +25,6 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
commands.registerCommand(this.doRefactorCommandId, this.doRefactoring, this);
commands.registerCommand(this.selectRefactorCommandId, this.selectRefactoring, this);
}
public async provideCodeActions(
......@@ -43,7 +42,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
return [];
}
const args: Proto.GetApplicableRefactorsRequestArgs = rangeToFileRange(file, range);
const args: Proto.GetApplicableRefactorsRequestArgs = vsRangeToTsFileRange(file, range);
try {
const response = await this.client.execute('getApplicableRefactors', args, token);
if (!response || !response.body) {
......@@ -79,7 +78,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
for (const edit of edits) {
for (const textChange of edit.textChanges) {
workspaceEdit.replace(this.client.asUrl(edit.fileName),
textSpanToRange(textChange),
tsTextSpanToVsRange(textChange),
textChange.newText);
}
}
......@@ -100,7 +99,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
private async doRefactoring(file: string, refactor: string, action: string, range: Range): Promise<boolean> {
const args: Proto.GetEditsForRefactorRequestArgs = {
...rangeToFileRange(file, range),
...vsRangeToTsFileRange(file, range),
refactor,
action
};
......@@ -118,7 +117,7 @@ export default class TypeScriptRefactorProvider implements CodeActionProvider {
const renameLocation = response.body.renameLocation;
if (renameLocation) {
if (window.activeTextEditor && window.activeTextEditor.document.uri.fsPath === file) {
const pos = new Position(renameLocation.line - 1, renameLocation.offset - 1);
const pos = tsLocationToVsPosition(renameLocation);
window.activeTextEditor.selection = new Selection(pos, pos);
await commands.executeCommand('editor.action.rename');
}
......
......@@ -6,7 +6,7 @@
import { ReferenceProvider, Location, TextDocument, Position, CancellationToken } from 'vscode';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptReferenceSupport implements ReferenceProvider {
public constructor(
......@@ -17,7 +17,7 @@ export default class TypeScriptReferenceSupport implements ReferenceProvider {
if (!filepath) {
return Promise.resolve<Location[]>([]);
}
const args = positionToFileLocation(filepath, position);
const args = vsPositionToTsFileLocation(filepath, position);
const apiVersion = this.client.apiVersion;
return this.client.execute('references', args, token).then((msg) => {
const result: Location[] = [];
......@@ -31,7 +31,7 @@ export default class TypeScriptReferenceSupport implements ReferenceProvider {
continue;
}
const url = this.client.asUrl(ref.file);
const location = new Location(url, textSpanToRange(ref));
const location = new Location(url, tsTextSpanToVsRange(ref));
result.push(location);
}
return result;
......
......@@ -9,7 +9,7 @@ import * as PConst from '../protocol.const';
import { TypeScriptBaseCodeLensProvider, ReferencesCodeLens } from './baseCodeLensProvider';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange, positionToFileLocation } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
import * as nls from 'vscode-nls';
const localize = nls.loadMessageBundle();
......@@ -36,7 +36,7 @@ export default class TypeScriptReferencesCodeLensProvider extends TypeScriptBase
resolveCodeLens(inputCodeLens: CodeLens, token: CancellationToken): Promise<CodeLens> {
const codeLens = inputCodeLens as ReferencesCodeLens;
const args = positionToFileLocation(codeLens.file, codeLens.range.start);
const args = vsPositionToTsFileLocation(codeLens.file, codeLens.range.start);
return this.client.execute('references', args, token).then(response => {
if (!response || !response.body) {
throw codeLens;
......@@ -44,7 +44,7 @@ export default class TypeScriptReferencesCodeLensProvider extends TypeScriptBase
const locations = response.body.refs
.map(reference =>
new Location(this.client.asUrl(reference.file), textSpanToRange(reference)))
new Location(this.client.asUrl(reference.file), tsTextSpanToVsRange(reference)))
.filter(location =>
// Exclude original definition from references
!(location.uri.fsPath === codeLens.document.fsPath &&
......
......@@ -7,7 +7,7 @@ import { RenameProvider, WorkspaceEdit, TextDocument, Position, CancellationToke
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange } from '../utils/convert';
import { tsTextSpanToVsRange, vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptRenameProvider implements RenameProvider {
public constructor(
......@@ -25,9 +25,7 @@ export default class TypeScriptRenameProvider implements RenameProvider {
}
const args: Proto.RenameRequestArgs = {
file: filepath,
line: position.line + 1,
offset: position.character + 1,
...vsPositionToTsFileLocation(filepath, position),
findInStrings: false,
findInComments: false
};
......@@ -50,7 +48,7 @@ export default class TypeScriptRenameProvider implements RenameProvider {
continue;
}
for (const textSpan of spanGroup.locs) {
result.replace(resource, textSpanToRange(textSpan), newName);
result.replace(resource, tsTextSpanToVsRange(textSpan), newName);
}
}
return result;
......
......@@ -8,6 +8,7 @@ import { SignatureHelpProvider, SignatureHelp, SignatureInformation, ParameterIn
import * as Previewer from './previewer';
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { vsPositionToTsFileLocation } from '../utils/convert';
export default class TypeScriptSignatureHelpProvider implements SignatureHelpProvider {
......@@ -19,11 +20,7 @@ export default class TypeScriptSignatureHelpProvider implements SignatureHelpPro
if (!filepath) {
return Promise.resolve(null);
}
const args: Proto.SignatureHelpRequestArgs = {
file: filepath,
line: position.line + 1,
offset: position.character + 1
};
const args: Proto.SignatureHelpRequestArgs = vsPositionToTsFileLocation(filepath, position);
return this.client.execute('signatureHelp', args, token).then((response) => {
const info = response.body;
if (!info) {
......
......@@ -7,7 +7,7 @@ import { workspace, window, Uri, WorkspaceSymbolProvider, SymbolInformation, Sym
import * as Proto from '../protocol';
import { ITypescriptServiceClient } from '../typescriptService';
import { textSpanToRange } from '../utils/convert';
import { tsTextSpanToVsRange } from '../utils/convert';
function getSymbolKind(item: Proto.NavtoItem): SymbolKind {
switch (item.kind) {
......@@ -68,7 +68,7 @@ export default class TypeScriptWorkspaceSymbolProvider implements WorkspaceSymbo
if (!item.containerName && item.kind === 'alias') {
continue;
}
const range = textSpanToRange(item);
const range = tsTextSpanToVsRange(item);
let label = item.name;
if (item.kind === 'method' || item.kind === 'function') {
label += '()';
......
......@@ -33,6 +33,7 @@ import TypingsStatus, { AtaProgressReporter } from './utils/typingsStatus';
import VersionStatus from './utils/versionStatus';
import { getContributedTypeScriptServerPlugins, TypeScriptServerPlugin } from './utils/plugins';
import { openOrCreateConfigFile, isImplicitProjectConfigFile } from './utils/tsconfig';
import { tsLocationToVsPosition } from './utils/convert';
interface LanguageDescription {
id: string;
......@@ -681,7 +682,7 @@ class TypeScriptServiceClientHost implements ITypescriptServiceClientHost {
const result: Diagnostic[] = [];
for (let diagnostic of diagnostics) {
const { start, end, text } = diagnostic;
const range = new Range(start.line - 1, start.offset - 1, end.line - 1, end.offset - 1);
const range = new Range(tsLocationToVsPosition(start), tsLocationToVsPosition(end));
const converted = new Diagnostic(range, text);
converted.severity = this.getDiagnosticSeverity(diagnostic);
converted.source = diagnostic.source || source;
......
......@@ -7,18 +7,21 @@ import * as vscode from 'vscode';
import * as Proto from '../protocol';
export const textSpanToRange = (span: Proto.TextSpan) =>
export const tsTextSpanToVsRange = (span: Proto.TextSpan) =>
new vscode.Range(
span.start.line - 1, span.start.offset - 1,
span.end.line - 1, span.end.offset - 1);
export const positionToFileLocation = (file: string, position: vscode.Position): Proto.FileLocationRequestArgs => ({
export const tsLocationToVsPosition = (tslocation: Proto.Location) =>
new vscode.Position(tslocation.line - 1, tslocation.offset - 1);
export const vsPositionToTsFileLocation = (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 => ({
export const vsRangeToTsFileRange = (file: string, range: vscode.Range): Proto.FileRangeRequestArgs => ({
file,
startLine: range.start.line + 1,
startOffset: range.start.character + 1,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册