提交 e9d92ca9 编写于 作者: J Johannes Rieken

align names, add RenameContext-type #7340

上级 dfc0aa1b
......@@ -917,14 +917,14 @@ export interface WorkspaceEdit {
rejectReason?: string; // TODO@joh, move to rename
}
export interface RenameInformation {
export interface RenameContext {
range: IRange;
text: string;
}
export interface RenameProvider {
provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable<WorkspaceEdit>;
resolveInitialRenameValue?(model: model.ITextModel, position: Position, token: CancellationToken): RenameInformation | Thenable<RenameInformation>;
resolveRenameContext?(model: model.ITextModel, position: Position, token: CancellationToken): RenameContext | Thenable<RenameContext>;
}
......
......@@ -23,7 +23,7 @@ import { ITextModelService } from 'vs/editor/common/services/resolverService';
import { optional } from 'vs/platform/instantiation/common/instantiation';
import { IThemeService } from 'vs/platform/theme/common/themeService';
import { asWinJsPromise } from 'vs/base/common/async';
import { WorkspaceEdit, RenameProviderRegistry, RenameInformation, RenameProvider } from 'vs/editor/common/modes';
import { WorkspaceEdit, RenameProviderRegistry, RenameContext, RenameProvider } from 'vs/editor/common/modes';
import { Position } from 'vs/editor/common/core/position';
import { alert } from 'vs/base/browser/ui/aria/aria';
import { Range } from 'vs/editor/common/core/range';
......@@ -47,13 +47,13 @@ class RenameSkeleton {
return this._provider.length > 0;
}
async resolveRenameInformation(): TPromise<RenameInformation> {
async resolveRenameInformation(): TPromise<RenameContext> {
let [provider] = this._provider;
let information: RenameInformation;
let information: RenameContext;
if (provider.resolveInitialRenameValue) {
information = await asWinJsPromise(token => provider.resolveInitialRenameValue(this.model, this.position, token));
if (provider.resolveRenameContext) {
information = await asWinJsPromise(token => provider.resolveRenameContext(this.model, this.position, token));
}
if (!information) {
......
......@@ -4964,14 +4964,14 @@ declare module monaco.languages {
rejectReason?: string;
}
export interface RenameInformation {
export interface RenameContext {
range: IRange;
text: string;
}
export interface RenameProvider {
provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): WorkspaceEdit | Thenable<WorkspaceEdit>;
resolveInitialRenameValue?(model: editor.ITextModel, position: Position, token: CancellationToken): RenameInformation | Thenable<RenameInformation>;
resolveRenameContext?(model: editor.ITextModel, position: Position, token: CancellationToken): RenameContext | Thenable<RenameContext>;
}
export interface Command {
......
......@@ -348,9 +348,18 @@ declare module 'vscode' {
logger: Logger;
}
export interface RenameInitialValue {
export class RenameContext {
range: Range;
text?: string;
newName?: string;
constructor(range: Range, newName?: string);
}
export interface RenameProvider2 extends RenameProvider {
/**
* Optional function to resolve and validate a rename location.
*/
resolveRenameContext?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult<RenameContext>;
}
export namespace languages {
......@@ -367,11 +376,8 @@ declare module 'vscode' {
* @return A [disposable](#Disposable) that unregisters this provider when being disposed.
*/
export function registerFoldingProvider(selector: DocumentSelector, provider: FoldingProvider): Disposable;
export interface RenameProvider2 extends RenameProvider {
resolveInitialRenameValue?(document: TextDocument, position: Position, token: CancellationToken): ProviderResult<RenameInitialValue>;
}
}
export interface FoldingProvider {
/**
* Returns a list of folding ranges or null if the provider does not want to participate or was cancelled.
......
......@@ -256,8 +256,8 @@ export class MainThreadLanguageFeatures implements MainThreadLanguageFeaturesSha
provideRenameEdits: (model: ITextModel, position: EditorPosition, newName: string, token: CancellationToken): Thenable<modes.WorkspaceEdit> => {
return wireCancellationToken(token, this._proxy.$provideRenameEdits(handle, model.uri, position, newName)).then(reviveWorkspaceEditDto);
},
resolveInitialRenameValue: supportsResolveInitialValues
? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable<modes.RenameInformation> => wireCancellationToken(token, this._proxy.$resolveInitialRenameValue(handle, model.uri, position))
resolveRenameContext: supportsResolveInitialValues
? (model: ITextModel, position: EditorPosition, token: CancellationToken): Thenable<modes.RenameContext> => wireCancellationToken(token, this._proxy.$resolveRenameContext(handle, model.uri, position))
: undefined
});
}
......
......@@ -608,6 +608,7 @@ export function createApiFactory(
ParameterInformation: extHostTypes.ParameterInformation,
Position: extHostTypes.Position,
Range: extHostTypes.Range,
RenameContext: extHostTypes.RenameContext,
Selection: extHostTypes.Selection,
SignatureHelp: extHostTypes.SignatureHelp,
SignatureInformation: extHostTypes.SignatureInformation,
......
......@@ -692,7 +692,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>;
$resolveInitialRenameValue(handle: number, resource: UriComponents, position: IPosition): TPromise<modes.RenameInformation>;
$resolveRenameContext(handle: number, resource: UriComponents, position: IPosition): TPromise<modes.RenameContext>;
$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;
......
......@@ -468,20 +468,16 @@ class NavigateTypeAdapter {
}
}
interface RenameProvider2 extends vscode.RenameProvider {
resolveInitialRenameValue?(document: vscode.TextDocument, position: vscode.Position, token: vscode.CancellationToken): vscode.ProviderResult<vscode.RenameInitialValue>;
}
class RenameAdapter {
static supportsResolving(provider: RenameProvider2): boolean {
return typeof provider.resolveInitialRenameValue === 'function';
static supportsResolving(provider: vscode.RenameProvider2): boolean {
return typeof provider.resolveRenameContext === 'function';
}
private _documents: ExtHostDocuments;
private _provider: RenameProvider2;
private _provider: vscode.RenameProvider2;
constructor(documents: ExtHostDocuments, provider: RenameProvider2) {
constructor(documents: ExtHostDocuments, provider: vscode.RenameProvider2) {
this._documents = documents;
this._provider = provider;
}
......@@ -514,25 +510,25 @@ class RenameAdapter {
});
}
resolveInitialRenameValue(resource: URI, position: IPosition): TPromise<modes.RenameInformation> {
if (typeof this._provider.resolveInitialRenameValue !== 'function') {
resolveRenameContext(resource: URI, position: IPosition): TPromise<modes.RenameContext> {
if (typeof this._provider.resolveRenameContext !== 'function') {
return TPromise.as(undefined);
}
let doc = this._documents.getDocumentData(resource).document;
let pos = TypeConverters.toPosition(position);
return asWinJsPromise(token => this._provider.resolveInitialRenameValue(doc, pos, token)).then(value => {
if (!value) {
return asWinJsPromise(token => this._provider.resolveRenameContext(doc, pos, token)).then(context => {
if (!context) {
return undefined;
}
if (!value.range.contains(pos)) {
if (!context.range.contains(pos)) {
console.warn('INVALID rename information, must contain the request-position');
return undefined;
}
return <modes.RenameInformation>{
range: TypeConverters.fromRange(value.range),
text: value.text || doc.getText(value.range)
return <modes.RenameContext>{
range: TypeConverters.fromRange(context.range),
text: context.newName || doc.getText(context.range)
};
});
}
......@@ -1068,8 +1064,8 @@ export class ExtHostLanguageFeatures implements ExtHostLanguageFeaturesShape {
return this._withAdapter(handle, RenameAdapter, adapter => adapter.provideRenameEdits(URI.revive(resource), position, newName));
}
$resolveInitialRenameValue(handle: number, resource: URI, position: IPosition): TPromise<modes.RenameInformation> {
return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveInitialRenameValue(resource, position));
$resolveRenameContext(handle: number, resource: URI, position: IPosition): TPromise<modes.RenameContext> {
return this._withAdapter(handle, RenameAdapter, adapter => adapter.resolveRenameContext(resource, position));
}
// --- suggestion
......
......@@ -591,6 +591,16 @@ export class WorkspaceEdit implements vscode.WorkspaceEdit {
}
}
export class RenameContext {
range: Range;
newName?: string;
constructor(range: Range, newName?: string) {
this.range = range;
this.newName = newName;
}
}
export class SnippetString {
static isSnippetString(thing: any): thing is SnippetString {
......@@ -1754,4 +1764,4 @@ export enum FoldingRangeType {
Region = 'region'
}
//#endregion
\ No newline at end of file
//#endregion
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册