@@ -368,6 +368,39 @@ m.register 'textDocument/hover' {
368368 end
369369}
370370
371+ local function convertDefinitionResult (state , result )
372+ local response = {}
373+ for i , info in ipairs (result ) do
374+ --- @type uri
375+ local targetUri = info .uri
376+ if targetUri then
377+ local targetState = files .getState (targetUri )
378+ if targetState then
379+ if client .getAbility ' textDocument.definition.linkSupport' then
380+ response [i ] = converter .locationLink (targetUri
381+ , converter .packRange (targetState , info .target .start , info .target .finish )
382+ , converter .packRange (targetState , info .target .start , info .target .finish )
383+ , converter .packRange (state , info .source .start , info .source .finish )
384+ )
385+ else
386+ response [i ] = converter .location (targetUri
387+ , converter .packRange (targetState , info .target .start , info .target .finish )
388+ )
389+ end
390+ else
391+ response [i ] = converter .location (
392+ targetUri ,
393+ converter .range (
394+ converter .position (guide .rowColOf (info .target .start )),
395+ converter .position (guide .rowColOf (info .target .finish ))
396+ )
397+ )
398+ end
399+ end
400+ end
401+ return response
402+ end
403+
371404m .register ' textDocument/definition' {
372405 capability = {
373406 definitionProvider = true ,
@@ -388,35 +421,7 @@ m.register 'textDocument/definition' {
388421 if not result then
389422 return nil
390423 end
391- local response = {}
392- for i , info in ipairs (result ) do
393- --- @type uri
394- local targetUri = info .uri
395- if targetUri then
396- local targetState = files .getState (targetUri )
397- if targetState then
398- if client .getAbility ' textDocument.definition.linkSupport' then
399- response [i ] = converter .locationLink (targetUri
400- , converter .packRange (targetState , info .target .start , info .target .finish )
401- , converter .packRange (targetState , info .target .start , info .target .finish )
402- , converter .packRange (state , info .source .start , info .source .finish )
403- )
404- else
405- response [i ] = converter .location (targetUri
406- , converter .packRange (targetState , info .target .start , info .target .finish )
407- )
408- end
409- else
410- response [i ] = converter .location (
411- targetUri ,
412- converter .range (
413- converter .position (guide .rowColOf (info .target .start )),
414- converter .position (guide .rowColOf (info .target .finish ))
415- )
416- )
417- end
418- end
419- end
424+ local response = convertDefinitionResult (state , result )
420425 return response
421426 end
422427}
@@ -441,27 +446,32 @@ m.register 'textDocument/typeDefinition' {
441446 if not result then
442447 return nil
443448 end
444- local response = {}
445- for i , info in ipairs (result ) do
446- --- @type uri
447- local targetUri = info .uri
448- if targetUri then
449- local targetState = files .getState (targetUri )
450- if targetState then
451- if client .getAbility ' textDocument.typeDefinition.linkSupport' then
452- response [i ] = converter .locationLink (targetUri
453- , converter .packRange (targetState , info .target .start , info .target .finish )
454- , converter .packRange (targetState , info .target .start , info .target .finish )
455- , converter .packRange (state , info .source .start , info .source .finish )
456- )
457- else
458- response [i ] = converter .location (targetUri
459- , converter .packRange (targetState , info .target .start , info .target .finish )
460- )
461- end
462- end
463- end
449+ local response = convertDefinitionResult (state , result )
450+ return response
451+ end
452+ }
453+
454+ m .register ' textDocument/implementation' {
455+ capability = {
456+ implementationProvider = true ,
457+ },
458+ abortByFileUpdate = true ,
459+ --- @async
460+ function (params )
461+ local uri = files .getRealUri (params .textDocument .uri )
462+ workspace .awaitReady (uri )
463+ local _ <close> = progress .create (uri , lang .script .WINDOW_PROCESSING_TYPE_DEFINITION , 0.5 )
464+ local state = files .getState (uri )
465+ if not state then
466+ return
467+ end
468+ local core = require ' core.implementation'
469+ local pos = converter .unpackPosition (state , params .position )
470+ local result = core (uri , pos )
471+ if not result then
472+ return nil
464473 end
474+ local response = convertDefinitionResult (state , result )
465475 return response
466476 end
467477}
0 commit comments