diff --git a/client/src/client.ts b/client/src/client.ts index 42e90892bc..80d3a77486 100644 --- a/client/src/client.ts +++ b/client/src/client.ts @@ -13,7 +13,7 @@ import * as lsp from 'vscode-languageclient/node'; import {ProjectLoadingFinish, ProjectLoadingStart, SuggestStrictMode, SuggestStrictModeParams} from '../common/notifications'; import {NgccProgress, NgccProgressToken, NgccProgressType} from '../common/progress'; -import {GetComponentsWithTemplateFile, GetTcbRequest, IsInAngularProject} from '../common/requests'; +import {GetComponentsWithTemplateFile, GetEditsForFileRenameParams, GetEditsForFileRenameRequest, GetTcbRequest, IsInAngularProject} from '../common/requests'; import {resolve, Version} from '../common/resolver'; import {isInsideComponentDecorator, isInsideInlineTemplateRegion, isInsideStringLiteral} from './embedded_support'; @@ -147,6 +147,42 @@ export class AngularLanguageClient implements vscode.Disposable { } } }; + vscode.workspace.onWillRenameFiles((e: vscode.FileWillRenameEvent) => { + if (!this.client) { + return; + } + + const c2pConverter = this.client.code2ProtocolConverter; + const requests: Array> = []; + for (let f of e.files) { + requests.push(this.client.sendRequest(GetEditsForFileRenameRequest, { + oldUri: c2pConverter.asUri(f.oldUri), + newUri: c2pConverter.asUri(f.newUri), + })); + } + const response = Promise.all(requests).then(allEdits => { + const final: lsp.WorkspaceEdit = {}; + for (const edit of allEdits) { + if (!edit) { + continue; + } + final.changes = {...final.changes, ...edit.changes}; + if (edit.documentChanges && edit.documentChanges.length > 0) { + if (!final.documentChanges) { + final.documentChanges = []; + } + final.documentChanges.push(...edit.documentChanges); + } + final.changeAnnotations = {...final.changeAnnotations, ...edit.changeAnnotations}; + } + if (!final.changeAnnotations && !final.changes && !final.documentChanges) { + return undefined; + } + const p2cConverter = this.client!.protocol2CodeConverter; + return p2cConverter.asWorkspaceEdit(final); + }) + e.waitUntil(response); + }); } private async isInAngularProject(doc: vscode.TextDocument): Promise { diff --git a/common/requests.ts b/common/requests.ts index a4f995800f..d75192e75b 100644 --- a/common/requests.ts +++ b/common/requests.ts @@ -15,12 +15,21 @@ export const GetComponentsWithTemplateFile = new lsp.RequestType< export interface GetComponentsWithTemplateFileParams { textDocument: lsp.TextDocumentIdentifier; } +export interface GetEditsForFileRenameParams { + oldUri: lsp.URI; + newUri: lsp.URI; +} + +export const GetEditsForFileRenameRequest = + new lsp.RequestType( + 'angular/getEditsForFileRename'); export interface GetTcbParams { textDocument: lsp.TextDocumentIdentifier; position: lsp.Position; } + export const GetTcbRequest = new lsp.RequestType('angular/getTcb'); diff --git a/server/src/session.ts b/server/src/session.ts index 8b3eb06afd..f8627f2846 100644 --- a/server/src/session.ts +++ b/server/src/session.ts @@ -15,7 +15,7 @@ import * as lsp from 'vscode-languageserver/node'; import {ServerOptions} from '../common/initialize'; import {ProjectLanguageService, ProjectLoadingFinish, ProjectLoadingStart, SuggestStrictMode} from '../common/notifications'; import {NgccProgressToken, NgccProgressType} from '../common/progress'; -import {GetComponentsWithTemplateFile, GetTcbParams, GetTcbRequest, GetTcbResponse, IsInAngularProject, IsInAngularProjectParams} from '../common/requests'; +import {GetComponentsWithTemplateFile, GetEditsForFileRenameParams, GetEditsForFileRenameRequest, GetTcbParams, GetTcbRequest, GetTcbResponse, IsInAngularProject, IsInAngularProjectParams} from '../common/requests'; import {readNgCompletionData, tsCompletionEntryToLspCompletionItem} from './completion'; import {tsDiagnosticToLspDiagnostic} from './diagnostic'; @@ -170,11 +170,16 @@ export class Session { conn.onRequest(GetComponentsWithTemplateFile, p => this.onGetComponentsWithTemplateFile(p)); conn.onRequest(GetTcbRequest, p => this.onGetTcb(p)); conn.onRequest(IsInAngularProject, p => this.isInAngularProject(p)); + conn.onRequest(GetEditsForFileRenameRequest, p => this.getEditsForFileRename(p)); conn.onCodeLens(p => this.onCodeLens(p)); conn.onCodeLensResolve(p => this.onCodeLensResolve(p)); conn.onSignatureHelp(p => this.onSignatureHelp(p)); } + private getEditsForFileRename(p: GetEditsForFileRenameParams): lsp.WorkspaceEdit|null { + return null; + } + private isInAngularProject(params: IsInAngularProjectParams): boolean { const filePath = uriToFilePath(params.textDocument.uri); if (!filePath) {