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

better error handling when calling prep-rename, #58394

上级 dbc44c99
......@@ -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<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 {
return this._provider.length > 0;
}
async resolveRenameLocation(token: CancellationToken): Promise<RenameLocation> {
async resolveRenameLocation(token: CancellationToken): Promise<RenameLocation & Rejection> {
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;
......
......@@ -5323,7 +5323,7 @@ declare namespace monaco.languages {
export interface RenameProvider {
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 {
......
......@@ -492,24 +492,17 @@ class RenameAdapter {
}
return typeConvert.WorkspaceEdit.from(value);
}, err => {
if (typeof err === 'string') {
return <WorkspaceEditDto>{
edits: undefined,
rejectReason: err
};
} else if (err instanceof Error && typeof err.message === 'string') {
return <WorkspaceEditDto>{
edits: undefined,
rejectReason: err.message
};
let rejectReason = RenameAdapter._asMessage(err);
if (rejectReason) {
return <WorkspaceEditDto>{ rejectReason, edits: undefined };
} else {
// 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') {
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 <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 {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册