Skip to content

Commit

Permalink
refactor(language-service): reformat embedded document uri
Browse files Browse the repository at this point in the history
close #148
  • Loading branch information
johnsoncodehk committed Mar 11, 2024
1 parent 12b960d commit 2a04a3b
Show file tree
Hide file tree
Showing 17 changed files with 141 additions and 68 deletions.
10 changes: 5 additions & 5 deletions packages/language-server/lib/register/registerEditorFeatures.ts
Expand Up @@ -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++;
Expand All @@ -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),
};
}
});
Expand Down Expand Up @@ -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);
}
}
});
Expand Down
34 changes: 19 additions & 15 deletions packages/language-service/lib/documents.ts
Expand Up @@ -145,7 +145,7 @@ export class LinkedCodeMapWithDocument extends SourceMapWithDocuments {
}
}

export function createDocumentProvider(files: FileRegistry) {
export function createDocumentProvider(files: FileRegistry, embeddedContentScheme: string) {

let version = 0;

Expand All @@ -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,
));
}
Expand All @@ -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)}`;
},
};

Expand Down
Expand Up @@ -10,7 +10,7 @@ export interface PluginCallHierarchyData {
uri: string;
original: Pick<vscode.CallHierarchyItem, 'data'>;
serviceIndex: number;
virtualDocumentUri: string | undefined;
embeddedContentUri: string | undefined;
}

export function register(context: ServiceContext) {
Expand All @@ -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;
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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];
Expand Down
14 changes: 9 additions & 5 deletions packages/language-service/lib/features/provideCompletionItems.ts
Expand Up @@ -11,7 +11,7 @@ export interface ServiceCompletionData {
uri: string;
original: Pick<vscode.CompletionItem, 'additionalTextEdits' | 'textEdit' | 'data'>;
serviceIndex: number;
virtualDocumentUri: string | undefined;
embeddedContentUri: string | undefined;
}

export function register(context: ServiceContext) {
Expand Down Expand Up @@ -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;
}
Expand Down Expand Up @@ -83,7 +87,7 @@ export function register(context: ServiceContext) {
data: item.data,
},
serviceIndex,
virtualDocumentUri: map.embeddedDocument.uri,
embeddedContentUri: map.embeddedDocument.uri,
} satisfies ServiceCompletionData;
}

Expand Down Expand Up @@ -118,7 +122,7 @@ export function register(context: ServiceContext) {
data: item.data,
},
serviceIndex,
virtualDocumentUri: undefined,
embeddedContentUri: undefined,
} satisfies ServiceCompletionData;
}
}
Expand Down Expand Up @@ -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;
}

Expand Down
14 changes: 11 additions & 3 deletions packages/language-service/lib/features/provideDefinition.ts
Expand Up @@ -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) {

Expand Down Expand Up @@ -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) {

Expand Down
5 changes: 4 additions & 1 deletion packages/language-service/lib/features/provideDiagnostics.ts
Expand Up @@ -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)) {
Expand Down
Expand Up @@ -179,7 +179,7 @@ export function register(context: ServiceContext) {
ch?: string,
) {

if (context.disabledVirtualFileUris.has(document.uri)) {
if (context.disabledEmbeddedContentUris.has(document.uri)) {
return;
}

Expand Down Expand Up @@ -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())
Expand Down
Expand Up @@ -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) {

Expand Down
Expand Up @@ -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;
}
Expand Down
14 changes: 11 additions & 3 deletions packages/language-service/lib/features/provideReferences.ts
Expand Up @@ -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) {

Expand Down Expand Up @@ -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)) {
Expand Down
9 changes: 7 additions & 2 deletions packages/language-service/lib/features/provideRenameEdits.ts
Expand Up @@ -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) {

Expand Down
Expand Up @@ -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)) {
Expand Down
Expand Up @@ -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) {

Expand Down
5 changes: 3 additions & 2 deletions packages/language-service/lib/languageService.ts
Expand Up @@ -41,6 +41,7 @@ export function createLanguageService(
languageContext: LanguageContext,
servicePlugins: ServicePlugin[],
env: ServiceEnvironment,
embeddedContentScheme: string = 'volar-embedded-content',
) {

const context = createServiceContext();
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -162,7 +163,7 @@ export function createLanguageService(
},
},
},
disabledVirtualFileUris: new Set(),
disabledEmbeddedContentUris: new Set(),
disabledServicePlugins: new WeakSet(),
};

Expand Down

0 comments on commit 2a04a3b

Please sign in to comment.