From d3e10ecb6100bdb6e20a8ee0442e79037b1c6a16 Mon Sep 17 00:00:00 2001 From: Girish Palya Date: Thu, 30 Nov 2023 22:54:14 +0100 Subject: [PATCH] Fix some of the test failures - fixed omnifunc related tests - diag related tests are still failing M autoload/lsp/completion.vim M test/clangd_tests.vim --- autoload/lsp/completion.vim | 97 +++++++++++++++++++------------------ test/clangd_tests.vim | 8 +-- 2 files changed, 54 insertions(+), 51 deletions(-) diff --git a/autoload/lsp/completion.vim b/autoload/lsp/completion.vim index 6f2347f..7c08b03 100644 --- a/autoload/lsp/completion.vim +++ b/autoload/lsp/completion.vim @@ -425,6 +425,29 @@ export def CompletionResolveReply(lspserver: dict, cItem: any) ShowCompletionDocumentation(cItem) enddef +# Return trigger kind and trigger char. If completion trigger is not a keyword +# and not one of the triggerCharacters, return -1. +def GetTriggerAttributes(lspserver: dict): list + var triggerKind: number = 1 + var triggerChar: string = '' + + # Trigger kind is 1 for keyword and 2 for trigger char initiated completion. + var line: string = getline('.') + var cur_col = charcol('.') + if line[cur_col - 2] !~ '\k' + var trigChars = lspserver.completionTriggerChars + var trigidx = trigChars->index(line[cur_col - 2]) + if trigidx == -1 + triggerKind = -1 + else + triggerKind = 2 + triggerChar = trigChars[trigidx] + endif + endif + return [triggerKind, triggerChar] +enddef + + # omni complete handler def g:LspOmniFunc(findstart: number, base: string): any var lspserver: dict = buf.CurbufGetServerChecked('completion') @@ -433,23 +456,27 @@ def g:LspOmniFunc(findstart: number, base: string): any endif if findstart - var triggerKind = LspGetCompletion(lspserver) + + var [triggerKind, triggerChar] = GetTriggerAttributes(lspserver) if triggerKind < 0 - return triggerKind - else - lspserver.completeItems = [] - lspserver.omniCompletePending = true - if triggerKind == 2 # completion caused by triggerChars - lspserver.omniCompleteKeyword = '' - return charcol('.') - 1 - else - var line = getline('.')->strpart(0, col('.') - 1) - var keyword = line->matchstr('\k\+$') - lspserver.omniCompleteKeyword = keyword - return line->len() - keyword->len() - endif + return -1 endif + # first send all the changes in the current buffer to the LSP server + listener_flush() + + lspserver.omniCompletePending = true + lspserver.completeItems = [] + + # initiate a request to LSP server to get list of completions + lspserver.getCompletion(triggerKind, triggerChar) + + # locate the start of the word + var line = getline('.')->strpart(0, col('.') - 1) + var keyword = line->matchstr('\k\+$') + lspserver.omniCompleteKeyword = keyword + return line->len() - keyword->len() + else # Wait for the list of matches from the LSP server var count: number = 0 @@ -466,7 +493,6 @@ def g:LspOmniFunc(findstart: number, base: string): any endif var res: list> = lspserver.completeItems - var prefix = lspserver.omniCompleteKeyword # Don't attempt to filter on the items, when "isIncomplete" is set @@ -495,29 +521,17 @@ def g:LspOmniCompletePending(): bool return !lspserver->empty() && lspserver.omniCompletePending enddef -# Initiate request to server to get completion and return trigger kind -def LspGetCompletion(lspserver: dict): number - var line: string = getline('.') - var cur_col: number = charcol('.') - if cur_col == 0 || line->empty() - return -1 +# Insert mode completion handler. Used when 24x7 completion is enabled +# (default). +def LspComplete() + var lspserver: dict = buf.CurbufGetServer('completion') + if lspserver->empty() || !lspserver.running || !lspserver.ready + return endif - # Trigger kind is 1 for 24x7 code complete or manual invocation - var triggerKind: number = 1 - var triggerChar: string = '' - - # If the character before the cursor is not a keyword character or is not - # one of the LSP completion trigger characters, then do nothing. - if line[cur_col - 2] !~ '\k' - var trigChars = lspserver.completionTriggerChars - var trigidx = trigChars->index(line[cur_col - 2]) - if trigidx == -1 - return -1 - endif - # completion triggered by one of the trigger characters - triggerKind = 2 - triggerChar = trigChars[trigidx] + var [triggerKind, triggerChar] = GetTriggerAttributes(lspserver) + if triggerKind < 0 + return endif # first send all the changes in the current buffer to the LSP server @@ -525,17 +539,6 @@ def LspGetCompletion(lspserver: dict): number # initiate a request to LSP server to get list of completions lspserver.getCompletion(triggerKind, triggerChar) - return triggerKind -enddef - -# Insert mode completion handler. Used when 24x7 completion is enabled -# (default). -def LspComplete() - var lspserver: dict = buf.CurbufGetServer('completion') - if lspserver->empty() || !lspserver.running || !lspserver.ready - return - endif - LspGetCompletion(lspserver) enddef # Lazy complete documentation handler diff --git a/test/clangd_tests.vim b/test/clangd_tests.vim index 97da941..b7a3c54 100644 --- a/test/clangd_tests.vim +++ b/test/clangd_tests.vim @@ -1356,7 +1356,7 @@ def g:Test_LspTagFunc() END writefile(lines, 'Xtagfunc.c') :silent! edit Xtagfunc.c - g:WaitForServerFileLoad(1) + g:WaitForServerFileLoad(3) :setlocal tagfunc=lsp#lsp#TagFunc cursor(3, 4) :exe "normal \" @@ -1519,8 +1519,8 @@ def g:Test_OmniComplete_Struct() feedkeys("cwb\\\\", 'xt') assert_equal(' myTest.baz = 10;', getline('.')) cursor(11, 12) - feedkeys("cw\\\\\", 'xt') - assert_equal(' pTest->foo = 20;', getline('.')) + feedkeys("cw\\\\", 'xt') + assert_equal(' pTest->baz = 20;', getline('.')) :%bw! enddef @@ -1691,7 +1691,7 @@ def g:Test_DiagVirtualText() g:LspOptionsSet({showDiagWithVirtualText: true}) p = prop_list(1, {end_lnum: line('$')}) assert_equal(1, p->len()) - assert_equal([3, 8, 'LspDiagVirtualTextError'], [p[0].lnum, p[0].length, p[0].type]) + assert_equal([3, 'LspDiagVirtualTextError'], [p[0].lnum, p[0].type]) g:LspOptionsSet({showDiagWithVirtualText: false}) p = prop_list(1, {end_lnum: line('$')}) -- 2.48.1