From 0f239360b5691ef8f04b1478a1f5ccef6e47ab95 Mon Sep 17 00:00:00 2001 From: Billie Cleek Date: Sat, 17 Aug 2024 12:33:40 -0700 Subject: [PATCH] handle multiple code action commands Handle multiple code action commands that are being returned when trying to use refactor.rewrite for fillstruct when the struct being filled results in gopls providing that commannd and a command to split the line into multiple lines. --- autoload/go/lsp.vim | 17 +++++++++++------ scripts/lint | 2 ++ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/autoload/go/lsp.vim b/autoload/go/lsp.vim index c76375801d..4ce354007f 100644 --- a/autoload/go/lsp.vim +++ b/autoload/go/lsp.vim @@ -1639,7 +1639,7 @@ function! go#lsp#Imports() abort let l:lsp = s:lspfactory.get() let l:state = s:newHandlerState('') - let l:handler = go#promise#New(function('s:handleCodeAction', ['source.organizeImports', ''], l:state), 10000, '') + let l:handler = go#promise#New(function('s:handleCodeAction', ['source.organizeImports', '', ''], l:state), 10000, '') let l:state.handleResult = l:handler.wrapper let l:state.error = l:handler.wrapper let l:state.handleError = function('s:handleCodeActionError', [l:fname], l:state) @@ -1663,7 +1663,7 @@ function! go#lsp#FillStruct() abort let l:lsp = s:lspfactory.get() let l:state = s:newHandlerState('') - let l:handler = go#promise#New(function('s:handleCodeAction', ['refactor.rewrite', 'apply_fix'], l:state), 10000, '') + let l:handler = go#promise#New(function('s:handleCodeAction', ['refactor.rewrite', 'apply_fix', 'fillstruct'], l:state), 10000, '') let l:state.handleResult = l:handler.wrapper let l:state.error = l:handler.wrapper let l:state.handleError = function('s:handleCodeActionError', [l:fname], l:state) @@ -1689,7 +1689,7 @@ function! go#lsp#Extract(line1, line2) abort let l:lsp = s:lspfactory.get() let l:state = s:newHandlerState('') - let l:handler = go#promise#New(function('s:handleCodeAction', ['refactor.extract', 'apply_fix'], l:state), 10000, '') + let l:handler = go#promise#New(function('s:handleCodeAction', ['refactor.extract', 'apply_fix', ''], l:state), 10000, '') let l:state.handleResult = l:handler.wrapper let l:state.error = l:handler.wrapper let l:state.handleError = function('s:handleCodeActionError', [l:fname], l:state) @@ -1818,7 +1818,7 @@ function! s:handleFormat(msg) abort dict call s:applyTextEdits(bufnr(''), a:msg) endfunction -function! s:handleCodeAction(kind, cmd, msg) abort dict +function! s:handleCodeAction(kind, cmd, fix, msg) abort dict if type(a:msg) is type('') call self.handleError(a:msg) return @@ -1829,14 +1829,19 @@ function! s:handleCodeAction(kind, cmd, msg) abort dict endif for l:item in a:msg - if get(l:item, 'kind', '') is a:kind + " TODO(bc): always pass in exactly the right kind and remove the fix + " paramter entirely after + " https://github.com/golang/go/issues/68791 is merged and released. + if get(l:item, 'kind', '') is a:kind || l:item.kind is printf('%s.%s', a:kind, a:fix) if has_key(l:item, 'disabled') && get(l:item.disabled, 'reason', '') isnot '' call go#util#EchoWarning(printf('code action is disabled: %s', l:item.disabled.reason)) continue endif if has_key(l:item, 'command') - if has_key(l:item.command, 'command') && (l:item.command.command is a:cmd || l:item.command.command is printf('gopls.%s', a:cmd)) + if has_key(l:item.command, 'command') && + (l:item.command.command is a:cmd || + (l:item.command.command is printf('gopls.%s', a:cmd) && (a:fix is '' || (has_key(l:item.command.arguments, 'Fix') && a:fix == l:item.command.arguments.Fix)))) call s:executeCommand(l:item.command.command, l:item.command.arguments) continue endif diff --git a/scripts/lint b/scripts/lint index 924bb96e8d..755db0775d 100755 --- a/scripts/lint +++ b/scripts/lint @@ -47,6 +47,7 @@ fi ### Run vim-vimlint ################### printf "Running vim-vimlint ... " +set +e lint=$(sh "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlint/bin/vimlint.sh" \ -p "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlparser" \ -l "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlint" \ @@ -56,6 +57,7 @@ lint=$(sh "$vimdir/share/vim/vimgo/pack/vim-go/start/vim-vimlint/bin/vimlint.sh" "$vimgodir" \ 2>&1) result="$?" +set -e if [ "$result" -eq "2" ]; then echo "$lint" echo