From 33db5326081ff63f151665e0e2b79b37d5d70fe2 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Mon, 10 Sep 2018 18:19:27 -0700 Subject: [PATCH] Show error early on invalid rename in js/ts Fixes #58393 --- .../src/features/rename.ts | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/extensions/typescript-language-features/src/features/rename.ts b/extensions/typescript-language-features/src/features/rename.ts index a8589ad988d..0b6716f2b68 100644 --- a/extensions/typescript-language-features/src/features/rename.ts +++ b/extensions/typescript-language-features/src/features/rename.ts @@ -14,15 +14,49 @@ class TypeScriptRenameProvider implements vscode.RenameProvider { private readonly client: ITypeScriptServiceClient ) { } + public async prepareRename( + document: vscode.TextDocument, + position: vscode.Position, + token: vscode.CancellationToken + ): Promise { + const body = await this.execRename(document, position, token); + if (!body) { + return null; + } + + const renameInfo = body.info; + if (!renameInfo.canRename) { + return Promise.reject(new Error(renameInfo.localizedErrorMessage)); + } + return null; + } + public async provideRenameEdits( document: vscode.TextDocument, position: vscode.Position, newName: string, token: vscode.CancellationToken ): Promise { + const body = await this.execRename(document, position, token); + if (!body) { + return null; + } + + const renameInfo = body.info; + if (!renameInfo.canRename) { + return Promise.reject(renameInfo.localizedErrorMessage); + } + return this.toWorkspaceEdit(body.locs, newName); + } + + public async execRename( + document: vscode.TextDocument, + position: vscode.Position, + token: vscode.CancellationToken + ): Promise { const file = this.client.toPath(document.uri); if (!file) { - return null; + return undefined; } const args: Proto.RenameRequestArgs = { @@ -31,22 +65,12 @@ class TypeScriptRenameProvider implements vscode.RenameProvider { findInComments: false }; - let body: Proto.RenameResponseBody | undefined; try { - body = (await this.client.execute('rename', args, token)).body; - if (!body) { - return null; - } + return (await this.client.execute('rename', args, token)).body; } catch { // noop - return null; - } - - const renameInfo = body.info; - if (!renameInfo.canRename) { - return Promise.reject(renameInfo.localizedErrorMessage); + return undefined; } - return this.toWorkspaceEdit(body.locs, newName); } private toWorkspaceEdit( -- GitLab