提交 01f615e0 编写于 作者: J Johannes Rieken

better error handling when calling prep-rename, #58394

上级 dbc44c99
...@@ -941,7 +941,7 @@ export interface WorkspaceEdit { ...@@ -941,7 +941,7 @@ export interface WorkspaceEdit {
} }
export interface Rejection { export interface Rejection {
rejectReason?: string; // TODO@joh, move to rename rejectReason?: string;
} }
export interface RenameLocation { export interface RenameLocation {
range: IRange; range: IRange;
...@@ -950,7 +950,7 @@ export interface RenameLocation { ...@@ -950,7 +950,7 @@ export interface RenameLocation {
export interface RenameProvider { export interface RenameProvider {
provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult<WorkspaceEdit & Rejection>; provideRenameEdits(model: model.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult<WorkspaceEdit & Rejection>;
resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult<RenameLocation>; resolveRenameLocation?(model: model.ITextModel, position: Position, token: CancellationToken): ProviderResult<RenameLocation & Rejection>;
} }
......
...@@ -46,10 +46,10 @@ class RenameSkeleton { ...@@ -46,10 +46,10 @@ class RenameSkeleton {
return this._provider.length > 0; return this._provider.length > 0;
} }
async resolveRenameLocation(token: CancellationToken): Promise<RenameLocation> { async resolveRenameLocation(token: CancellationToken): Promise<RenameLocation & Rejection> {
let [provider] = this._provider; let [provider] = this._provider;
let res: RenameLocation; let res: RenameLocation & Rejection;
if (provider.resolveRenameLocation) { if (provider.resolveRenameLocation) {
res = await provider.resolveRenameLocation(this.model, this.position, token); res = await provider.resolveRenameLocation(this.model, this.position, token);
...@@ -136,7 +136,7 @@ class RenameController implements IEditorContribution { ...@@ -136,7 +136,7 @@ class RenameController implements IEditorContribution {
return undefined; return undefined;
} }
let loc: RenameLocation; let loc: RenameLocation & Rejection;
try { try {
loc = await skeleton.resolveRenameLocation(token); loc = await skeleton.resolveRenameLocation(token);
} catch (e) { } catch (e) {
...@@ -148,6 +148,11 @@ class RenameController implements IEditorContribution { ...@@ -148,6 +148,11 @@ class RenameController implements IEditorContribution {
return undefined; return undefined;
} }
if (loc.rejectReason) {
MessageController.get(this.editor).showMessage(loc.rejectReason, position);
return undefined;
}
let selection = this.editor.getSelection(); let selection = this.editor.getSelection();
let selectionStart = 0; let selectionStart = 0;
let selectionEnd = loc.text.length; let selectionEnd = loc.text.length;
......
...@@ -5323,7 +5323,7 @@ declare namespace monaco.languages { ...@@ -5323,7 +5323,7 @@ declare namespace monaco.languages {
export interface RenameProvider { export interface RenameProvider {
provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult<WorkspaceEdit & Rejection>; provideRenameEdits(model: editor.ITextModel, position: Position, newName: string, token: CancellationToken): ProviderResult<WorkspaceEdit & Rejection>;
resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult<RenameLocation>; resolveRenameLocation?(model: editor.ITextModel, position: Position, token: CancellationToken): ProviderResult<RenameLocation & Rejection>;
} }
export interface Command { export interface Command {
......
...@@ -492,24 +492,17 @@ class RenameAdapter { ...@@ -492,24 +492,17 @@ class RenameAdapter {
} }
return typeConvert.WorkspaceEdit.from(value); return typeConvert.WorkspaceEdit.from(value);
}, err => { }, err => {
if (typeof err === 'string') { let rejectReason = RenameAdapter._asMessage(err);
return <WorkspaceEditDto>{ if (rejectReason) {
edits: undefined, return <WorkspaceEditDto>{ rejectReason, edits: undefined };
rejectReason: err
};
} else if (err instanceof Error && typeof err.message === 'string') {
return <WorkspaceEditDto>{
edits: undefined,
rejectReason: err.message
};
} else { } else {
// generic error // generic error
return TPromise.wrapError<WorkspaceEditDto>(err); return Promise.reject<WorkspaceEditDto>(err);
} }
}); });
} }
resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Thenable<modes.RenameLocation> { resolveRenameLocation(resource: URI, position: IPosition, token: CancellationToken): Thenable<modes.RenameLocation & modes.Rejection> {
if (typeof this._provider.prepareRename !== 'function') { if (typeof this._provider.prepareRename !== 'function') {
return TPromise.as(undefined); return TPromise.as(undefined);
} }
...@@ -539,8 +532,25 @@ class RenameAdapter { ...@@ -539,8 +532,25 @@ class RenameAdapter {
return undefined; return undefined;
} }
return { range: typeConvert.Range.from(range), text }; return { range: typeConvert.Range.from(range), text };
}, err => {
let rejectReason = RenameAdapter._asMessage(err);
if (rejectReason) {
return <modes.RenameLocation & modes.Rejection>{ 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 { class SuggestAdapter {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册