diff --git a/src/vs/editor/common/modes.ts b/src/vs/editor/common/modes.ts index 2b581e9352d8950a0b0cbe7f55967846a8f6d9f6..23a2b611dc9282bd23201d48c61a15c848d40091 100644 --- a/src/vs/editor/common/modes.ts +++ b/src/vs/editor/common/modes.ts @@ -941,7 +941,7 @@ export interface WorkspaceEdit { } export interface Rejection { - rejectReason?: string; // TODO@joh, move to rename + rejectReason?: string; } export interface RenameLocation { range: IRange; @@ -950,7 +950,7 @@ export interface RenameLocation { export interface RenameProvider { provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult; - resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult; + resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult; } diff --git a/src/vs/editor/contrib/rename/rename.ts b/src/vs/editor/contrib/rename/rename.ts index 17f18eee1a1ec8d72aa857a3b1163abf9c413089..349b72d041654acaf8d3f50814d180589c2986fe 100644 --- a/src/vs/editor/contrib/rename/rename.ts +++ b/src/vs/editor/contrib/rename/rename.ts @@ -46,10 +46,10 @@ class RenameSkeleton { return this._provider.length > 0; } - async resolveRenameLocation(token: CancellationToken): Promise { + async resolveRenameLocation(token: CancellationToken): Promise { let [provider] = this._provider; - let res: RenameLocation; + let res: RenameLocation & Rejection; if (provider.resolveRenameLocation) { res = await provider.resolveRenameLocation(this.model, this.position, token); @@ -136,7 +136,7 @@ class RenameController implements IEditorContribution { return undefined; } - let loc: RenameLocation; + let loc: RenameLocation & Rejection; try { loc = await skeleton.resolveRenameLocation(token); } catch (e) { @@ -148,6 +148,11 @@ class RenameController implements IEditorContribution { return undefined; } + if (loc.rejectReason) { + MessageController.get(this.editor).showMessage(loc.rejectReason, position); + return undefined; + } + let selection = this.editor.getSelection(); let selectionStart = 0; let selectionEnd = loc.text.length; diff --git a/src/vs/monaco.d.ts b/src/vs/monaco.d.ts index d4c2d7a02e87febd10f6e8195266714780b358e5..a95464e46ec40c59b2172c8efca8c91c32cd52ca 100644 --- a/src/vs/monaco.d.ts +++ b/src/vs/monaco.d.ts @@ -5323,7 +5323,7 @@ declare namespace monaco.languages { export interface RenameProvider { provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult; - resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult; + resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult; } export interface Command { diff --git a/src/vs/workbench/api/node/extHostLanguageFeatures.ts b/src/vs/workbench/api/node/extHostLanguageFeatures.ts index a50bd234064711a28dccd0e8149a4bbc813b34c5..a5953b695840af529057ef1e11575cb4c122a0f7 100644 --- a/src/vs/workbench/api/node/extHostLanguageFeatures.ts +++ b/src/vs/workbench/api/node/extHostLanguageFeatures.ts @@ -492,24 +492,17 @@ class RenameAdapter { } return typeConvert.WorkspaceEdit.from(value); }, err => { - if (typeof err === 'string') { - return { - edits: undefined, - rejectReason: err - }; - } else if (err instanceof Error && typeof err.message === 'string') { - return { - edits: undefined, - rejectReason: err.message - }; + let rejectReason = RenameAdapter._asMessage(err); + if (rejectReason) { + return { rejectReason, edits: undefined }; } else { // generic error - return TPromise.wrapError(err); + return Promise.reject(err); } }); } - resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Thenable { + resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Thenable { if (typeof this._provider.prepareRename !== 'function') { return TPromise.as(undefined); } @@ -539,8 +532,25 @@ class RenameAdapter { return undefined; } return { range: typeConvert.Range.from(range), text }; + }, err => { + let rejectReason = RenameAdapter._asMessage(err); + if (rejectReason) { + return { rejectReason, range: undefined, text: undefined }; + } else { + return Promise.reject(err); + } }); } + + private static _asMessage(err: any): string { + if (typeof err === 'string') { + return err; + } else if (err instanceof Error && typeof err.message === 'string') { + return err.message; + } else { + return undefined; + } + } } class SuggestAdapter {