]> Sergey Matveev's repositories - vim-lsp.git/commitdiff
Show error message instead of an empty popup when there are not content for ":LspHover"
authorAndreas Louv <andreas@louv.dk>
Mon, 3 Apr 2023 16:40:06 +0000 (18:40 +0200)
committerAndreas Louv <andreas@louv.dk>
Mon, 3 Apr 2023 16:40:58 +0000 (18:40 +0200)
autoload/lsp/hover.vim

index 61fd3e62540c8828382f65fe30d4cc458b42ecfb..20698528ba4d0a502fec3c4f5e6ec0793e573d74 100644 (file)
@@ -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<any>, hoverResult: any): void
+# Util used to compute the hoverText from textDocument/hover reply
+def GetHoverText(hoverResult: any): list<any>
   if hoverResult->empty()
-    return
+    return ['', '']
   endif
 
-  var hoverText: list<string>
-  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<string> = []
     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<any>, 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<any>, 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