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 * position will be merged by the editor. A hover can have a range which defaults
* to the word range at the position when omitted. * 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> { 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 * Whether to increase or decrease the hover's verbosity
*/ */
action?: HoverVerbosityAction; action: HoverVerbosityAction;
/** /**
* The previous hover for the same position * The previous hover for the same position
*/ */
previousHover?: THover; previousHover: THover;
} }
export enum HoverVerbosityAction { export enum HoverVerbosityAction {

View file

@ -352,7 +352,7 @@ class MarkdownRenderedHoverParts extends Disposable {
const hoverPosition = hoverRenderedPart.hoverSource.hoverPosition; const hoverPosition = hoverRenderedPart.hoverSource.hoverPosition;
const hoverProvider = hoverRenderedPart.hoverSource.hoverProvider; const hoverProvider = hoverRenderedPart.hoverSource.hoverProvider;
const hover = hoverRenderedPart.hoverSource.hover; const hover = hoverRenderedPart.hoverSource.hover;
const hoverContext: HoverContext = { action, previousHover: hover }; const hoverContext: HoverContext = { verbosityRequest: { action, previousHover: hover } };
let newHover: Hover | null | undefined; let newHover: Hover | null | undefined;
try { 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 * position will be merged by the editor. A hover can have a range which defaults
* to the word range at the position when omitted. * 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> { 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 * Whether to increase or decrease the hover's verbosity
*/ */
action?: HoverVerbosityAction; action: HoverVerbosityAction;
/** /**
* The previous hover for the same position * The previous hover for the same position
*/ */
previousHover?: THover; previousHover: THover;
} }
export enum HoverVerbosityAction { export enum HoverVerbosityAction {

View file

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

View file

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