From: Yegappan Lakshmanan Date: Sun, 16 Jan 2022 02:00:38 +0000 (-0800) Subject: Make LSP selection range always use a characterwise visual mode. Add additional tests... X-Git-Url: http://www.git.stargrave.org/?a=commitdiff_plain;h=e7bd19f7af2a47ccb88bd9e909257fdbe3354b35;p=vim-lsp.git Make LSP selection range always use a characterwise visual mode. Add additional tests. Make it easy to test codeaction --- diff --git a/autoload/codeaction.vim b/autoload/codeaction.vim index 28fec07..51b2355 100644 --- a/autoload/codeaction.vim +++ b/autoload/codeaction.vim @@ -32,11 +32,20 @@ export def ApplyCodeAction(lspserver: dict, actions: list>): void t = t->substitute('\n', '\\n', 'g') prompt->add(printf("%d. %s", i + 1, t)) endfor - var choice = inputlist(prompt) - if choice < 1 || choice > prompt->len() - return + + var choice: number + + if exists('g:LSPTest') && g:LSPTest && exists('g:LSPTest_CodeActionChoice') + # Running the LSP unit-tests. Instead of prompting the user, use the + # choice set in LSPTest_CodeActionChoice. + choice = g:LSPTest_CodeActionChoice + else + choice = inputlist(prompt) endif + if choice < 1 || choice >= prompt->len() + return + endif var selAction = actions[choice - 1] # textDocument/codeAction can return either Command[] or CodeAction[]. diff --git a/autoload/handlers.vim b/autoload/handlers.vim index 8f16e9f..3a1b9b9 100644 --- a/autoload/handlers.vim +++ b/autoload/handlers.vim @@ -617,9 +617,10 @@ def s:processSelectionRangeReply(lspserver: dict, req: dict, reply: di var start_col: number = util.GetLineByteFromPos(bnr, r.start) + 1 var end_col: number = util.GetLineByteFromPos(bnr, r.end) + :normal! v"_y setcharpos("'<", [0, r.start.line + 1, start_col, 0]) setcharpos("'>", [0, r.end.line + 1, end_col, 0]) - :normal gv + :normal! gv enddef # Reply: 'textDocument/foldingRange' diff --git a/autoload/lspserver.vim b/autoload/lspserver.vim index a1dff8d..32601c6 100644 --- a/autoload/lspserver.vim +++ b/autoload/lspserver.vim @@ -676,7 +676,6 @@ def s:renameSymbol(lspserver: dict, newName: string) # interface TextDocumentPositionParams req.params = s:getLspTextDocPosition() req.params.newName = newName - #req.params->extend({newName: newName}) lspserver.sendMessage(req) enddef @@ -795,8 +794,7 @@ def s:selectionRange(lspserver: dict, fname: string) var req = lspserver.createRequest('textDocument/selectionRange') # interface SelectionRangeParams # interface TextDocumentIdentifier - req.params->extend({textDocument: {uri: util.LspFileToUri(fname)}, - positions: [s:getLspPosition()]}) + req.params->extend({textDocument: {uri: util.LspFileToUri(fname)}, positions: [s:getLspPosition()]}) lspserver.sendMessage(req) enddef diff --git a/test/test_lsp.vim b/test/test_lsp.vim index a1d57fe..5856392 100644 --- a/test/test_lsp.vim +++ b/test/test_lsp.vim @@ -2,20 +2,22 @@ vim9script # Tests for Vim Language Server Protocol (LSP) client # To run the tests, just source this file +g:LSPTest = true + # Test for formatting a file using LSP def Test_lsp_formatting() :silent! edit Xtest.c setline(1, [' int i;', ' int j;']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['int i;', 'int j;'], getline(1, '$')) deletebufline('', 1, '$') setline(1, ['int f1(int i)', '{', 'int j = 10; return j;', '}']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['int f1(int i) {', ' int j = 10;', ' return j;', '}'], getline(1, '$')) @@ -23,35 +25,35 @@ def Test_lsp_formatting() setline(1, ['', 'int i;']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['', 'int i;'], getline(1, '$')) deletebufline('', 1, '$') setline(1, [' int i;']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['int i;'], getline(1, '$')) deletebufline('', 1, '$') setline(1, [' int i; ']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['int i;'], getline(1, '$')) deletebufline('', 1, '$') setline(1, ['int i;', '', '', '']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal(['int i;'], getline(1, '$')) deletebufline('', 1, '$') setline(1, ['int f1(){int x;int y;x=1;y=2;return x+y;}']) :redraw! :LspFormat - :sleep 1 + :sleep 500m var expected: list =<< trim END int f1() { int x; @@ -67,7 +69,7 @@ def Test_lsp_formatting() setline(1, ['', '', '', '']) :redraw! :LspFormat - :sleep 1 + :sleep 500m assert_equal([''], getline(1, '$')) deletebufline('', 1, '$') @@ -81,7 +83,7 @@ def Test_lsp_formatting() setline(1, lines) :redraw! :4LspFormat - :sleep 1 + :sleep 500m expected =<< trim END int f1() { int i, j; @@ -119,7 +121,7 @@ def Test_lsp_show_references() cursor(5, 2) var bnr: number = bufnr() :LspShowReferences - :sleep 1 + :sleep 500m var qfl: list> = getloclist(0) assert_equal('quickfix', getwinvar(winnr('$'), '&buftype')) assert_equal(bnr, qfl[0].bufnr) @@ -130,7 +132,7 @@ def Test_lsp_show_references() :only cursor(1, 5) :LspShowReferences - :sleep 1 + :sleep 500m qfl = getloclist(0) assert_equal(1, qfl->len()) assert_equal([1, 5], [qfl[0].lnum, qfl[0].col]) @@ -152,7 +154,7 @@ def Test_lsp_diags() } END setline(1, lines) - :sleep 1 + :sleep 500m var bnr: number = bufnr() :redraw! :LspDiagShow @@ -184,15 +186,17 @@ def Test_lsp_diags() assert_equal('Error: No more diagnostics found', output[0]) :%d setline(1, ['void blueFunc()', '{', '}']) - sleep 1 + sleep 500m output = execute('LspDiagShow')->split("\n") assert_match('No diagnostic messages found for', output[0]) :%bw! enddef -# Test for LSP code action to apply fixes +# Test for LSP code action def Test_lsp_codeaction() + silent! edit Xtest.c + sleep 500m var lines: list =<< trim END void testFunc() { @@ -200,35 +204,125 @@ def Test_lsp_codeaction() count == 20; } END - writefile(lines, 'Xtest.c') - var args: list = v:argv->deepcopy() - args->add('Xtest.c') - var buf = term_start(args, {term_finish: 'close'}) - buf->term_wait() + setline(1, lines) + sleep 500m + cursor(4, 1) + redraw! + g:LSPTest_CodeActionChoice = 1 + :LspCodeAction + sleep 500m + assert_equal("\tcount = 20;", getline(4)) + + setline(4, "\tcount = 20:") + cursor(4, 1) + sleep 500m + g:LSPTest_CodeActionChoice = 0 + :LspCodeAction + sleep 500m + assert_equal("\tcount = 20:", getline(4)) + + g:LSPTest_CodeActionChoice = 2 + cursor(4, 1) + :LspCodeAction + sleep 500m + assert_equal("\tcount = 20:", getline(4)) + + g:LSPTest_CodeActionChoice = 1 + cursor(4, 1) + :LspCodeAction + sleep 500m + assert_equal("\tcount = 20;", getline(4)) + + :%bw! +enddef + +# Test for LSP symbol rename +def Test_lsp_rename() + silent! edit Xtest.c + sleep 500m + var lines: list =<< trim END + void F1(int count) + { + count = 20; + + ++count; + } + + void F2(int count) + { + count = 5; + } + END + setline(1, lines) + sleep 500m + cursor(1, 1) + search('count') + redraw! + feedkeys(":LspRename\er\", "xt") + sleep 500m + redraw! + var expected: list =<< trim END + void F1(int counter) + { + counter = 20; + + ++counter; + } + + void F2(int count) + { + count = 5; + } + END + assert_equal(expected, getline(1, '$')) + :%bw! +enddef + +# Test for LSP selection range +def Test_lsp_selection() + silent! edit Xtest.c + sleep 500m + var lines: list =<< trim END + void F1(int count) + { + int i; + for (i = 0; i < 10; i++) { + count++; + } + count = 20; + } + END + setline(1, lines) + sleep 500m + # start a block-wise visual mode, LspSelectionRange should change this to + # a characterwise visual mode. + exe "normal! 1G\G\"_y" + cursor(2, 1) + redraw! + :LspSelectionRange sleep 500m - buf->term_sendkeys('4G') - buf->term_wait() - buf->term_sendkeys(":LspCodeAction\") - buf->term_wait() + redraw! + normal! y + assert_equal('v', visualmode()) + assert_equal([2, 8], [line("'<"), line("'>")]) + # start a linewise visual mode, LspSelectionRange should change this to + # a characterwise visual mode. + exe "normal! 3GViB\"_y" + cursor(4, 29) + redraw! + :LspSelectionRange sleep 500m - buf->term_sendkeys("1") - sleep 50m - buf->term_sendkeys("\") - buf->term_wait() - sleep 50m - buf->term_sendkeys(":wq\") - buf->term_wait() - sleep 100m - var l = readfile('Xtest.c') - assert_equal("\tcount = 20;", l[3]) - delete('Xtest.c') + redraw! + normal! y + assert_equal('v', visualmode()) + assert_equal([4, 5, 6, 5], [line("'<"), col("'<"), line("'>"), col("'>")]) :%bw! enddef def LspRunTests() # Edit a dummy C file to start the LSP server :edit Xtest.c - :sleep 1 + :sleep 500m :%bw! # Get the list of test functions in this file and call them