allow to return range or range and placeholder, #7340

This commit is contained in:
Johannes Rieken
2018-04-17 11:40:05 +02:00
parent 523abdc0c9
commit 8c1e3a7b3c
9 changed files with 60 additions and 34 deletions

View File

@@ -710,7 +710,7 @@ export interface ExtHostLanguageFeaturesShape {
$resolveWorkspaceSymbol(handle: number, symbol: SymbolInformationDto): TPromise<SymbolInformationDto>;
$releaseWorkspaceSymbols(handle: number, id: number): void;
$provideRenameEdits(handle: number, resource: UriComponents, position: IPosition, newName: string): TPromise<WorkspaceEditDto>;
$resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise<IRange>;
$resolveRenameLocation(handle: number, resource: UriComponents, position: IPosition): TPromise<modes.RenameLocation>;
$provideCompletionItems(handle: number, resource: UriComponents, position: IPosition, context: modes.SuggestContext): TPromise<SuggestResultDto>;
$resolveCompletionItem(handle: number, resource: UriComponents, position: IPosition, suggestion: modes.ISuggestion): TPromise<modes.ISuggestion>;
$releaseCompletionItems(handle: number, id: number): void;

View File

@@ -22,6 +22,7 @@ import { regExpLeadsToEndlessLoop } from 'vs/base/common/strings';
import { IPosition } from 'vs/editor/common/core/position';
import { IRange } from 'vs/editor/common/core/range';
import { isFalsyOrEmpty } from 'vs/base/common/arrays';
import { isObject } from 'vs/base/common/types';
// --- adapter
@@ -506,7 +507,7 @@ class RenameAdapter {
});
}
resolveRenameLocation(resource: URI, position: IPosition): TPromise<IRange> {
resolveRenameLocation(resource: URI, position: IPosition): TPromise<modes.RenameLocation> {
if (typeof this._provider.resolveRenameLocation !== 'function') {
return TPromise.as(undefined);
}
@@ -514,15 +515,28 @@ class RenameAdapter {
let doc = this._documents.getDocumentData(resource).document;
let pos = TypeConverters.toPosition(position);
return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(range => {
return asWinJsPromise(token => this._provider.resolveRenameLocation(doc, pos, token)).then(rangeOrLocation => {
let range: vscode.Range;
let text: string;
if (Range.isRange(rangeOrLocation)) {
range = rangeOrLocation;
text = doc.getText(rangeOrLocation);
} else if (isObject(rangeOrLocation)) {
range = rangeOrLocation.range;
text = rangeOrLocation.placeholder;
}
if (!range) {
return undefined;
}
if (range && (!range.isSingleLine || range.start.line !== pos.line)) {
console.warn('INVALID rename context, range must be single line and on the same line');
if (!range.contains(pos)) {
console.warn('INVALID rename location: range must contain position');
return undefined;
}
return TypeConverters.fromRange(range);
return { range: TypeConverters.fromRange(range), text };
});
}
}
@@ -1088,7 +1102,7 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape {
return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName));
}
$resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise<IRange> {
$resolveRenameLocation(handle: number, resource: URI, position: IPosition): TPromise<modes.RenameLocation> {
return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameLocation(resource, position));
}

View File

@@ -208,7 +208,7 @@ export class Position {
export class Range {
static isRange(thing: any): thing is Range {
static isRange(thing: any): thing is vscode.Range {
if (thing instanceof Range) {
return true;
}