Skip to content

Commit

Permalink
feat: show mapping data on hover for virtual document
Browse files Browse the repository at this point in the history
  • Loading branch information
johnsoncodehk committed Dec 25, 2022
1 parent 5175b7e commit 026a679
Show file tree
Hide file tree
Showing 2 changed files with 33 additions and 2 deletions.
3 changes: 2 additions & 1 deletion packages/language-server/src/protocol.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import * as vscode from 'vscode-languageserver-protocol';
import type * as html from 'vscode-html-languageservice';
import type { FileRangeCapabilities } from '@volar/language-core';

/**
* Server request client
Expand Down Expand Up @@ -83,7 +84,7 @@ export namespace GetVirtualFileRequest {
mappings: Record<string, {
sourceRange: [number, number];
generatedRange: [number, number];
data: undefined;
data: FileRangeCapabilities;
}[]>;
};
export type ErrorType = never;
Expand Down
32 changes: 31 additions & 1 deletion packages/vscode-language-client/src/features/showVirtualFiles.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import * as vscode from 'vscode';
import type { BaseLanguageClient } from 'vscode-languageclient';
import { GetVirtualFileNamesRequest, GetVirtualFileRequest } from '@volar/language-server';
import { SourceMap } from '@volar/source-map';
import type { FileRangeCapabilities } from '@volar/language-core';

const scheme = 'volar-virtual-file';
const mappingDecorationType = vscode.window.createTextEditorDecorationType({
Expand Down Expand Up @@ -30,10 +31,39 @@ const mappingSelectionDecorationType = vscode.window.createTextEditorDecorationT

export async function register(cmd: string, context: vscode.ExtensionContext, client: BaseLanguageClient) {

class MappingDataHoverProvider implements vscode.HoverProvider {
async provideHover(document: vscode.TextDocument, position: vscode.Position, _token: vscode.CancellationToken) {

const maps = virtualUriToSourceMap.get(document.uri.toString());
if (!maps) return;

const data: [string, FileRangeCapabilities][] = [];

for (const [sourceUri, _, map] of maps) {
const source = map.toSourceOffset(document.offsetAt(position));
if (source) {
data.push([sourceUri, source[1].data]);
}
}

if (data.length === 0) return;

return new vscode.Hover(data.map(([uri, data]) => [
uri,
'```json',
JSON.stringify(data, null, 2),
'```',
].join('\n')));
}
}

vscode.languages.registerHoverProvider({ scheme }, new MappingDataHoverProvider());

const sourceUriToVirtualUris = new Map<string, Set<string>>();
const virtualUriToSourceEditor = new Map<string, vscode.TextEditor>();
const virtualUriToSourceMap = new Map<string, [string, number, SourceMap][]>();
const virtualUriToSourceMap = new Map<string, [string, number, SourceMap<FileRangeCapabilities>][]>();
const docChangeEvent = new vscode.EventEmitter<vscode.Uri>();

let updateVirtualDocument: NodeJS.Timeout | undefined;
let updateDecorationsTimeout: NodeJS.Timeout | undefined;

Expand Down

0 comments on commit 026a679

Please sign in to comment.