]> Sergey Matveev's repositories - vim-lsp.git/commitdiff
Move the server/client capabilities functions to a separate file. Sort the options...
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sat, 1 Apr 2023 21:39:49 +0000 (14:39 -0700)
committerYegappan Lakshmanan <yegappan@yahoo.com>
Sat, 1 Apr 2023 21:39:49 +0000 (14:39 -0700)
autoload/lsp/capabilities.vim [new file with mode: 0644]
autoload/lsp/lspserver.vim
autoload/lsp/options.vim
doc/lsp.txt

diff --git a/autoload/lsp/capabilities.vim b/autoload/lsp/capabilities.vim
new file mode 100644 (file)
index 0000000..ac9b080
--- /dev/null
@@ -0,0 +1,332 @@
+vim9script
+
+# Functions for managing the LSP server and client capabilities
+
+import './options.vim' as opt
+
+# Process the server capabilities
+export def ProcessServerCaps(lspserver: dict<any>, caps: dict<any>)
+  # completionProvider
+  if lspserver.caps->has_key('completionProvider')
+    lspserver.isCompletionProvider = true
+    if lspserver.caps.completionProvider->has_key('resolveProvider')
+      lspserver.isCompletionResolveProvider =
+                       lspserver.caps.completionProvider.resolveProvider
+    else
+      lspserver.isCompletionResolveProvider = false
+    endif
+  else
+    lspserver.isCompletionProvider = false
+    lspserver.isCompletionResolveProvider = false
+  endif
+
+  # definitionProvider
+  if lspserver.caps->has_key('definitionProvider')
+    if lspserver.caps.definitionProvider->type() == v:t_bool
+      lspserver.isDefinitionProvider = lspserver.caps.definitionProvider
+    else
+      lspserver.isDefinitionProvider = true
+    endif
+  else
+    lspserver.isDefinitionProvider = false
+  endif
+
+  # declarationProvider
+  if lspserver.caps->has_key('declarationProvider')
+    if lspserver.caps.declarationProvider->type() == v:t_bool
+      lspserver.isDeclarationProvider = lspserver.caps.declarationProvider
+    else
+      lspserver.isDeclarationProvider = true
+    endif
+  else
+    lspserver.isDeclarationProvider = false
+  endif
+
+  # typeDefinitionProvider
+  if lspserver.caps->has_key('typeDefinitionProvider')
+    if lspserver.caps.typeDefinitionProvider->type() == v:t_bool
+      lspserver.isTypeDefinitionProvider = lspserver.caps.typeDefinitionProvider
+    else
+      lspserver.isTypeDefinitionProvider = true
+    endif
+  else
+    lspserver.isTypeDefinitionProvider = false
+  endif
+
+  # implementationProvider
+  if lspserver.caps->has_key('implementationProvider')
+    if lspserver.caps.implementationProvider->type() == v:t_bool
+      lspserver.isImplementationProvider = lspserver.caps.implementationProvider
+    else
+      lspserver.isImplementationProvider = true
+    endif
+  else
+    lspserver.isImplementationProvider = false
+  endif
+
+  # signatureHelpProvider
+  if lspserver.caps->has_key('signatureHelpProvider')
+    lspserver.isSignatureHelpProvider = true
+  else
+    lspserver.isSignatureHelpProvider = false
+  endif
+
+  # hoverProvider
+  if lspserver.caps->has_key('hoverProvider')
+    if lspserver.caps.hoverProvider->type() == v:t_bool
+      lspserver.isHoverProvider = lspserver.caps.hoverProvider
+    else
+      lspserver.isHoverProvider = true
+    endif
+  else
+    lspserver.isHoverProvider = false
+  endif
+
+  # referencesProvider
+  if lspserver.caps->has_key('referencesProvider')
+    if lspserver.caps.referencesProvider->type() == v:t_bool
+      lspserver.isReferencesProvider = lspserver.caps.referencesProvider
+    else
+      lspserver.isReferencesProvider = true
+    endif
+  else
+    lspserver.isReferencesProvider = false
+  endif
+
+  # documentHighlightProvider
+  if lspserver.caps->has_key('documentHighlightProvider')
+    if lspserver.caps.documentHighlightProvider->type() == v:t_bool
+      lspserver.isDocumentHighlightProvider =
+                               lspserver.caps.documentHighlightProvider
+    else
+      lspserver.isDocumentHighlightProvider = true
+    endif
+  else
+    lspserver.isDocumentHighlightProvider = false
+  endif
+
+  # documentSymbolProvider
+  if lspserver.caps->has_key('documentSymbolProvider')
+    if lspserver.caps.documentSymbolProvider->type() == v:t_bool
+      lspserver.isDocumentSymbolProvider =
+                               lspserver.caps.documentSymbolProvider
+    else
+      lspserver.isDocumentSymbolProvider = true
+    endif
+  else
+    lspserver.isDocumentSymbolProvider = false
+  endif
+
+  # documentFormattingProvider
+  if lspserver.caps->has_key('documentFormattingProvider')
+    if lspserver.caps.documentFormattingProvider->type() == v:t_bool
+      lspserver.isDocumentFormattingProvider =
+                               lspserver.caps.documentFormattingProvider
+    else
+      lspserver.isDocumentFormattingProvider = true
+    endif
+  else
+    lspserver.isDocumentFormattingProvider = false
+  endif
+
+  # callHierarchyProvider
+  if lspserver.caps->has_key('callHierarchyProvider')
+    if lspserver.caps.callHierarchyProvider->type() == v:t_bool
+      lspserver.isCallHierarchyProvider =
+                               lspserver.caps.callHierarchyProvider
+    else
+      lspserver.isCallHierarchyProvider = true
+    endif
+  else
+    lspserver.isCallHierarchyProvider = false
+  endif
+
+  # typeHierarchyProvider
+  if lspserver.caps->has_key('typeHierarchyProvider')
+    lspserver.isTypeHierarchyProvider = true
+  else
+    lspserver.isTypeHierarchyProvider = false
+  endif
+
+  # renameProvider
+  if lspserver.caps->has_key('renameProvider')
+    if lspserver.caps.renameProvider->type() == v:t_bool
+      lspserver.isRenameProvider = lspserver.caps.renameProvider
+    else
+      lspserver.isRenameProvider = true
+    endif
+  else
+    lspserver.isRenameProvider = false
+  endif
+
+  # codeActionProvider
+  if lspserver.caps->has_key('codeActionProvider')
+    if lspserver.caps.codeActionProvider->type() == v:t_bool
+      lspserver.isCodeActionProvider = lspserver.caps.codeActionProvider
+    else
+      lspserver.isCodeActionProvider = true
+    endif
+  else
+    lspserver.isCodeActionProvider = false
+  endif
+
+  # workspaceSymbolProvider
+  if lspserver.caps->has_key('workspaceSymbolProvider')
+    if lspserver.caps.workspaceSymbolProvider->type() == v:t_bool
+      lspserver.isWorkspaceSymbolProvider =
+                               lspserver.caps.workspaceSymbolProvider
+    else
+      lspserver.isWorkspaceSymbolProvider = true
+    endif
+  else
+    lspserver.isWorkspaceSymbolProvider = false
+  endif
+
+  # selectionRangeProvider
+  if lspserver.caps->has_key('selectionRangeProvider')
+    if lspserver.caps.selectionRangeProvider->type() == v:t_bool
+      lspserver.isSelectionRangeProvider =
+                               lspserver.caps.selectionRangeProvider
+    else
+      lspserver.isSelectionRangeProvider = true
+    endif
+  else
+    lspserver.isSelectionRangeProvider = false
+  endif
+
+  # foldingRangeProvider
+  if lspserver.caps->has_key('foldingRangeProvider')
+    if lspserver.caps.foldingRangeProvider->type() == v:t_bool
+      lspserver.isFoldingRangeProvider = lspserver.caps.foldingRangeProvider
+    else
+      lspserver.isFoldingRangeProvider = true
+    endif
+  else
+    lspserver.isFoldingRangeProvider = false
+  endif
+
+  # inlayHintProvider
+  if lspserver.caps->has_key('inlayHintProvider')
+    if lspserver.caps.inlayHintProvider->type() == v:t_bool
+      lspserver.isInlayHintProvider = lspserver.caps.inlayHintProvider
+    else
+      lspserver.isInlayHintProvider = true
+    endif
+  else
+    lspserver.isInlayHintProvider = false
+  endif
+
+  # clangdInlayHintsProvider
+  if lspserver.caps->has_key('clangdInlayHintsProvider')
+    lspserver.isClangdInlayHintsProvider =
+                                       lspserver.caps.clangdInlayHintsProvider
+  else
+    lspserver.isClangdInlayHintsProvider = false
+  endif
+
+  # textDocument/didSave notification
+  if lspserver.caps->has_key('textDocumentSync')
+    if lspserver.caps.textDocumentSync->type() == v:t_bool
+               || lspserver.caps.textDocumentSync->type() == v:t_number
+      lspserver.supportsDidSave = lspserver.caps.textDocumentSync
+    else
+      if lspserver.caps.textDocumentSync->type() == v:t_dict
+       if lspserver.caps.textDocumentSync->has_key('save')
+         if lspserver.caps.textDocumentSync.save->type() == v:t_bool
+           || lspserver.caps.textDocumentSync.save->type() == v:t_number
+           lspserver.supportsDidSave = lspserver.caps.textDocumentSync.save
+         elseif lspserver.caps.textDocumentSync.save->type() == v:t_dict
+           lspserver.supportsDidSave = true
+         else
+           lspserver.supportsDidSave = false
+         endif
+       else
+         lspserver.supportsDidSave = false
+       endif
+      else
+       lspserver.supportsDidSave = false
+      endif
+    endif
+  else
+    lspserver.supportsDidSave = false
+  endif
+enddef
+
+# Return all the LSP client capabilities
+export def GetClientCaps(): dict<any>
+  # client capabilities (ClientCapabilities)
+  var clientCaps: dict<any> = {
+    workspace: {
+      workspaceFolders: true,
+      applyEdit: true,
+      configuration: false
+    },
+    textDocument: {
+      callHierarchy: {
+       dynamicRegistration: false
+      },
+      codeAction: {
+       dynamicRegistration: false,
+       codeActionLiteralSupport: {
+         codeActionKind: {
+           valueSet: ['', 'quickfix', 'refactor', 'refactor.extract',
+                       'refactor.inline', 'refactor.rewrite', 'source',
+                       'source.organizeImports']
+         }
+       },
+        isPreferredSupport: true,
+       disabledSupport: true
+      },
+      codeLens: {
+       dynamicRegistration: false
+      },
+      completion: {
+       dynamicRegistration: false,
+       completionItem: {
+         documentationFormat: ['plaintext', 'markdown'],
+         resolveSupport: {properties: ['detail', 'documentation']},
+         snippetSupport: opt.lspOptions.snippetSupport
+       },
+       completionItemKind: {valueSet: range(1, 25)}
+      },
+      documentSymbol: {
+       dynamicRegistration: false,
+       hierarchicalDocumentSymbolSupport: true,
+       symbolKind: {valueSet: range(1, 25)}
+      },
+      hover: {
+        contentFormat: ['plaintext', 'markdown']
+      },
+      foldingRange: {lineFoldingOnly: true},
+      inlayHint: {dynamicRegistration: false},
+      synchronization: {
+       didSave: true
+      },
+      declaration: {linkSupport: true},
+      definition: {linkSupport: true},
+      typeDefinition: {linkSupport: true},
+      implementation: {linkSupport: true},
+      signatureHelp: {
+       signatureInformation: {
+         documentationFormat: ['plaintext', 'markdown'],
+         activeParameterSupport: true
+       }
+      }
+    },
+    window: {},
+    general: {
+      # Currently we always send character count as position offset,
+      # which meanas only utf-32 is supported.
+      # Adding utf-16 simply for good mesure, as I'm scared some servers will
+      # give up if they don't support utf-32 only.
+      positionEncodings: ['utf-32', 'utf-16']
+    },
+    # This is the way clangd expects to be informated about supported encodings:
+    # https://clangd.llvm.org/extensions#utf-8-offsets
+    offsetEncoding: ['utf-32', 'utf-16']
+  }
+
+  return clientCaps
+enddef
+
+# vim: tabstop=8 shiftwidth=2 softtabstop=2
index d38d208254df79793a3d35480b8b8d7895dc723d..d8907c35f94c976cd5343e9b778fa2ef26d706a6 100644 (file)
@@ -11,6 +11,7 @@ vim9script
 import './options.vim' as opt
 import './handlers.vim'
 import './util.vim'
+import './capabilities.vim'
 import './diag.vim'
 import './selection.vim'
 import './symbol.vim'
@@ -89,254 +90,6 @@ def StartServer(lspserver: dict<any>): number
   return 0
 enddef
 
-# Process the server capabilities
-def ProcessServerCaps(lspserver: dict<any>, caps: dict<any>)
-  # completionProvider
-  if lspserver.caps->has_key('completionProvider')
-    lspserver.isCompletionProvider = true
-    if lspserver.caps.completionProvider->has_key('resolveProvider')
-      lspserver.isCompletionResolveProvider =
-                       lspserver.caps.completionProvider.resolveProvider
-    else
-      lspserver.isCompletionResolveProvider = false
-    endif
-  else
-    lspserver.isCompletionProvider = false
-    lspserver.isCompletionResolveProvider = false
-  endif
-
-  # definitionProvider
-  if lspserver.caps->has_key('definitionProvider')
-    if lspserver.caps.definitionProvider->type() == v:t_bool
-      lspserver.isDefinitionProvider = lspserver.caps.definitionProvider
-    else
-      lspserver.isDefinitionProvider = true
-    endif
-  else
-    lspserver.isDefinitionProvider = false
-  endif
-
-  # declarationProvider
-  if lspserver.caps->has_key('declarationProvider')
-    if lspserver.caps.declarationProvider->type() == v:t_bool
-      lspserver.isDeclarationProvider = lspserver.caps.declarationProvider
-    else
-      lspserver.isDeclarationProvider = true
-    endif
-  else
-    lspserver.isDeclarationProvider = false
-  endif
-
-  # typeDefinitionProvider
-  if lspserver.caps->has_key('typeDefinitionProvider')
-    if lspserver.caps.typeDefinitionProvider->type() == v:t_bool
-      lspserver.isTypeDefinitionProvider = lspserver.caps.typeDefinitionProvider
-    else
-      lspserver.isTypeDefinitionProvider = true
-    endif
-  else
-    lspserver.isTypeDefinitionProvider = false
-  endif
-
-  # implementationProvider
-  if lspserver.caps->has_key('implementationProvider')
-    if lspserver.caps.implementationProvider->type() == v:t_bool
-      lspserver.isImplementationProvider = lspserver.caps.implementationProvider
-    else
-      lspserver.isImplementationProvider = true
-    endif
-  else
-    lspserver.isImplementationProvider = false
-  endif
-
-  # signatureHelpProvider
-  if lspserver.caps->has_key('signatureHelpProvider')
-    lspserver.isSignatureHelpProvider = true
-  else
-    lspserver.isSignatureHelpProvider = false
-  endif
-
-  # hoverProvider
-  if lspserver.caps->has_key('hoverProvider')
-    if lspserver.caps.hoverProvider->type() == v:t_bool
-      lspserver.isHoverProvider = lspserver.caps.hoverProvider
-    else
-      lspserver.isHoverProvider = true
-    endif
-  else
-    lspserver.isHoverProvider = false
-  endif
-
-  # referencesProvider
-  if lspserver.caps->has_key('referencesProvider')
-    if lspserver.caps.referencesProvider->type() == v:t_bool
-      lspserver.isReferencesProvider = lspserver.caps.referencesProvider
-    else
-      lspserver.isReferencesProvider = true
-    endif
-  else
-    lspserver.isReferencesProvider = false
-  endif
-
-  # documentHighlightProvider
-  if lspserver.caps->has_key('documentHighlightProvider')
-    if lspserver.caps.documentHighlightProvider->type() == v:t_bool
-      lspserver.isDocumentHighlightProvider =
-                               lspserver.caps.documentHighlightProvider
-    else
-      lspserver.isDocumentHighlightProvider = true
-    endif
-  else
-    lspserver.isDocumentHighlightProvider = false
-  endif
-
-  # documentSymbolProvider
-  if lspserver.caps->has_key('documentSymbolProvider')
-    if lspserver.caps.documentSymbolProvider->type() == v:t_bool
-      lspserver.isDocumentSymbolProvider =
-                               lspserver.caps.documentSymbolProvider
-    else
-      lspserver.isDocumentSymbolProvider = true
-    endif
-  else
-    lspserver.isDocumentSymbolProvider = false
-  endif
-
-  # documentFormattingProvider
-  if lspserver.caps->has_key('documentFormattingProvider')
-    if lspserver.caps.documentFormattingProvider->type() == v:t_bool
-      lspserver.isDocumentFormattingProvider =
-                               lspserver.caps.documentFormattingProvider
-    else
-      lspserver.isDocumentFormattingProvider = true
-    endif
-  else
-    lspserver.isDocumentFormattingProvider = false
-  endif
-
-  # callHierarchyProvider
-  if lspserver.caps->has_key('callHierarchyProvider')
-    if lspserver.caps.callHierarchyProvider->type() == v:t_bool
-      lspserver.isCallHierarchyProvider =
-                               lspserver.caps.callHierarchyProvider
-    else
-      lspserver.isCallHierarchyProvider = true
-    endif
-  else
-    lspserver.isCallHierarchyProvider = false
-  endif
-
-  # typeHierarchyProvider
-  if lspserver.caps->has_key('typeHierarchyProvider')
-    lspserver.isTypeHierarchyProvider = true
-  else
-    lspserver.isTypeHierarchyProvider = false
-  endif
-
-  # renameProvider
-  if lspserver.caps->has_key('renameProvider')
-    if lspserver.caps.renameProvider->type() == v:t_bool
-      lspserver.isRenameProvider = lspserver.caps.renameProvider
-    else
-      lspserver.isRenameProvider = true
-    endif
-  else
-    lspserver.isRenameProvider = false
-  endif
-
-  # codeActionProvider
-  if lspserver.caps->has_key('codeActionProvider')
-    if lspserver.caps.codeActionProvider->type() == v:t_bool
-      lspserver.isCodeActionProvider = lspserver.caps.codeActionProvider
-    else
-      lspserver.isCodeActionProvider = true
-    endif
-  else
-    lspserver.isCodeActionProvider = false
-  endif
-
-  # workspaceSymbolProvider
-  if lspserver.caps->has_key('workspaceSymbolProvider')
-    if lspserver.caps.workspaceSymbolProvider->type() == v:t_bool
-      lspserver.isWorkspaceSymbolProvider =
-                               lspserver.caps.workspaceSymbolProvider
-    else
-      lspserver.isWorkspaceSymbolProvider = true
-    endif
-  else
-    lspserver.isWorkspaceSymbolProvider = false
-  endif
-
-  # selectionRangeProvider
-  if lspserver.caps->has_key('selectionRangeProvider')
-    if lspserver.caps.selectionRangeProvider->type() == v:t_bool
-      lspserver.isSelectionRangeProvider =
-                               lspserver.caps.selectionRangeProvider
-    else
-      lspserver.isSelectionRangeProvider = true
-    endif
-  else
-    lspserver.isSelectionRangeProvider = false
-  endif
-
-  # foldingRangeProvider
-  if lspserver.caps->has_key('foldingRangeProvider')
-    if lspserver.caps.foldingRangeProvider->type() == v:t_bool
-      lspserver.isFoldingRangeProvider = lspserver.caps.foldingRangeProvider
-    else
-      lspserver.isFoldingRangeProvider = true
-    endif
-  else
-    lspserver.isFoldingRangeProvider = false
-  endif
-
-  # inlayHintProvider
-  if lspserver.caps->has_key('inlayHintProvider')
-    if lspserver.caps.inlayHintProvider->type() == v:t_bool
-      lspserver.isInlayHintProvider = lspserver.caps.inlayHintProvider
-    else
-      lspserver.isInlayHintProvider = true
-    endif
-  else
-    lspserver.isInlayHintProvider = false
-  endif
-
-  # clangdInlayHintsProvider
-  if lspserver.caps->has_key('clangdInlayHintsProvider')
-    lspserver.isClangdInlayHintsProvider =
-                                       lspserver.caps.clangdInlayHintsProvider
-  else
-    lspserver.isClangdInlayHintsProvider = false
-  endif
-
-  # textDocument/didSave notification
-  if lspserver.caps->has_key('textDocumentSync')
-    if lspserver.caps.textDocumentSync->type() == v:t_bool
-               || lspserver.caps.textDocumentSync->type() == v:t_number
-      lspserver.supportsDidSave = lspserver.caps.textDocumentSync
-    else
-      if lspserver.caps.textDocumentSync->type() == v:t_dict
-       if lspserver.caps.textDocumentSync->has_key('save')
-         if lspserver.caps.textDocumentSync.save->type() == v:t_bool
-           || lspserver.caps.textDocumentSync.save->type() == v:t_number
-           lspserver.supportsDidSave = lspserver.caps.textDocumentSync.save
-         elseif lspserver.caps.textDocumentSync.save->type() == v:t_dict
-           lspserver.supportsDidSave = true
-         else
-           lspserver.supportsDidSave = false
-         endif
-       else
-         lspserver.supportsDidSave = false
-       endif
-      else
-       lspserver.supportsDidSave = false
-      endif
-    endif
-  else
-    lspserver.supportsDidSave = false
-  endif
-enddef
-
 # process the 'initialize' method reply from the LSP server
 # Result: InitializeResult
 def ServerInitReply(lspserver: dict<any>, initResult: dict<any>): void
@@ -355,12 +108,13 @@ def ServerInitReply(lspserver: dict<any>, initResult: dict<any>): void
     lspserver.caps[$'~additionalInitResult_{key}'] = val
   endfor
 
-  ProcessServerCaps(lspserver, caps)
+  capabilities.ProcessServerCaps(lspserver, caps)
 
   if opt.lspOptions.autoComplete && caps->has_key('completionProvider')
-    lspserver.completionTriggerChars = caps.completionProvider->get('triggerCharacters', [])
+    lspserver.completionTriggerChars =
+                       caps.completionProvider->get('triggerCharacters', [])
     lspserver.completionLazyDoc =
-               lspserver.caps.completionProvider->get('resolveProvider', false)
+                       caps.completionProvider->get('resolveProvider', false)
   endif
 
   # send a "initialized" notification to server
@@ -386,78 +140,6 @@ enddef
 # Request: 'initialize'
 # Param: InitializeParams
 def InitServer(lspserver: dict<any>)
-  # client capabilities (ClientCapabilities)
-  var clientCaps: dict<any> = {
-    workspace: {
-      workspaceFolders: true,
-      applyEdit: true,
-      configuration: false
-    },
-    textDocument: {
-      callHierarchy: {
-       dynamicRegistration: false
-      },
-      codeAction: {
-       dynamicRegistration: false,
-       codeActionLiteralSupport: {
-         codeActionKind: {
-           valueSet: ['', 'quickfix', 'refactor', 'refactor.extract',
-                       'refactor.inline', 'refactor.rewrite', 'source',
-                       'source.organizeImports']
-         }
-       },
-        isPreferredSupport: true,
-       disabledSupport: true
-      },
-      codeLens: {
-       dynamicRegistration: false
-      },
-      completion: {
-       dynamicRegistration: false,
-       completionItem: {
-         documentationFormat: ['plaintext', 'markdown'],
-         resolveSupport: {properties: ['detail', 'documentation']},
-         snippetSupport: opt.lspOptions.snippetSupport
-       },
-       completionItemKind: {valueSet: range(1, 25)}
-      },
-      documentSymbol: {
-       dynamicRegistration: false,
-       hierarchicalDocumentSymbolSupport: true,
-       symbolKind: {valueSet: range(1, 25)}
-      },
-      hover: {
-        contentFormat: ['plaintext', 'markdown']
-      },
-      foldingRange: {lineFoldingOnly: true},
-      inlayHint: {dynamicRegistration: false},
-      synchronization: {
-       didSave: true
-      },
-      declaration: {linkSupport: true},
-      definition: {linkSupport: true},
-      typeDefinition: {linkSupport: true},
-      implementation: {linkSupport: true},
-      signatureHelp: {
-       signatureInformation: {
-         documentationFormat: ['plaintext', 'markdown'],
-         activeParameterSupport: true
-       }
-      }
-    },
-    window: {},
-    general: {
-      # Currently we always send character count as position offset,
-      # which meanas only utf-32 is supported.
-      # Adding utf-16 simply for good mesure, as I'm scared some servers will
-      # give up if they don't support utf-32 only.
-      positionEncodings: ['utf-32', 'utf-16']
-    },
-    # This is the way clangd expects to be informated about supported encodings:
-    # https://clangd.llvm.org/extensions#utf-8-offsets
-    offsetEncoding: ['utf-32', 'utf-16']
-  }
-
   # interface 'InitializeParams'
   var initparams: dict<any> = {}
   initparams.processId = getpid()
@@ -473,7 +155,7 @@ def InitServer(lspserver: dict<any>)
        uri: util.LspFileToUri(curdir)
      }]
   initparams.trace = 'off'
-  initparams.capabilities = clientCaps
+  initparams.capabilities = capabilities.GetClientCaps()
   if !lspserver.initializationOptions->empty()
     initparams.initializationOptions = lspserver.initializationOptions
   endif
@@ -923,24 +605,27 @@ def GotoSymbolLoc(lspserver: dict<any>, msg: string, peekSymbol: bool,
     return
   endif
 
-  var title: string = ''
-  if msg ==# 'textDocument/declaration'
-    title = 'Declarations'
-  elseif msg ==# 'textDocument/typeDefinition'
-    title = 'Type Definitions'
-  elseif msg ==# 'textDocument/implementation'
-    title = 'Implementations'
-  else
-    title = 'Definitions'
-  endif
-
   var location: dict<any>
   if reply.result->type() == v:t_list
+    # When there are multiple symbol locations, display the locations in a
+    # location list.
     if reply.result->len() > 1
+      var title: string = ''
+      if msg ==# 'textDocument/declaration'
+       title = 'Declarations'
+      elseif msg ==# 'textDocument/typeDefinition'
+       title = 'Type Definitions'
+      elseif msg ==# 'textDocument/implementation'
+       title = 'Implementations'
+      else
+       title = 'Definitions'
+      endif
+
       symbol.ShowLocations(lspserver, reply.result, peekSymbol, title)
       return
     endif
 
+    # Only one location
     location = reply.result[0]
   else
     location = reply.result
index b80b03dd9afe0e64a7d96033ff049d6238a2e3cd..411e3e195ae105a1e1ba262c6f3087ad80febc3c 100644 (file)
@@ -8,70 +8,70 @@ export var lspOptions: dict<any> = {
   autoComplete: true,
   # In normal mode, highlight the current symbol automatically
   autoHighlight: false,
-  # In insert mode, show the current symbol signature automatically
-  showSignature: true,
-  # In insert mode, echo the current symbol signature in the status line
-  # instead of showing it in a popup
-  echoSignature: false,
   # Automatically highlight diagnostics messages from LSP server
   autoHighlightDiags: true,
   # Automatically populate the location list with new diagnostics
   autoPopulateDiags: false,
+  # icase | fuzzy | case match for language servers that replies with a full
+  # list of completion items
+  completionMatcher: 'case',
+  # The highlight group used inline Error diagnostics
+  diagInlineErrorHL: 'SpellBad',
+  # The highlight group used inline Hint diagnostics
+  diagInlineHintHL: 'SpellLocal',
+  # The highlight group used inline Info diagnostics
+  diagInlineInfoHL: 'SpellRare',
+  # The highlight group used inline Warning diagnostics
+  diagInlineWarningHL: 'SpellCap',
+  # Default diagnostic highlight on lines
+  diagLineHL: 'DiffAdd',
+  # diagnostics signs options
+  diagSignErrorText: 'E>',
+  diagSignErrorTexthl: 'ErrorMsg',
+  diagSignHintText: 'H>',
+  diagSignHintTexthl: 'Question',
+  diagSignInfoText: 'I>',
+  diagSignInfoTexthl: 'Pmenu',
+  diagSignWarningText: 'W>',
+  diagSignWarningTexthl: 'Search',
+  # The highlight group used for a diagnostics virtual text
+  diagVirtualTextHL: 'LineNr',
+  # In insert mode, echo the current symbol signature in the status line
+  # instead of showing it in a popup
+  echoSignature: false,
+  # hide disabled code actions
+  hideDisabledCodeActions: false,
+  # Highlight diagnostics inline
+  highlightDiagInline: false,
   # Show the symbol documentation in the preview window instead of in a popup
   hoverInPreview: false,
+  # Don't print message when a configured language server is missing.
+  ignoreMissingServer: false,
   # Focus on the location list window after LspShowReferences
   keepFocusInReferences: false,
+  # instead of the signature
+  noDiagHoverOnLine: true,
   # Suppress adding a new line on completion selection with <CR>
   noNewlineInCompletion: false,
-  # Outline window size
-  outlineWinSize: 20,
   # Open outline window on right side
   outlineOnRight: false,
+  # Outline window size
+  outlineWinSize: 20,
+  # Make diagnostics show in a popup instead of echoing
+  showDiagInPopup: true,
   # Suppress diagnostic hover from appearing when the mouse is over the line
-  # instead of the signature
-  noDiagHoverOnLine: true,
   # Show a diagnostic message on a status line
   showDiagOnStatusLine: false,
-  # Make diagnostics show in a popup instead of echoing
-  showDiagInPopup: true,
-  # Default diagnostic highlight on lines
-  diagLineHL: 'DiffAdd',
   # Show a diagnostic messages with virtual text
   showDiagWithVirtualText: false,
-  # The highlight group used for a diagnostics virtual text
-  diagVirtualTextHL: 'LineNr',
-  # Highlight diagnostics inline
-  highlightDiagInline: false,
-  # The highlight group used inline Error diagnostics
-  diagInlineErrorHL: 'SpellBad',
-  # The highlight group used inline Warning diagnostics
-  diagInlineWarningHL: 'SpellCap',
-  # The highlight group used inline Info diagnostics
-  diagInlineInfoHL: 'SpellRare',
-  # The highlight group used inline Hint diagnostics
-  diagInlineHintHL: 'SpellLocal',
-  # Don't print message when a configured language server is missing.
-  ignoreMissingServer: false,
-  # Use a floating menu to show the code action menu instead of asking for input
-  usePopupInCodeAction: false,
-  # enable snippet completion support
-  snippetSupport: false,
   # enable inlay hints
   showInlayHints: false,
-  # hide disabled code actions
-  hideDisabledCodeActions: false,
-  # icase | fuzzy | case match for language servers that replies with a full
-  # list of completion items
-  completionMatcher: 'case',
-  # diagnostics signs options
-  diagSignErrorText: 'E>',
-  diagSignErrorTexthl: 'ErrorMsg',
-  diagSignWarningText: 'W>',
-  diagSignWarningTexthl: 'Search',
-  diagSignInfoText: 'I>',
-  diagSignInfoTexthl: 'Pmenu',
-  diagSignHintText: 'H>',
-  diagSignHintTexthl: 'Question',
+  # In insert mode, show the current symbol signature automatically
+  showSignature: true,
+  # enable snippet completion support
+  snippetSupport: false,
+  # Use a floating menu to show the code action menu instead of asking for input
+  usePopupInCodeAction: false,
   # ShowReferences in a quickfix list instead of a location list`
   useQuickfixForLocations: false
 }
index 394a72f52d0211347f887a3b2273886bb79b95f4..daa3cb441bb5976be86b7982b27224f81052ef9e 100644 (file)
@@ -300,6 +300,14 @@ completionMatcher  |String| option.  Enable fuzzy or case insensitive
                            case  - case sensitive matching (default).
                            fuzzy - fuzzy match completion items.
                            icase - ignore case when matching items.
+diagInlineErrorHL      |String| option.  The highlight group used for
+                       inline error highlight.  By default uses "SpellBad"
+diagInlineHintHL       |String| option.  The highlight group used for
+                       inline hint highlight.  By default uses "SpellLocal"
+diagInlineInfoHL       |String| option.  The highlight group used for
+                       inline info highlight.  By default uses "SpellRare"
+diagInlineWarningHL    |String| option.  The highlight group used for
+                       inline warning highlight.  By default uses "SpellCap"
 diagLineHL             |String| option. The highlight group used for a line
                        with one or more diagnostics.  By default uses
                        "DiffAdd".  Use "NONE" to disable.
@@ -307,18 +315,18 @@ diagSignErrorText       |String| option. Change diag sign text for errors
                         By default 'E>'
 diagSignErrorTexthl     |String| option. Change diag sign highlight for errors
                         By default 'ErrorMsg',
-diagSignWarningText     |String| option. Change diag sign text for warnings
-                        By default 'W>',
-diagSignWarningTexthl   |String| option. Change diag sign highlight for warnings
-                        By default 'Search',
-diagSignInfoText        |String| option. Change diag sign text for info
-                        By default 'I>',
-diagSignInfoTexthl      |String| option. Change diag sign text highlight info
-                        By default 'Pmenu',
 diagSignHintText        |String| option. Change diag sign text for hints
                         By default 'H>',
 diagSignHintTexthl      |String| option. Change diag sign highlight for hints
                         By default 'Question',
+diagSignInfoText        |String| option. Change diag sign text for info
+                        By default 'I>',
+diagSignInfoTexthl      |String| option. Change diag sign text highlight info
+                        By default 'Pmenu',
+diagSignWarningText     |String| option. Change diag sign text for warnings
+                        By default 'W>',
+diagSignWarningTexthl   |String| option. Change diag sign highlight for warnings
+                        By default 'Search',
 diagVirtualTextHL      |String| option.  The highlight group used for a
                        diagnostics virtual text.  By default uses "LineNr".
 echoSignature          |Boolean| option.  In insert mode, echo the current
@@ -326,8 +334,10 @@ echoSignature              |Boolean| option.  In insert mode, echo the current
                        By default this is set to false.
 hideDisabledCodeActions |Boolean| option. Hide all the disabled code actions.
                        By default this is set to false.
+highlightDiagInline    |Boolean| option.  Highlight the diagnostics inline
+                       By default this is set to false.
 hoverInPreview         |Boolean| option. Show |:LspHover| in a preview window
-                       instead of a popup
+                       instead of a popup.
                        By default this is set to false.
 ignoreMissingServer    |Boolean| option.  Do not print a missing language
                        server executable.  By default this is set to false.
@@ -354,15 +364,15 @@ showDiagInPopup           |Boolean| option.  When using the |:LspDiagCurrent|
                        By default this is set to true.
 showDiagOnStatusLine   |Boolean| option.  Show a diagnostic message on a
                        status line.  By default this is set to false.
-showInlayHints         |Boolean| option.  Show inlay hints from the language
-                       server.  By default this is set to false.  The inlay
-                       hint text is displayed as a virtual text.  Needs Vim
-                       version 9.0.0178 or later.
 showDiagWithVirtualText        |Boolean| option.  Show diagnostic message text from
                        the language server with virtual text.  By default
                        this is set to false.  The "autoHighlightDiags" option
                        should be set to true.
                        Needs Vim version 9.0.1157 or later.
+showInlayHints         |Boolean| option.  Show inlay hints from the language
+                       server.  By default this is set to false.  The inlay
+                       hint text is displayed as a virtual text.  Needs Vim
+                       version 9.0.0178 or later.
 showSignature          |Boolean| option.  In insert mode, automatically show
                        the current symbol signature in a popup.
                        By default this is set to true.
@@ -373,17 +383,6 @@ usePopupInCodeAction    |Boolean| option.  When using the |:LspCodeAction|
                        command to display the code action for the current
                        line, use a popup menu instead of echoing.
                        By default this is set to false.
-highlightDiagInline    |Boolean| option.  Highlight the diagnostics inline
-                       By default this is set to false.
-diagInlineErrorHL      |String| option.  The highlight group used for
-                       inline error highlight.  By default uses "SpellBad"
-diagInlineWarningHL    |String| option.  The highlight group used for
-                       inline warning highlight.  By default uses "SpellCap"
-diagInlineInfoHL       |String| option.  The highlight group used for
-                       inline info highlight.  By default uses "SpellRare"
-diagInlineHintHL       |String| option.  The highlight group used for
-                       inline hint highlight.  By default uses "SpellLocal"
-
 
 For example, to disable the automatic placement of signs for the LSP
 diagnostic messages, you can add the following line to your .vimrc file: >
@@ -984,10 +983,33 @@ The following highlight groups are used by the LSP plugin.  You can define
 these highlight groups in your .vimrc file before sourcing this plugin to
 override them.
 
+LspDiagInlineError             Used to highlight inline error diagnostics.
+                               By default, linked to the "SpellBad" highlight
+                               group.
+LspDiagInlineHint              Used to highlight inline hint diagnostics.
+                               By default, linked to the "SpellLocal"
+                               highlight group.
+LspDiagInlineInfo              Used to highlight inline info diagnostics.
+                               By default, linked to the "SpellRare" highlight
+                               group.
+LspDiagInlineWarning           Used to highlight inline warning diagnostics.
+                               By default, linked to the "SpellCap" highlight
+                               group.
+LspDiagVirtualText             Used to highlight diagnostic virtual text.
+                               By default, linked to the "LineNr" highlight
+                               group.
 LspInlayHintsParam             Used to highlight inlay hints of kind
-                               "parameter".
+                               "parameter".  By default, linked to the
+                               "Label" highlight group.
 LspInlayHintsType              Used to highlight inlay hints of kind "type".
+                               By default, linked to the "Conceal" highlight
+                               group.
 
+For example, to override the highlight used for diagnostics virtual text, you
+can use the following:
+>
+    highlight LspDiagVirtualText ctermfg=Cyan guifg=Blue
+<
 ==============================================================================
 13. Debugging                                          *lsp-debug*