From 35a0c2e796a62ca1b059e783965755a120a6c37c Mon Sep 17 00:00:00 2001 From: Andreas Louv Date: Mon, 3 Apr 2023 18:40:06 +0200 Subject: [PATCH] Show error message instead of an empty popup when there are not content for ":LspHover" --- autoload/lsp/hover.vim | 88 ++++++++++++++++++++++++------------------ 1 file changed, 50 insertions(+), 38 deletions(-) diff --git a/autoload/lsp/hover.vim b/autoload/lsp/hover.vim index 61fd3e6..2069852 100644 --- a/autoload/lsp/hover.vim +++ b/autoload/lsp/hover.vim @@ -5,45 +5,50 @@ vim9script import './util.vim' import './options.vim' as opt -# process the 'textDocument/hover' reply from the LSP server -# Result: Hover | null -export def HoverReply(lspserver: dict, hoverResult: any): void +# Util used to compute the hoverText from textDocument/hover reply +def GetHoverText(hoverResult: any): list if hoverResult->empty() - return + return ['', ''] endif - var hoverText: list - var hoverKind: string - + # MarkupContent if hoverResult.contents->type() == v:t_dict - if hoverResult.contents->has_key('kind') - # MarkupContent - if hoverResult.contents.kind == 'plaintext' - hoverText = hoverResult.contents.value->split("\n") - hoverKind = 'text' - elseif hoverResult.contents.kind == 'markdown' - hoverText = hoverResult.contents.value->split("\n") - hoverKind = 'lspgfm' - else - util.ErrMsg($'Error: Unsupported hover contents type ({hoverResult.contents.kind})') - return - endif - elseif hoverResult.contents->has_key('value') - # MarkedString - hoverText->extend([$'``` {hoverResult.contents.language}']) - hoverText->extend(hoverResult.contents.value->split("\n")) - hoverText->extend(['```']) - hoverKind = 'lspgfm' - else - util.ErrMsg($'Error: Unsupported hover contents ({hoverResult.contents})') - return + && hoverResult.contents->has_key('kind') + if hoverResult.contents.kind == 'plaintext' + return [hoverResult.contents.value->split("\n"), 'text'] endif - elseif hoverResult.contents->type() == v:t_list - # interface MarkedString[] + + if hoverResult.contents.kind == 'markdown' + return [hoverResult.contents.value->split("\n"), 'lspgfm'] + endif + + return ['', ''] + endif + + # MarkedString + if hoverResult.contents->type() == v:t_dict + && hoverResult.contents->has_key('value') + return [ + [$'``` {hoverResult.contents.language}'] + + hoverResult.contents.value->split("\n") + + ['```'], + 'lspgfm' + ] + endif + + # MarkedString + if hoverResult.contents->type() == v:t_string + return [hoverResult.contents->split("\n"), 'lspgfm'] + endif + + # interface MarkedString[] + if hoverResult.contents->type() == v:t_list + var hoverText: list = [] for e in hoverResult.contents if !hoverText->empty() hoverText->extend(['- - -']) endif + if e->type() == v:t_string hoverText->extend(e->split("\n")) else @@ -52,14 +57,21 @@ export def HoverReply(lspserver: dict, hoverResult: any): void hoverText->extend(['```']) endif endfor - hoverKind = 'lspgfm' - elseif hoverResult.contents->type() == v:t_string - if hoverResult.contents->empty() - return - endif - hoverText->extend(hoverResult.contents->split("\n")) - else - util.ErrMsg($'Error: Unsupported hover contents ({hoverResult.contents})') + + return [hoverText, 'lspgfm'] + endif + + return ['', ''] +enddef + +# process the 'textDocument/hover' reply from the LSP server +# Result: Hover | null +export def HoverReply(lspserver: dict, hoverResult: any): void + var [ hoverText, hoverKind ] = GetHoverText(hoverResult) + + # Nothing to show + if hoverText->empty() + util.WarnMsg($'No hover messages found for current position') return endif -- 2.48.1