diff --git a/packages/language-server/lib/register/registerEditorFeatures.ts b/packages/language-server/lib/register/registerEditorFeatures.ts index e31de4dc..36aa91c6 100644 --- a/packages/language-server/lib/register/registerEditorFeatures.ts +++ b/packages/language-server/lib/register/registerEditorFeatures.ts @@ -69,7 +69,7 @@ export function registerEditorFeatures( } function prune(code: VirtualCode): GetVirtualFileRequest.VirtualCodeInfo { - const uri = languageService.context.documents.getVirtualCodeUri(sourceFile!.id, code.id); + const uri = languageService.context.documents.encodeEmbeddedContentUri(sourceFile!.id, code.id); let version = scriptVersions.get(uri) ?? 0; if (!scriptVersionSnapshots.has(code.snapshot)) { version++; @@ -82,7 +82,7 @@ export function registerEditorFeatures( languageId: code.languageId, embeddedCodes: code.embeddedCodes?.map(prune) || [], version, - disabled: languageService.context.disabledVirtualFileUris.has(uri), + disabled: languageService.context.disabledEmbeddedContentUris.has(uri), }; } }); @@ -216,12 +216,12 @@ export function registerEditorFeatures( const project = await projects.getProject(params.fileUri); const context = project.getLanguageServiceDontCreate()?.context; if (context) { - const virtualFileUri = project.getLanguageService().context.documents.getVirtualCodeUri(params.fileUri, params.virtualCodeId); + const virtualFileUri = project.getLanguageService().context.documents.encodeEmbeddedContentUri(params.fileUri, params.virtualCodeId); if (params.disabled) { - context.disabledVirtualFileUris.add(virtualFileUri); + context.disabledEmbeddedContentUris.add(virtualFileUri); } else { - context.disabledVirtualFileUris.delete(virtualFileUri); + context.disabledEmbeddedContentUris.delete(virtualFileUri); } } }); diff --git a/packages/language-service/lib/documents.ts b/packages/language-service/lib/documents.ts index 30cfd204..b695b5bb 100644 --- a/packages/language-service/lib/documents.ts +++ b/packages/language-service/lib/documents.ts @@ -145,7 +145,7 @@ export class LinkedCodeMapWithDocument extends SourceMapWithDocuments { } } -export function createDocumentProvider(files: FileRegistry) { +export function createDocumentProvider(files: FileRegistry, embeddedContentScheme: string) { let version = 0; @@ -156,11 +156,12 @@ export function createDocumentProvider(files: FileRegistry) { return { get, *getMaps(virtualCode: VirtualCode) { - for (const [sourceFileUri, [sourceSnapshot, map]] of files.getMaps(virtualCode)) { + for (const [documentUri, [sourceSnapshot, map]] of files.getMaps(virtualCode)) { if (!map2DocMap.has(map)) { + const embeddedContentUri = this.encodeEmbeddedContentUri(documentUri, virtualCode.id); map2DocMap.set(map, new SourceMapWithDocuments( - get(sourceFileUri, files.get(sourceFileUri)!.languageId, sourceSnapshot), - get(this.getVirtualCodeUri(sourceFileUri, virtualCode.id), virtualCode.languageId, virtualCode.snapshot), + get(documentUri, files.get(documentUri)!.languageId, sourceSnapshot), + get(embeddedContentUri, virtualCode.languageId, virtualCode.snapshot), map, )); } @@ -171,26 +172,29 @@ export function createDocumentProvider(files: FileRegistry) { const map = files.getLinkedCodeMap(virtualCode); if (map) { if (!mirrorMap2DocMirrorMap.has(map)) { + const documentUri = files.getByVirtualCode(virtualCode).id; + const embeddedContentUri = this.encodeEmbeddedContentUri(documentUri, virtualCode.id); mirrorMap2DocMirrorMap.set(map, new LinkedCodeMapWithDocument( - get(this.getVirtualCodeUri(files.getByVirtualCode(virtualCode).id, virtualCode.id), virtualCode.languageId, virtualCode.snapshot), + get(embeddedContentUri, virtualCode.languageId, virtualCode.snapshot), map, )); } return mirrorMap2DocMirrorMap.get(map)!; } }, - // TODO: rename to getVirtualCodeByDocumentUri - getVirtualCodeByUri(uri: string) { - if (uri.includes('?virtualCodeId=')) { - const sourceFileUri = uri.split('?virtualCodeId=')[0]; - const virtualCodeId = uri.split('?virtualCodeId=')[1]; - return files.getVirtualCode(sourceFileUri, virtualCodeId); + decodeEmbeddedContentUri(maybeEmbeddedContentUri: string) { + if (maybeEmbeddedContentUri.startsWith(`${embeddedContentScheme}://`)) { + const trimed = maybeEmbeddedContentUri.substring(`${embeddedContentScheme}://`.length); + const embeddedCodeId = trimed.substring(0, trimed.indexOf('/')); + const documentUri = trimed.substring(embeddedCodeId.length + 1); + return { + documentUri: decodeURIComponent(documentUri), + embeddedCodeId: decodeURIComponent(embeddedCodeId), + }; } - return [undefined, undefined] as const; }, - // TODO: rename to getDocumentUriByVirtualCode - getVirtualCodeUri(sourceFileUri: string, virtualCodeId: string) { - return sourceFileUri + `?virtualCodeId=${virtualCodeId}`; + encodeEmbeddedContentUri(documentUri: string, embeddedContentId: string) { + return `${embeddedContentScheme}://${encodeURIComponent(embeddedContentId)}/${encodeURIComponent(documentUri)}`; }, }; diff --git a/packages/language-service/lib/features/provideCallHierarchyItems.ts b/packages/language-service/lib/features/provideCallHierarchyItems.ts index 5a46f9ed..1d061445 100644 --- a/packages/language-service/lib/features/provideCallHierarchyItems.ts +++ b/packages/language-service/lib/features/provideCallHierarchyItems.ts @@ -10,7 +10,7 @@ export interface PluginCallHierarchyData { uri: string; original: Pick; serviceIndex: number; - virtualDocumentUri: string | undefined; + embeddedContentUri: string | undefined; } export function register(context: ServiceContext) { @@ -36,7 +36,7 @@ export function register(context: ServiceContext) { data: item.data, }, serviceIndex: context.services.indexOf(service), - virtualDocumentUri: map?.embeddedDocument.uri, + embeddedContentUri: map?.embeddedDocument.uri, } satisfies PluginCallHierarchyData; }); return items; @@ -68,11 +68,11 @@ export function register(context: ServiceContext) { Object.assign(item, data.original); - if (data.virtualDocumentUri) { + if (data.embeddedContentUri) { - const [virtualCode] = context.documents.getVirtualCodeByUri(data.virtualDocumentUri); + const isEmbeddedContent = !!context.documents.decodeEmbeddedContentUri(data.embeddedContentUri); - if (virtualCode) { + if (isEmbeddedContent) { const _calls = await service[1].provideCallHierarchyIncomingCalls(item, token); @@ -129,11 +129,11 @@ export function register(context: ServiceContext) { Object.assign(item, data.original); - if (data.virtualDocumentUri) { + if (data.embeddedContentUri) { - const [virtualCode] = context.documents.getVirtualCodeByUri(data.virtualDocumentUri); + const isEmbeddedContent = !!context.documents.decodeEmbeddedContentUri(data.embeddedContentUri); - if (virtualCode) { + if (isEmbeddedContent) { const _calls = await service[1].provideCallHierarchyOutgoingCalls(item, token); @@ -178,7 +178,10 @@ export function register(context: ServiceContext) { function transformCallHierarchyItem(tsItem: vscode.CallHierarchyItem, tsRanges: vscode.Range[]): [vscode.CallHierarchyItem, vscode.Range[]] | undefined { - const [virtualCode] = context.documents.getVirtualCodeByUri(tsItem.uri); + const decoded = context.documents.decodeEmbeddedContentUri(tsItem.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (!virtualCode) { return [tsItem, tsRanges]; diff --git a/packages/language-service/lib/features/provideCompletionItems.ts b/packages/language-service/lib/features/provideCompletionItems.ts index de0f361f..c3d5b668 100644 --- a/packages/language-service/lib/features/provideCompletionItems.ts +++ b/packages/language-service/lib/features/provideCompletionItems.ts @@ -11,7 +11,7 @@ export interface ServiceCompletionData { uri: string; original: Pick; serviceIndex: number; - virtualDocumentUri: string | undefined; + embeddedContentUri: string | undefined; } export function register(context: ServiceContext) { @@ -55,7 +55,11 @@ export function register(context: ServiceContext) { if (cacheData.virtualDocumentUri) { - const [virtualCode] = context.documents.getVirtualCodeByUri(cacheData.virtualDocumentUri); + const decoded = context.documents.decodeEmbeddedContentUri(cacheData.virtualDocumentUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (!virtualCode) { continue; } @@ -83,7 +87,7 @@ export function register(context: ServiceContext) { data: item.data, }, serviceIndex, - virtualDocumentUri: map.embeddedDocument.uri, + embeddedContentUri: map.embeddedDocument.uri, } satisfies ServiceCompletionData; } @@ -118,7 +122,7 @@ export function register(context: ServiceContext) { data: item.data, }, serviceIndex, - virtualDocumentUri: undefined, + embeddedContentUri: undefined, } satisfies ServiceCompletionData; } } @@ -200,7 +204,7 @@ export function register(context: ServiceContext) { data: item.data, }, serviceIndex, - virtualDocumentUri: map ? document.uri : undefined, + embeddedContentUri: map ? document.uri : undefined, } satisfies ServiceCompletionData; } diff --git a/packages/language-service/lib/features/provideDefinition.ts b/packages/language-service/lib/features/provideDefinition.ts index f5c50563..6078459f 100644 --- a/packages/language-service/lib/features/provideDefinition.ts +++ b/packages/language-service/lib/features/provideDefinition.ts @@ -55,8 +55,13 @@ export function register( recursiveChecker.add({ uri: definition.targetUri, range: { start: definition.targetRange.start, end: definition.targetRange.start } }); - const [virtualCode] = context.documents.getVirtualCodeByUri(definition.targetUri); - const mirrorMap = virtualCode ? context.documents.getLinkedCodeMap(virtualCode) : undefined; + const decoded = context.documents.decodeEmbeddedContentUri(definition.targetUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + const mirrorMap = virtualCode + ? context.documents.getLinkedCodeMap(virtualCode) + : undefined; if (mirrorMap) { @@ -101,7 +106,10 @@ export function register( let foundTargetSelectionRange = false; - const [targetVirtualFile] = context.documents.getVirtualCodeByUri(link.targetUri); + const decoded = context.documents.decodeEmbeddedContentUri(link.targetUri); + const targetVirtualFile = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (targetVirtualFile) { diff --git a/packages/language-service/lib/features/provideDiagnostics.ts b/packages/language-service/lib/features/provideDiagnostics.ts index e4d3690c..65488133 100644 --- a/packages/language-service/lib/features/provideDiagnostics.ts +++ b/packages/language-service/lib/features/provideDiagnostics.ts @@ -298,7 +298,10 @@ export function register(context: ServiceContext) { for (const info of _error.relatedInformation) { - const [virtualCode] = context.documents.getVirtualCodeByUri(info.location.uri); + const decoded = context.documents.decodeEmbeddedContentUri(info.location.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { for (const map of context.documents.getMaps(virtualCode)) { diff --git a/packages/language-service/lib/features/provideDocumentFormattingEdits.ts b/packages/language-service/lib/features/provideDocumentFormattingEdits.ts index 71374409..ab432b15 100644 --- a/packages/language-service/lib/features/provideDocumentFormattingEdits.ts +++ b/packages/language-service/lib/features/provideDocumentFormattingEdits.ts @@ -179,7 +179,7 @@ export function register(context: ServiceContext) { ch?: string, ) { - if (context.disabledVirtualFileUris.has(document.uri)) { + if (context.disabledEmbeddedContentUris.has(document.uri)) { return; } @@ -267,7 +267,7 @@ export function register(context: ServiceContext) { _sourceSnapshot.getText(0, _sourceSnapshot.getLength()) ), TextDocument.create( - context.documents.getVirtualCodeUri(sourceFileUri, file.id), + context.documents.encodeEmbeddedContentUri(sourceFileUri, file.id), file.languageId, version, file.snapshot.getText(0, file.snapshot.getLength()) diff --git a/packages/language-service/lib/features/provideDocumentHighlights.ts b/packages/language-service/lib/features/provideDocumentHighlights.ts index 8172dbd0..2200128d 100644 --- a/packages/language-service/lib/features/provideDocumentHighlights.ts +++ b/packages/language-service/lib/features/provideDocumentHighlights.ts @@ -49,8 +49,13 @@ export function register(context: ServiceContext) { recursiveChecker.add({ uri: document.uri, range: { start: reference.range.start, end: reference.range.start } }); - const [virtualCode] = context.documents.getVirtualCodeByUri(document.uri); - const mirrorMap = virtualCode ? context.documents.getLinkedCodeMap(virtualCode) : undefined; + const decoded = context.documents.decodeEmbeddedContentUri(document.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + const mirrorMap = virtualCode + ? context.documents.getLinkedCodeMap(virtualCode) + : undefined; if (mirrorMap) { diff --git a/packages/language-service/lib/features/provideFileReferences.ts b/packages/language-service/lib/features/provideFileReferences.ts index ef106ebe..e1d8e86d 100644 --- a/packages/language-service/lib/features/provideFileReferences.ts +++ b/packages/language-service/lib/features/provideFileReferences.ts @@ -23,7 +23,11 @@ export function register(context: ServiceContext) { data => data .map(reference => { - const [virtualCode] = context.documents.getVirtualCodeByUri(reference.uri); + const decoded = context.documents.decodeEmbeddedContentUri(reference.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (!virtualCode) { return reference; } diff --git a/packages/language-service/lib/features/provideReferences.ts b/packages/language-service/lib/features/provideReferences.ts index ff3f7c0b..e2782d51 100644 --- a/packages/language-service/lib/features/provideReferences.ts +++ b/packages/language-service/lib/features/provideReferences.ts @@ -48,8 +48,13 @@ export function register(context: ServiceContext) { recursiveChecker.add({ uri: reference.uri, range: { start: reference.range.start, end: reference.range.start } }); - const [virtualCode] = context.documents.getVirtualCodeByUri(reference.uri); - const mirrorMap = virtualCode ? context.documents.getLinkedCodeMap(virtualCode) : undefined; + const decoded = context.documents.decodeEmbeddedContentUri(reference.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + const mirrorMap = virtualCode + ? context.documents.getLinkedCodeMap(virtualCode) + : undefined; if (mirrorMap) { @@ -77,7 +82,10 @@ export function register(context: ServiceContext) { for (const reference of data) { - const [virtualCode] = context.documents.getVirtualCodeByUri(reference.uri); + const decoded = context.documents.decodeEmbeddedContentUri(reference.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { for (const map of context.documents.getMaps(virtualCode)) { diff --git a/packages/language-service/lib/features/provideRenameEdits.ts b/packages/language-service/lib/features/provideRenameEdits.ts index da004161..1b21e4f7 100644 --- a/packages/language-service/lib/features/provideRenameEdits.ts +++ b/packages/language-service/lib/features/provideRenameEdits.ts @@ -74,8 +74,13 @@ export function register(context: ServiceContext) { recursiveChecker.add({ uri: editUri, range: { start: textEdit.range.start, end: textEdit.range.start } }); - const [virtualCode] = context.documents.getVirtualCodeByUri(editUri); - const mirrorMap = virtualCode ? context.documents.getLinkedCodeMap(virtualCode) : undefined; + const decoded = context.documents.decodeEmbeddedContentUri(editUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + const mirrorMap = virtualCode + ? context.documents.getLinkedCodeMap(virtualCode) + : undefined; if (mirrorMap) { diff --git a/packages/language-service/lib/features/provideWorkspaceSymbols.ts b/packages/language-service/lib/features/provideWorkspaceSymbols.ts index dc913d60..1c458055 100644 --- a/packages/language-service/lib/features/provideWorkspaceSymbols.ts +++ b/packages/language-service/lib/features/provideWorkspaceSymbols.ts @@ -26,7 +26,10 @@ export function register(context: ServiceContext) { } const symbols = embeddedSymbols.map(symbol => transformWorkspaceSymbol(symbol, loc => { - const [virtualCode] = context.documents.getVirtualCodeByUri(loc.uri); + const decoded = context.documents.decodeEmbeddedContentUri(loc.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { for (const map of context.documents.getMaps(virtualCode)) { diff --git a/packages/language-service/lib/features/resolveCompletionItem.ts b/packages/language-service/lib/features/resolveCompletionItem.ts index 43ff8271..f4c8c29d 100644 --- a/packages/language-service/lib/features/resolveCompletionItem.ts +++ b/packages/language-service/lib/features/resolveCompletionItem.ts @@ -20,9 +20,12 @@ export function register(context: ServiceContext) { item = Object.assign(item, data.original); - if (data.virtualDocumentUri) { + if (data.embeddedContentUri) { - const [virtualCode] = context.documents.getVirtualCodeByUri(data.virtualDocumentUri); + const decoded = context.documents.decodeEmbeddedContentUri(data.embeddedContentUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { diff --git a/packages/language-service/lib/languageService.ts b/packages/language-service/lib/languageService.ts index 992ff3a5..42a48dbf 100644 --- a/packages/language-service/lib/languageService.ts +++ b/packages/language-service/lib/languageService.ts @@ -41,6 +41,7 @@ export function createLanguageService( languageContext: LanguageContext, servicePlugins: ServicePlugin[], env: ServiceEnvironment, + embeddedContentScheme: string = 'volar-embedded-content', ) { const context = createServiceContext(); @@ -95,7 +96,7 @@ export function createLanguageService( const context: ServiceContext = { language: languageContext, - documents: createDocumentProvider(languageContext.files), + documents: createDocumentProvider(languageContext.files, embeddedContentScheme), env, inject: (key, ...args) => { for (const service of context.services) { @@ -162,7 +163,7 @@ export function createLanguageService( }, }, }, - disabledVirtualFileUris: new Set(), + disabledEmbeddedContentUris: new Set(), disabledServicePlugins: new WeakSet(), }; diff --git a/packages/language-service/lib/types.ts b/packages/language-service/lib/types.ts index 2a2678e6..b27bf52d 100644 --- a/packages/language-service/lib/types.ts +++ b/packages/language-service/lib/types.ts @@ -59,7 +59,7 @@ export interface ServiceContext { }; documents: DocumentProvider; services: [ServicePlugin, ServicePluginInstance][]; - disabledVirtualFileUris: Set; + disabledEmbeddedContentUris: Set; disabledServicePlugins: WeakSet; } diff --git a/packages/language-service/lib/utils/featureWorkers.ts b/packages/language-service/lib/utils/featureWorkers.ts index 9a704233..8a920c6b 100644 --- a/packages/language-service/lib/utils/featureWorkers.ts +++ b/packages/language-service/lib/utils/featureWorkers.ts @@ -140,7 +140,7 @@ export function* eachEmbeddedDocument( const sourceFile = context.language.files.get(map.sourceDocument.uri); if ( sourceFile?.generated?.code === rootCode - && !context.disabledVirtualFileUris.has(context.documents.getVirtualCodeUri(context.language.files.getByVirtualCode(current).id, current.id)) + && !context.disabledEmbeddedContentUris.has(context.documents.encodeEmbeddedContentUri(context.language.files.getByVirtualCode(current).id, current.id)) ) { yield map; } @@ -162,7 +162,7 @@ export function getEmbeddedFilesByLevel(context: ServiceContext, sourceFileUri: for (const file of embeddedFilesByLevel[embeddedFilesByLevel.length - 1]) { if (file.embeddedCodes) { for (const embedded of file.embeddedCodes) { - if (!context.disabledVirtualFileUris.has(context.documents.getVirtualCodeUri(sourceFileUri, embedded.id))) { + if (!context.disabledEmbeddedContentUris.has(context.documents.encodeEmbeddedContentUri(sourceFileUri, embedded.id))) { nextLevel.push(embedded); } } diff --git a/packages/language-service/lib/utils/transform.ts b/packages/language-service/lib/utils/transform.ts index bf97c410..729e77a1 100644 --- a/packages/language-service/lib/utils/transform.ts +++ b/packages/language-service/lib/utils/transform.ts @@ -8,7 +8,11 @@ import { notEmpty } from './common'; export function transformDocumentLinkTarget(target: string, context: ServiceContext) { const targetUri = URI.parse(target); const clearUri = targetUri.with({ fragment: '' }).toString(true); - const [virtualCode] = context.documents.getVirtualCodeByUri(clearUri); + const decoded = context.documents.decodeEmbeddedContentUri(clearUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (virtualCode) { for (const map of context.documents.getMaps(virtualCode)) { @@ -306,7 +310,7 @@ export function transformWorkspaceSymbol(symbol: vscode.WorkspaceSymbol, getOthe export function transformWorkspaceEdit( edit: vscode.WorkspaceEdit, - { documents }: ServiceContext, + context: ServiceContext, mode: 'fileName' | 'rename' | 'codeAction' | undefined, versions: Record = {}, ) { @@ -319,10 +323,14 @@ export function transformWorkspaceEdit( sourceResult.changeAnnotations ??= {}; const tsAnno = edit.changeAnnotations[tsUri]; - const [virtualCode] = documents.getVirtualCodeByUri(tsUri); + const decoded = context.documents.decodeEmbeddedContentUri(tsUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (virtualCode) { - for (const map of documents.getMaps(virtualCode)) { + for (const map of context.documents.getMaps(virtualCode)) { // TODO: check capability? const uri = map.sourceDocument.uri; sourceResult.changeAnnotations[uri] = tsAnno; @@ -336,10 +344,14 @@ export function transformWorkspaceEdit( sourceResult.changes ??= {}; - const [virtualCode] = documents.getVirtualCodeByUri(tsUri); + const decoded = context.documents.decodeEmbeddedContentUri(tsUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (virtualCode) { - for (const map of documents.getMaps(virtualCode)) { + for (const map of context.documents.getMaps(virtualCode)) { const tsEdits = edit.changes[tsUri]; for (const tsEdit of tsEdits) { if (mode === 'rename' || mode === 'fileName' || mode === 'codeAction') { @@ -384,10 +396,14 @@ export function transformWorkspaceEdit( let sourceEdit: typeof tsDocEdit | undefined; if ('textDocument' in tsDocEdit) { - const [virtualCode] = documents.getVirtualCodeByUri(tsDocEdit.textDocument.uri); + const decoded = context.documents.decodeEmbeddedContentUri(tsDocEdit.textDocument.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; + if (virtualCode) { - for (const map of documents.getMaps(virtualCode)) { + for (const map of context.documents.getMaps(virtualCode)) { sourceEdit = { textDocument: { uri: map.sourceDocument.uri, @@ -436,10 +452,13 @@ export function transformWorkspaceEdit( } else if (tsDocEdit.kind === 'rename') { - const [virtualCode] = documents.getVirtualCodeByUri(tsDocEdit.oldUri); + const decoded = context.documents.decodeEmbeddedContentUri(tsDocEdit.oldUri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { - for (const map of documents.getMaps(virtualCode)) { + for (const map of context.documents.getMaps(virtualCode)) { // TODO: check capability? sourceEdit = { kind: 'rename', @@ -456,10 +475,13 @@ export function transformWorkspaceEdit( } else if (tsDocEdit.kind === 'delete') { - const [virtualCode] = documents.getVirtualCodeByUri(tsDocEdit.uri); + const decoded = context.documents.decodeEmbeddedContentUri(tsDocEdit.uri); + const virtualCode = decoded + ? context.language.files.getVirtualCode(decoded.documentUri, decoded.embeddedCodeId)[0] + : undefined; if (virtualCode) { - for (const map of documents.getMaps(virtualCode)) { + for (const map of context.documents.getMaps(virtualCode)) { // TODO: check capability? sourceEdit = { kind: 'delete',