@@ -2,6 +2,7 @@ import * as path from 'path';
2
2
import * as os from 'os' ;
3
3
import * as fs from 'fs' ;
4
4
import * as vscode from 'vscode' ;
5
+ import * as LSP from 'vscode-languageserver-protocol' ;
5
6
import {
6
7
workspace as Workspace ,
7
8
ExtensionContext ,
@@ -156,6 +157,9 @@ class LuaClient extends Disposable {
156
157
languageConfiguration : true ,
157
158
storagePath : this . context . globalStorageUri . fsPath ,
158
159
} ,
160
+ middleware : {
161
+ provideHover : async ( ) => undefined ,
162
+ }
159
163
} ;
160
164
161
165
const config = Workspace . getConfiguration (
@@ -194,6 +198,7 @@ class LuaClient extends Disposable {
194
198
this . onCommand ( ) ;
195
199
this . statusBar ( ) ;
196
200
this . languageConfiguration ( ) ;
201
+ this . provideHover ( ) ;
197
202
}
198
203
199
204
private async getCommand ( config : vscode . WorkspaceConfiguration ) {
@@ -359,6 +364,58 @@ class LuaClient extends Disposable {
359
364
} )
360
365
)
361
366
}
367
+
368
+ private provideHover ( ) {
369
+ const client = this . client ;
370
+ const levelMap = new WeakMap < vscode . VerboseHover , number > ( ) ;
371
+ let provider = vscode . languages . registerHoverProvider ( 'lua' , {
372
+ provideHover : async ( document , position , token , context ?: vscode . HoverContext ) => {
373
+ if ( ! client ) {
374
+ return null ;
375
+ }
376
+ let level = 1 ;
377
+ if ( context ?. previousHover ) {
378
+ level = levelMap . get ( context . previousHover ) ?? 0 ;
379
+ if ( context . verbosityDelta !== undefined ) {
380
+ level += context . verbosityDelta ;
381
+ }
382
+ }
383
+ let params = {
384
+ level : level ,
385
+ ...client . code2ProtocolConverter . asTextDocumentPositionParams ( document , position ) ,
386
+ }
387
+ return client ?. sendRequest (
388
+ LSP . HoverRequest . type ,
389
+ params ,
390
+ token ,
391
+ ) . then ( ( result ) => {
392
+ if ( token . isCancellationRequested ) {
393
+ return null ;
394
+ }
395
+ if ( result === null ) {
396
+ return null ;
397
+ }
398
+ let verboseResult = result as LSP . Hover & { maxLevel ?: number } ;
399
+ let maxLevel = verboseResult . maxLevel ?? 0 ;
400
+ let hover = client . protocol2CodeConverter . asHover ( result ) ;
401
+ let verboseHover = new vscode . VerboseHover (
402
+ hover . contents ,
403
+ hover . range ,
404
+ level < maxLevel ,
405
+ level > 0 ,
406
+ ) ;
407
+ if ( level > maxLevel ) {
408
+ level = maxLevel ;
409
+ }
410
+ levelMap . set ( verboseHover , level ) ;
411
+ return verboseHover ;
412
+ } , ( error ) => {
413
+ return client . handleFailedRequest ( LSP . HoverRequest . type , token , error , null ) ;
414
+ } ) ;
415
+ }
416
+ } )
417
+ this . disposables . push ( provider )
418
+ }
362
419
}
363
420
364
421
export function activate ( context : ExtensionContext ) {
0 commit comments