Fix #3332 - Modify everything for rename/actions
ALE now just modifies every open buffer for rename and actions, and sets up a one-time use BufEnter event to reload buffers that are changed so you don't have to think about what to do with changed buffers.
This commit is contained in:
parent
b8aaff2cf7
commit
06e7f2195e
5 changed files with 31 additions and 30 deletions
|
@ -1,28 +1,24 @@
|
||||||
" Author: Jerko Steiner <jerko.steiner@gmail.com>
|
" Author: Jerko Steiner <jerko.steiner@gmail.com>
|
||||||
" Description: Code action support for LSP / tsserver
|
" Description: Code action support for LSP / tsserver
|
||||||
|
|
||||||
|
function! ale#code_action#ReloadBuffer() abort
|
||||||
|
let l:buffer = bufnr('')
|
||||||
|
|
||||||
|
execute 'augroup ALECodeActionReloadGroup' . l:buffer
|
||||||
|
autocmd!
|
||||||
|
augroup END
|
||||||
|
|
||||||
|
silent! execute 'augroup! ALECodeActionReloadGroup' . l:buffer
|
||||||
|
|
||||||
|
call ale#util#Execute(':e!')
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! ale#code_action#HandleCodeAction(code_action, options) abort
|
function! ale#code_action#HandleCodeAction(code_action, options) abort
|
||||||
let l:current_buffer = bufnr('')
|
let l:current_buffer = bufnr('')
|
||||||
let l:changes = a:code_action.changes
|
let l:changes = a:code_action.changes
|
||||||
let l:should_save = get(a:options, 'should_save')
|
let l:should_save = get(a:options, 'should_save')
|
||||||
let l:force_save = get(a:options, 'force_save')
|
|
||||||
let l:safe_changes = []
|
|
||||||
|
|
||||||
for l:file_code_edit in l:changes
|
for l:file_code_edit in l:changes
|
||||||
let l:buf = bufnr(l:file_code_edit.fileName)
|
|
||||||
|
|
||||||
if l:buf != -1 && l:buf != l:current_buffer && getbufvar(l:buf, '&mod')
|
|
||||||
if !l:force_save
|
|
||||||
call ale#util#Execute('echom ''Aborting action, file is unsaved''')
|
|
||||||
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
else
|
|
||||||
call add(l:safe_changes, l:file_code_edit)
|
|
||||||
endif
|
|
||||||
endfor
|
|
||||||
|
|
||||||
for l:file_code_edit in l:safe_changes
|
|
||||||
call ale#code_action#ApplyChanges(
|
call ale#code_action#ApplyChanges(
|
||||||
\ l:file_code_edit.fileName,
|
\ l:file_code_edit.fileName,
|
||||||
\ l:file_code_edit.textChanges,
|
\ l:file_code_edit.textChanges,
|
||||||
|
@ -161,6 +157,20 @@ function! ale#code_action#ApplyChanges(filename, changes, should_save) abort
|
||||||
|
|
||||||
call setpos('.', [0, l:pos[0], l:pos[1], 0])
|
call setpos('.', [0, l:pos[0], l:pos[1], 0])
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if a:should_save && l:buffer > 0 && !l:is_current_buffer
|
||||||
|
" Set up a one-time use event that will delete itself to reload the
|
||||||
|
" buffer next time it's entered to view the changes made to it.
|
||||||
|
execute 'augroup ALECodeActionReloadGroup' . l:buffer
|
||||||
|
autocmd!
|
||||||
|
|
||||||
|
execute printf(
|
||||||
|
\ 'autocmd BufEnter <buffer=%d>'
|
||||||
|
\ . ' call ale#code_action#ReloadBuffer()',
|
||||||
|
\ l:buffer
|
||||||
|
\)
|
||||||
|
augroup END
|
||||||
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:UpdateCursor(cursor, start, end, offset) abort
|
function! s:UpdateCursor(cursor, start, end, offset) abort
|
||||||
|
|
|
@ -85,7 +85,6 @@ function! ale#rename#HandleTSServerResponse(conn_id, response) abort
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ 'should_save': 1,
|
\ 'should_save': 1,
|
||||||
\ 'force_save': get(l:options, 'force_save'),
|
|
||||||
\ },
|
\ },
|
||||||
\)
|
\)
|
||||||
endfunction
|
endfunction
|
||||||
|
@ -118,7 +117,6 @@ function! ale#rename#HandleLSPResponse(conn_id, response) abort
|
||||||
\ },
|
\ },
|
||||||
\ {
|
\ {
|
||||||
\ 'should_save': 1,
|
\ 'should_save': 1,
|
||||||
\ 'force_save': get(l:options, 'force_save'),
|
|
||||||
\ },
|
\ },
|
||||||
\)
|
\)
|
||||||
endif
|
endif
|
||||||
|
@ -177,7 +175,7 @@ function! s:ExecuteRename(linter, options) abort
|
||||||
call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback)
|
call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#rename#Execute(options) abort
|
function! ale#rename#Execute() abort
|
||||||
let l:lsp_linters = []
|
let l:lsp_linters = []
|
||||||
|
|
||||||
for l:linter in ale#linter#Get(&filetype)
|
for l:linter in ale#linter#Get(&filetype)
|
||||||
|
@ -205,7 +203,6 @@ function! ale#rename#Execute(options) abort
|
||||||
call s:ExecuteRename(l:lsp_linter, {
|
call s:ExecuteRename(l:lsp_linter, {
|
||||||
\ 'old_name': l:old_name,
|
\ 'old_name': l:old_name,
|
||||||
\ 'new_name': l:new_name,
|
\ 'new_name': l:new_name,
|
||||||
\ 'force_save': get(a:options, 'force_save') is 1,
|
|
||||||
\})
|
\})
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
|
@ -3145,12 +3145,6 @@ ALERename *ALERename*
|
||||||
The symbol where the cursor is resting will be the symbol renamed, and a
|
The symbol where the cursor is resting will be the symbol renamed, and a
|
||||||
prompt will open to request a new name.
|
prompt will open to request a new name.
|
||||||
|
|
||||||
ALE will refuse to complete a rename operation if there are files to modify
|
|
||||||
which have not yet been saved in Vim. If the command is run with a bang
|
|
||||||
(`:ALERename!`), all warnings will be suppressed, and files that are still
|
|
||||||
open in Vim and not saved will be ignored and left in a state where symbols
|
|
||||||
in those files will not be updated.
|
|
||||||
|
|
||||||
|
|
||||||
ALECodeAction *ALECodeAction*
|
ALECodeAction *ALECodeAction*
|
||||||
|
|
||||||
|
|
|
@ -245,7 +245,7 @@ command! -bar ALEComplete :call ale#completion#GetCompletions('ale-manual')
|
||||||
command! -bar ALEImport :call ale#completion#Import()
|
command! -bar ALEImport :call ale#completion#Import()
|
||||||
|
|
||||||
" Rename symbols using tsserver and LSP
|
" Rename symbols using tsserver and LSP
|
||||||
command! -bar -bang ALERename :call ale#rename#Execute({'force_save': '<bang>' is# '!'})
|
command! -bar -bang ALERename :call ale#rename#Execute()
|
||||||
|
|
||||||
" Apply code actions to a range.
|
" Apply code actions to a range.
|
||||||
command! -bar -range ALECodeAction :call ale#codefix#Execute(<range>)
|
command! -bar -range ALECodeAction :call ale#codefix#Execute(<range>)
|
||||||
|
|
|
@ -269,7 +269,7 @@ Execute(tsserver rename requests should be sent):
|
||||||
\ }]
|
\ }]
|
||||||
\ ],
|
\ ],
|
||||||
\ g:message_list
|
\ g:message_list
|
||||||
AssertEqual {'42': {'old_name': 'somelongerline', 'new_name': 'a-new-name', 'force_save': 0}},
|
AssertEqual {'42': {'old_name': 'somelongerline', 'new_name': 'a-new-name'}},
|
||||||
\ ale#rename#GetMap()
|
\ ale#rename#GetMap()
|
||||||
|
|
||||||
Given python(Some Python file):
|
Given python(Some Python file):
|
||||||
|
@ -470,7 +470,7 @@ Execute(LSP rename requests should be sent):
|
||||||
let b:ale_linters = ['pyls']
|
let b:ale_linters = ['pyls']
|
||||||
call setpos('.', [bufnr(''), 1, 5, 0])
|
call setpos('.', [bufnr(''), 1, 5, 0])
|
||||||
|
|
||||||
ALERename!
|
ALERename
|
||||||
|
|
||||||
" We shouldn't register the callback yet.
|
" We shouldn't register the callback yet.
|
||||||
AssertEqual '''''', string(g:Callback)
|
AssertEqual '''''', string(g:Callback)
|
||||||
|
@ -500,5 +500,5 @@ Execute(LSP rename requests should be sent):
|
||||||
\ ],
|
\ ],
|
||||||
\ g:message_list
|
\ g:message_list
|
||||||
|
|
||||||
AssertEqual {'42': {'old_name': 'foo', 'new_name': 'a-new-name', 'force_save': 1}},
|
AssertEqual {'42': {'old_name': 'foo', 'new_name': 'a-new-name'}},
|
||||||
\ ale#rename#GetMap()
|
\ ale#rename#GetMap()
|
||||||
|
|
Reference in a new issue