]> Sergey Matveev's repositories - vim-lsp.git/commitdiff
Add CompleteDone handler to execute text edits
authorAndrei Tihonovschi <andrew@bw.at.home>
Mon, 31 Oct 2022 17:58:51 +0000 (19:58 +0200)
committerAndrei Tihonovschi <andrew@bw.at.home>
Mon, 31 Oct 2022 17:58:51 +0000 (19:58 +0200)
Add CompleteDone autocommand handler to verify if activated completion
require additional text edits ('server-initiated edits') and to perform
these.
The additional text edits are used for example when an import is
required for the completed entity.

autoload/lsp/lsp.vim

index 13807a2e7337ddcbd265af44f1396f9b47044d97..36ea13cd74148113b56c08fd66c28d444cf13961 100644 (file)
@@ -11,6 +11,7 @@ import './options.vim' as opt
 import './lspserver.vim' as lserver
 import './util.vim'
 import './buffer.vim' as buf
+import './textedit.vim'
 import './diag.vim'
 import './symbol.vim'
 import './outline.vim'
@@ -291,6 +292,12 @@ def AddBufLocalAutocmds(lspserver: dict<any>, bnr: number): void
     endif
   endif
 
+  # Execute LSP server initiated text edits after completion
+  acmds->add({bufnr: bnr,
+             event: 'CompleteDone',
+             group: 'LSPBufferAutocmds',
+             cmd: 'LspCompleteDone()'})
+
   # Auto highlight all the occurrences of the current keyword
   if opt.lspOptions.autoHighlight &&
                        lspserver.caps->get('documentHighlightProvider', false)
@@ -694,6 +701,27 @@ def g:LspOmniFunc(findstart: number, base: string): any
   endif
 enddef
 
+# complete done handler (LSP server-initiated actions after completion)
+def LspCompleteDone()
+  var lspserver: dict<any> = CurbufGetServerChecked()
+  if lspserver->empty()
+    return
+  endif
+
+  if v:completed_item->type() != v:t_dict
+    return
+  endif
+
+  var completionData: any = v:completed_item->get('user_data', '')
+  if completionData->type() != v:t_dict
+      || !completionData->has_key('additionalTextEdits')
+    return
+  endif
+
+  var bnr: number = bufnr()
+  textedit.ApplyTextEdits(bnr, completionData.additionalTextEdits)
+enddef
+
 # Display the hover message from the LSP server for the current cursor
 # location
 export def Hover()