Fixing type serialization issue with HoverWithId interface (#210889)

* addressing pr review

* renaming to the verbosity request
This commit is contained in:
Aiday Marlen Kyzy 2024-04-22 13:22:08 +02:00 committed by GitHub
parent ad5ae83b39
commit eafc55a31b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 33 additions and 13 deletions

View File

@ -190,18 +190,25 @@ export interface HoverProvider<THover = Hover> {
* position will be merged by the editor. A hover can have a range which defaults
* to the word range at the position when omitted.
*/
provideHover(model: model.ITextModel, position: Position, token: CancellationToken, context?: HoverContext<THover>): ProviderResult<Hover>;
provideHover(model: model.ITextModel, position: Position, token: CancellationToken, context?: HoverContext<THover>): ProviderResult<THover>;
}
export interface HoverContext<THover = Hover> {
/**
* Hover verbosity request
*/
verbosityRequest?: HoverVerbosityRequest<THover>;
}
export interface HoverVerbosityRequest<THover = Hover> {
/**
* Whether to increase or decrease the hover's verbosity
*/
action?: HoverVerbosityAction;
action: HoverVerbosityAction;
/**
* The previous hover for the same position
*/
previousHover?: THover;
previousHover: THover;
}
export enum HoverVerbosityAction {

View File

@ -352,7 +352,7 @@ class MarkdownRenderedHoverParts extends Disposable {
const hoverPosition = hoverRenderedPart.hoverSource.hoverPosition;
const hoverProvider = hoverRenderedPart.hoverSource.hoverProvider;
const hover = hoverRenderedPart.hoverSource.hover;
const hoverContext: HoverContext = { action, previousHover: hover };
const hoverContext: HoverContext = { verbosityRequest: { action, previousHover: hover } };
let newHover: Hover | null | undefined;
try {

13
src/vs/monaco.d.ts vendored
View File

@ -6852,18 +6852,25 @@ declare namespace monaco.languages {
* position will be merged by the editor. A hover can have a range which defaults
* to the word range at the position when omitted.
*/
provideHover(model: editor.ITextModel, position: Position, token: CancellationToken, context?: HoverContext<THover>): ProviderResult<Hover>;
provideHover(model: editor.ITextModel, position: Position, token: CancellationToken, context?: HoverContext<THover>): ProviderResult<THover>;
}
export interface HoverContext<THover = Hover> {
/**
* Hover verbosity request
*/
verbosityRequest?: HoverVerbosityRequest<THover>;
}
export interface HoverVerbosityRequest<THover = Hover> {
/**
* Whether to increase or decrease the hover's verbosity
*/
action?: HoverVerbosityAction;
action: HoverVerbosityAction;
/**
* The previous hover for the same position
*/
previousHover?: THover;
previousHover: THover;
}
export enum HoverVerbosityAction {

View File

@ -256,9 +256,15 @@ export class MainThreadLanguageFeatures extends Disposable implements MainThread
this._proxy.$releaseHover(handle, hoverId);
});
*/
this._registrations.set(handle, this._languageFeaturesService.hoverProvider.register(selector, <languages.HoverProvider>{
provideHover: async (model: ITextModel, position: EditorPosition, token: CancellationToken, context?: languages.HoverContext<{ id: number }>): Promise<HoverWithId | undefined> => {
const hover = await this._proxy.$provideHover(handle, model.uri, position, context, token);
this._registrations.set(handle, this._languageFeaturesService.hoverProvider.register(selector, <languages.HoverProvider<HoverWithId>>{
provideHover: async (model: ITextModel, position: EditorPosition, token: CancellationToken, context?: languages.HoverContext<HoverWithId>): Promise<HoverWithId | undefined> => {
const serializedContext: languages.HoverContext<{ id: number }> = {
verbosityRequest: context?.verbosityRequest ? {
action: context.verbosityRequest.action,
previousHover: { id: context.verbosityRequest.previousHover.id }
} : undefined,
};
const hover = await this._proxy.$provideHover(handle, model.uri, position, serializedContext, token);
// hoverFinalizationRegistry.register(hover, hover.id);
return hover;
}

View File

@ -271,13 +271,13 @@ class HoverAdapter {
const pos = typeConvert.Position.to(position);
let value: vscode.Hover | null | undefined;
if (context && context.previousHover !== undefined && context.action !== undefined) {
const previousHoverId = context.previousHover.id;
if (context && context.verbosityRequest) {
const previousHoverId = context.verbosityRequest.previousHover.id;
const previousHover = this._hoverMap.get(previousHoverId);
if (!previousHover) {
throw new Error(`Hover with id ${previousHoverId} not found`);
}
const hoverContext: vscode.HoverContext = { action: context.action, previousHover };
const hoverContext: vscode.HoverContext = { action: context.verbosityRequest.action, previousHover };
value = await this._provider.provideHover(doc, pos, token, hoverContext);
} else {
value = await this._provider.provideHover(doc, pos, token);