in client/src/common/client.ts [2549:2619]
protected registerLanguageProvider(options: RenameRegistrationOptions): [Disposable, RenameProvider] {
const selector = options.documentSelector!;
const provider: RenameProvider = {
provideRenameEdits: (document, position, newName, token) => {
if ($DocumentSelector.skipCellTextDocument(selector, document)) {
return undefined;
}
const client = this._client;
const provideRenameEdits: ProvideRenameEditsSignature = (document, position, newName, token) => {
let params: RenameParams = {
textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document),
position: client.code2ProtocolConverter.asPosition(position),
newName: newName
};
return client.sendRequest(RenameRequest.type, params, token).then(
client.protocol2CodeConverter.asWorkspaceEdit,
(error: ResponseError<void>) => {
return client.handleFailedRequest(RenameRequest.type, token, error, null, false);
}
);
};
const middleware = client.clientOptions.middleware!;
return middleware.provideRenameEdits
? middleware.provideRenameEdits(document, position, newName, token, provideRenameEdits)
: provideRenameEdits(document, position, newName, token);
},
prepareRename: options.prepareProvider
? (document, position, token) => {
if ($DocumentSelector.skipCellTextDocument(selector, document)) {
return undefined;
}
const client = this._client;
const prepareRename: PrepareRenameSignature = (document, position, token) => {
let params: TextDocumentPositionParams = {
textDocument: client.code2ProtocolConverter.asTextDocumentIdentifier(document),
position: client.code2ProtocolConverter.asPosition(position),
};
return client.sendRequest(PrepareRenameRequest.type, params, token).then((result) => {
if (Range.is(result)) {
return client.protocol2CodeConverter.asRange(result);
} else if (this.isDefaultBehavior(result)) {
return result.defaultBehavior === true
? null
: Promise.reject(new Error(`The element can't be renamed.`));
} else if (result && Range.is(result.range)) {
return {
range: client.protocol2CodeConverter.asRange(result.range),
placeholder: result.placeholder
};
}
// To cancel the rename vscode API expects a rejected promise.
return Promise.reject(new Error(`The element can't be renamed.`));
},
(error: ResponseError<void>) => {
if (typeof error.message === 'string') {
throw new Error(error.message);
} else {
throw new Error(`The element can't be renamed.`);
}
}
);
};
const middleware = client.clientOptions.middleware!;
return middleware.prepareRename
? middleware.prepareRename(document, position, token, prepareRename)
: prepareRename(document, position, token);
}
: undefined
};
return [Languages.registerRenameProvider($DocumentSelector.asTextDocumentFilters(selector), provider), provider];
}