From 1be59b4573989b55b55d6367c77abc7d063e9a68 Mon Sep 17 00:00:00 2001 From: Matt Bierner Date: Tue, 18 Sep 2018 15:21:43 -0700 Subject: [PATCH] Support typescript's fileToRename Fixes #51175 Allows triggering renames on import paths --- .../src/features/rename.ts | 36 ++++++++++++++++--- 1 file changed, 31 insertions(+), 5 deletions(-) diff --git a/extensions/typescript-language-features/src/features/rename.ts b/extensions/typescript-language-features/src/features/rename.ts index bae9f23d434..d22bd3ef8f3 100644 --- a/extensions/typescript-language-features/src/features/rename.ts +++ b/extensions/typescript-language-features/src/features/rename.ts @@ -3,6 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ +import * as path from 'path'; import * as vscode from 'vscode'; import * as Proto from '../protocol'; import { ITypeScriptServiceClient } from '../typescriptService'; @@ -55,7 +56,15 @@ class TypeScriptRenameProvider implements vscode.RenameProvider { if (!renameInfo.canRename) { return Promise.reject(renameInfo.localizedErrorMessage); } - return this.toWorkspaceEdit(body.locs, newName); + + const edit = new vscode.WorkspaceEdit(); + if (this.client.apiVersion.gte(API.v310)) { + if (renameInfo.fileToRename) { + this.renameFile(edit, renameInfo.fileToRename, newName); + } + } + this.updateLocs(edit, body.locs, newName); + return edit; } public async execRename( @@ -82,20 +91,37 @@ class TypeScriptRenameProvider implements vscode.RenameProvider { } } - private toWorkspaceEdit( + private updateLocs( + edit: vscode.WorkspaceEdit, locations: ReadonlyArray, newName: string ) { - const result = new vscode.WorkspaceEdit(); for (const spanGroup of locations) { const resource = this.client.toResource(spanGroup.file); if (resource) { for (const textSpan of spanGroup.locs) { - result.replace(resource, typeConverters.Range.fromTextSpan(textSpan), newName); + edit.replace(resource, typeConverters.Range.fromTextSpan(textSpan), newName); } } } - return result; + return edit; + } + + private renameFile( + edit: vscode.WorkspaceEdit, + fileToRename: string, + newName: string, + ): vscode.WorkspaceEdit { + // Make sure we preserve file exension if none provided + if (path.extname(newName)) { + newName += path.extname(fileToRename); + } + + const dirname = path.dirname(fileToRename); + const newFilePath = path.join(dirname, newName); + edit.renameFile(vscode.Uri.file(fileToRename), vscode.Uri.file(newFilePath)); + + return edit; } } -- GitLab