diff --git a/packages/vue-language-service/src/languageFeatures/fileRename.ts b/packages/vue-language-service/src/languageFeatures/fileRename.ts index 0acee1840..a38f4aa3d 100644 --- a/packages/vue-language-service/src/languageFeatures/fileRename.ts +++ b/packages/vue-language-service/src/languageFeatures/fileRename.ts @@ -1,6 +1,7 @@ import type { LanguageServiceRuntimeContext } from '../types'; import { embeddedEditToSourceEdit } from './rename'; import type * as _ from 'vscode-languageserver-protocol'; +import * as dedupe from '../utils/dedupe'; export function register(context: LanguageServiceRuntimeContext) { @@ -23,10 +24,17 @@ export function register(context: LanguageServiceRuntimeContext) { const workspaceEdit = await plugin.doFileRename(oldUri, newUri); if (workspaceEdit) { - return embeddedEditToSourceEdit( + + const result = embeddedEditToSourceEdit( workspaceEdit, context.vueDocuments, ); + + if (result?.documentChanges) { + result.documentChanges = dedupe.withDocumentChanges(result.documentChanges); + } + + return result; } } }; diff --git a/packages/vue-language-service/src/utils/dedupe.ts b/packages/vue-language-service/src/utils/dedupe.ts index d73baf5b5..85f94a234 100644 --- a/packages/vue-language-service/src/utils/dedupe.ts +++ b/packages/vue-language-service/src/utils/dedupe.ts @@ -43,6 +43,9 @@ export function withTextEdits(items: T[]): T[] { item.newText, ].join(':')); } +export function withDocumentChanges(items: NonNullable) { + return dedupe(items, item => JSON.stringify(item)); // TODO: improve this +} export function withDiagnostics(items: T[]): T[] { return dedupe(items, item => [ item.range.start.line,