mirror of
https://github.com/dense-analysis/ale.git
synced 2025-12-07 05:04:28 +08:00
Do not save for ALERename and ALEOrganizeImports
This commit is contained in:
@@ -1,7 +1,7 @@
|
|||||||
" 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#HandleCodeAction(code_action) abort
|
function! ale#code_action#HandleCodeAction(code_action, should_save) 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
|
||||||
|
|
||||||
@@ -17,11 +17,14 @@ function! ale#code_action#HandleCodeAction(code_action) abort
|
|||||||
|
|
||||||
for l:file_code_edit in l:changes
|
for l:file_code_edit in l:changes
|
||||||
call ale#code_action#ApplyChanges(
|
call ale#code_action#ApplyChanges(
|
||||||
\ l:file_code_edit.fileName, l:file_code_edit.textChanges)
|
\ l:file_code_edit.fileName,
|
||||||
|
\ l:file_code_edit.textChanges,
|
||||||
|
\ a:should_save,
|
||||||
|
\ )
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#code_action#ApplyChanges(filename, changes) abort
|
function! ale#code_action#ApplyChanges(filename, changes, should_save) abort
|
||||||
let l:current_buffer = bufnr('')
|
let l:current_buffer = bufnr('')
|
||||||
" The buffer is used to determine the fileformat, if available.
|
" The buffer is used to determine the fileformat, if available.
|
||||||
let l:buffer = bufnr(a:filename)
|
let l:buffer = bufnr(a:filename)
|
||||||
@@ -106,10 +109,17 @@ function! ale#code_action#ApplyChanges(filename, changes) abort
|
|||||||
call remove(l:lines, -1)
|
call remove(l:lines, -1)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call ale#util#Writefile(l:buffer, l:lines, a:filename)
|
if a:should_save
|
||||||
|
call ale#util#Writefile(l:buffer, l:lines, a:filename)
|
||||||
|
else
|
||||||
|
call ale#fix#SetBufferContents(l:buffer, l:lines)
|
||||||
|
endif
|
||||||
|
|
||||||
if l:is_current_buffer
|
if l:is_current_buffer
|
||||||
call ale#util#Execute(':e!')
|
if a:should_save
|
||||||
|
call ale#util#Execute(':e!')
|
||||||
|
endif
|
||||||
|
|
||||||
call setpos('.', [0, l:pos[0], l:pos[1], 0])
|
call setpos('.', [0, l:pos[0], l:pos[1], 0])
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
@@ -739,7 +739,7 @@ function! ale#completion#HandleUserData(completed_item) abort
|
|||||||
endif
|
endif
|
||||||
|
|
||||||
for l:code_action in get(l:user_data, 'codeActions', [])
|
for l:code_action in get(l:user_data, 'codeActions', [])
|
||||||
call ale#code_action#HandleCodeAction(l:code_action)
|
call ale#code_action#HandleCodeAction(l:code_action, v:false)
|
||||||
endfor
|
endfor
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|||||||
@@ -4,40 +4,15 @@ call ale#Set('fix_on_save_ignore', {})
|
|||||||
" Vim doesn't let you modify hidden buffers.
|
" Vim doesn't let you modify hidden buffers.
|
||||||
function! ale#fix#ApplyQueuedFixes(buffer) abort
|
function! ale#fix#ApplyQueuedFixes(buffer) abort
|
||||||
let l:data = get(g:ale_fix_buffer_data, a:buffer, {'done': 0})
|
let l:data = get(g:ale_fix_buffer_data, a:buffer, {'done': 0})
|
||||||
let l:has_bufline_api = exists('*deletebufline') && exists('*setbufline')
|
|
||||||
|
|
||||||
if !l:data.done || (!l:has_bufline_api && a:buffer isnot bufnr(''))
|
if !l:data.done
|
||||||
return
|
return
|
||||||
endif
|
endif
|
||||||
|
|
||||||
call remove(g:ale_fix_buffer_data, a:buffer)
|
call remove(g:ale_fix_buffer_data, a:buffer)
|
||||||
|
|
||||||
if l:data.changes_made
|
if l:data.changes_made
|
||||||
" If the file is in DOS mode, we have to remove carriage returns from
|
let l:new_lines = ale#fix#SetBufferContents(a:buffer, l:data.output)
|
||||||
" the ends of lines before calling setline(), or we will see them
|
|
||||||
" twice.
|
|
||||||
let l:new_lines = getbufvar(a:buffer, '&fileformat') is# 'dos'
|
|
||||||
\ ? map(copy(l:data.output), 'substitute(v:val, ''\r\+$'', '''', '''')')
|
|
||||||
\ : l:data.output
|
|
||||||
let l:first_line_to_remove = len(l:new_lines) + 1
|
|
||||||
|
|
||||||
" Use a Vim API for setting lines in other buffers, if available.
|
|
||||||
if l:has_bufline_api
|
|
||||||
call setbufline(a:buffer, 1, l:new_lines)
|
|
||||||
call deletebufline(a:buffer, l:first_line_to_remove, '$')
|
|
||||||
" Fall back on setting lines the old way, for the current buffer.
|
|
||||||
else
|
|
||||||
let l:old_line_length = len(l:data.lines_before)
|
|
||||||
|
|
||||||
if l:old_line_length >= l:first_line_to_remove
|
|
||||||
let l:save = winsaveview()
|
|
||||||
silent execute
|
|
||||||
\ l:first_line_to_remove . ',' . l:old_line_length . 'd_'
|
|
||||||
call winrestview(l:save)
|
|
||||||
endif
|
|
||||||
|
|
||||||
call setline(1, l:new_lines)
|
|
||||||
endif
|
|
||||||
|
|
||||||
if l:data.should_save
|
if l:data.should_save
|
||||||
if a:buffer is bufnr('')
|
if a:buffer is bufnr('')
|
||||||
@@ -71,6 +46,43 @@ function! ale#fix#ApplyQueuedFixes(buffer) abort
|
|||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
" Sets buffer contents to lines
|
||||||
|
function! ale#fix#SetBufferContents(buffer, lines) abort
|
||||||
|
let l:has_bufline_api = exists('*deletebufline') && exists('*setbufline')
|
||||||
|
|
||||||
|
if !l:has_bufline_api && a:buffer isnot bufnr('')
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
" If the file is in DOS mode, we have to remove carriage returns from
|
||||||
|
" the ends of lines before calling setline(), or we will see them
|
||||||
|
" twice.
|
||||||
|
let l:new_lines = getbufvar(a:buffer, '&fileformat') is# 'dos'
|
||||||
|
\ ? map(copy(a:lines), 'substitute(v:val, ''\r\+$'', '''', '''')')
|
||||||
|
\ : a:lines
|
||||||
|
let l:first_line_to_remove = len(l:new_lines) + 1
|
||||||
|
|
||||||
|
" Use a Vim API for setting lines in other buffers, if available.
|
||||||
|
if l:has_bufline_api
|
||||||
|
call setbufline(a:buffer, 1, l:new_lines)
|
||||||
|
call deletebufline(a:buffer, l:first_line_to_remove, '$')
|
||||||
|
" Fall back on setting lines the old way, for the current buffer.
|
||||||
|
else
|
||||||
|
let l:old_line_length = line('$')
|
||||||
|
|
||||||
|
if l:old_line_length >= l:first_line_to_remove
|
||||||
|
let l:save = winsaveview()
|
||||||
|
silent execute
|
||||||
|
\ l:first_line_to_remove . ',' . l:old_line_length . 'd_'
|
||||||
|
call winrestview(l:save)
|
||||||
|
endif
|
||||||
|
|
||||||
|
call setline(1, l:new_lines)
|
||||||
|
endif
|
||||||
|
|
||||||
|
return l:new_lines
|
||||||
|
endfunction
|
||||||
|
|
||||||
function! ale#fix#ApplyFixes(buffer, output) abort
|
function! ale#fix#ApplyFixes(buffer, output) abort
|
||||||
let l:data = g:ale_fix_buffer_data[a:buffer]
|
let l:data = g:ale_fix_buffer_data[a:buffer]
|
||||||
let l:data.output = a:output
|
let l:data.output = a:output
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ function! ale#organize_imports#HandleTSServerResponse(conn_id, response) abort
|
|||||||
call ale#code_action#HandleCodeAction({
|
call ale#code_action#HandleCodeAction({
|
||||||
\ 'description': 'Organize Imports',
|
\ 'description': 'Organize Imports',
|
||||||
\ 'changes': l:file_code_edits,
|
\ 'changes': l:file_code_edits,
|
||||||
\})
|
\}, v:false)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! s:OnReady(linter, lsp_details) abort
|
function! s:OnReady(linter, lsp_details) abort
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ function! ale#rename#HandleTSServerResponse(conn_id, response) abort
|
|||||||
call ale#code_action#HandleCodeAction({
|
call ale#code_action#HandleCodeAction({
|
||||||
\ 'description': 'rename',
|
\ 'description': 'rename',
|
||||||
\ 'changes': l:changes,
|
\ 'changes': l:changes,
|
||||||
\})
|
\}, v:true)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#rename#HandleLSPResponse(conn_id, response) abort
|
function! ale#rename#HandleLSPResponse(conn_id, response) abort
|
||||||
@@ -134,7 +134,7 @@ function! ale#rename#HandleLSPResponse(conn_id, response) abort
|
|||||||
call ale#code_action#HandleCodeAction({
|
call ale#code_action#HandleCodeAction({
|
||||||
\ 'description': 'rename',
|
\ 'description': 'rename',
|
||||||
\ 'changes': l:changes,
|
\ 'changes': l:changes,
|
||||||
\})
|
\}, v:true)
|
||||||
endif
|
endif
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,8 @@ Before:
|
|||||||
let g:handle_code_action_called = 0
|
let g:handle_code_action_called = 0
|
||||||
function! MockHandleCodeAction() abort
|
function! MockHandleCodeAction() abort
|
||||||
" delfunction! ale#code_action#HandleCodeAction
|
" delfunction! ale#code_action#HandleCodeAction
|
||||||
function! ale#code_action#HandleCodeAction(action) abort
|
function! ale#code_action#HandleCodeAction(action, should_save) abort
|
||||||
|
AssertEqual v:false, a:should_save
|
||||||
let g:handle_code_action_called += 1
|
let g:handle_code_action_called += 1
|
||||||
endfunction
|
endfunction
|
||||||
endfunction
|
endfunction
|
||||||
|
|||||||
@@ -37,10 +37,10 @@ Before:
|
|||||||
After:
|
After:
|
||||||
" Close the extra buffers if we opened it.
|
" Close the extra buffers if we opened it.
|
||||||
if bufnr(g:file1) != -1
|
if bufnr(g:file1) != -1
|
||||||
execute ':bp | :bd ' . bufnr(g:file1)
|
execute ':bp! | :bd! ' . bufnr(g:file1)
|
||||||
endif
|
endif
|
||||||
if bufnr(g:file2) != -1
|
if bufnr(g:file2) != -1
|
||||||
execute ':bp | :bd ' . bufnr(g:file2)
|
execute ':bp! | :bd! ' . bufnr(g:file2)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if filereadable(g:file1)
|
if filereadable(g:file1)
|
||||||
@@ -116,7 +116,7 @@ Execute(It should modify and save multiple files):
|
|||||||
\ 'newText': "import {A, B} from 'module'\n\n",
|
\ 'newText': "import {A, B} from 'module'\n\n",
|
||||||
\ }]
|
\ }]
|
||||||
\ }],
|
\ }],
|
||||||
\})
|
\}, v:true)
|
||||||
|
|
||||||
AssertEqual [
|
AssertEqual [
|
||||||
\ 'class Value {',
|
\ 'class Value {',
|
||||||
@@ -161,7 +161,7 @@ Execute(Beginning of file can be modified):
|
|||||||
\ 'newText': "type A: string\ntype B: number\n",
|
\ 'newText': "type A: string\ntype B: number\n",
|
||||||
\ }],
|
\ }],
|
||||||
\ }]
|
\ }]
|
||||||
\})
|
\}, v:true)
|
||||||
|
|
||||||
AssertEqual [
|
AssertEqual [
|
||||||
\ 'type A: string',
|
\ 'type A: string',
|
||||||
@@ -192,7 +192,7 @@ Execute(End of file can be modified):
|
|||||||
\ 'newText': "type A: string\ntype B: number\n",
|
\ 'newText': "type A: string\ntype B: number\n",
|
||||||
\ }],
|
\ }],
|
||||||
\ }]
|
\ }]
|
||||||
\})
|
\}, v:true)
|
||||||
|
|
||||||
AssertEqual g:test.text + [
|
AssertEqual g:test.text + [
|
||||||
\ 'type A: string',
|
\ 'type A: string',
|
||||||
@@ -227,7 +227,7 @@ Execute(Current buffer contents will be reloaded):
|
|||||||
\ 'newText': "type A: string\ntype B: number\n",
|
\ 'newText': "type A: string\ntype B: number\n",
|
||||||
\ }],
|
\ }],
|
||||||
\ }]
|
\ }]
|
||||||
\})
|
\}, v:true)
|
||||||
|
|
||||||
AssertEqual [
|
AssertEqual [
|
||||||
\ 'type A: string',
|
\ 'type A: string',
|
||||||
@@ -249,11 +249,11 @@ Execute(Cursor will not move when it is before text change):
|
|||||||
let g:test.changes = g:test.create_change(2, 3, 2, 8, 'value2')
|
let g:test.changes = g:test.create_change(2, 3, 2, 8, 'value2')
|
||||||
|
|
||||||
call setpos('.', [0, 1, 1, 0])
|
call setpos('.', [0, 1, 1, 0])
|
||||||
call ale#code_action#HandleCodeAction(g:test.changes)
|
call ale#code_action#HandleCodeAction(g:test.changes, v:true)
|
||||||
AssertEqual [1, 1], getpos('.')[1:2]
|
AssertEqual [1, 1], getpos('.')[1:2]
|
||||||
|
|
||||||
call setpos('.', [0, 2, 2, 0])
|
call setpos('.', [0, 2, 2, 0])
|
||||||
call ale#code_action#HandleCodeAction(g:test.changes)
|
call ale#code_action#HandleCodeAction(g:test.changes, v:true)
|
||||||
AssertEqual [2, 2], getpos('.')[1:2]
|
AssertEqual [2, 2], getpos('.')[1:2]
|
||||||
|
|
||||||
# ====C====
|
# ====C====
|
||||||
@@ -264,7 +264,7 @@ Execute(Cursor column will move to the change end when cursor between start/end)
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 2, r, 0])
|
call setpos('.', [0, 2, r, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.changes)
|
call ale#code_action#HandleCodeAction(g:test.changes, v:true)
|
||||||
AssertEqual ' value2: string', getline('.')
|
AssertEqual ' value2: string', getline('.')
|
||||||
AssertEqual [2, 9], getpos('.')[1:2]
|
AssertEqual [2, 9], getpos('.')[1:2]
|
||||||
endfor
|
endfor
|
||||||
@@ -275,7 +275,8 @@ Execute(Cursor column will move back when new text is shorter):
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 2, 8, 0])
|
call setpos('.', [0, 2, 8, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(2, 3, 2, 8, 'val'))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(2, 3, 2, 8, 'val'), v:true)
|
||||||
AssertEqual ' val: string', getline('.')
|
AssertEqual ' val: string', getline('.')
|
||||||
AssertEqual [2, 6], getpos('.')[1:2]
|
AssertEqual [2, 6], getpos('.')[1:2]
|
||||||
|
|
||||||
@@ -286,7 +287,8 @@ Execute(Cursor column will move forward when new text is longer):
|
|||||||
|
|
||||||
call setpos('.', [0, 2, 8, 0])
|
call setpos('.', [0, 2, 8, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(2, 3, 2, 8, 'longValue'))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(2, 3, 2, 8, 'longValue'), v:true)
|
||||||
AssertEqual ' longValue: string', getline('.')
|
AssertEqual ' longValue: string', getline('.')
|
||||||
AssertEqual [2, 12], getpos('.')[1:2]
|
AssertEqual [2, 12], getpos('.')[1:2]
|
||||||
|
|
||||||
@@ -297,7 +299,8 @@ Execute(Cursor line will move when updates are happening on lines above):
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 3, 1, 0])
|
call setpos('.', [0, 3, 1, 0])
|
||||||
AssertEqual '}', getline('.')
|
AssertEqual '}', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(1, 1, 2, 1, "test\ntest\n"))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(1, 1, 2, 1, "test\ntest\n"), v:true)
|
||||||
AssertEqual '}', getline('.')
|
AssertEqual '}', getline('.')
|
||||||
AssertEqual [4, 1], getpos('.')[1:2]
|
AssertEqual [4, 1], getpos('.')[1:2]
|
||||||
|
|
||||||
@@ -308,7 +311,8 @@ Execute(Cursor line and column will move when change on lines above and just bef
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 2, 2, 0])
|
call setpos('.', [0, 2, 2, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(1, 1, 2, 1, "test\ntest\n123"))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(1, 1, 2, 1, "test\ntest\n123"), v:true)
|
||||||
AssertEqual '123 value: string', getline('.')
|
AssertEqual '123 value: string', getline('.')
|
||||||
AssertEqual [3, 5], getpos('.')[1:2]
|
AssertEqual [3, 5], getpos('.')[1:2]
|
||||||
|
|
||||||
@@ -319,7 +323,8 @@ Execute(Cursor line and column will move at the end of changes):
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 2, 10, 0])
|
call setpos('.', [0, 2, 10, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(1, 1, 3, 1, "test\n"))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(1, 1, 3, 1, "test\n"), v:true)
|
||||||
AssertEqual '}', getline('.')
|
AssertEqual '}', getline('.')
|
||||||
AssertEqual [2, 1], getpos('.')[1:2]
|
AssertEqual [2, 1], getpos('.')[1:2]
|
||||||
|
|
||||||
@@ -329,6 +334,19 @@ Execute(Cursor will not move when changes happening on lines >= cursor, but afte
|
|||||||
call WriteFileAndEdit()
|
call WriteFileAndEdit()
|
||||||
call setpos('.', [0, 2, 3, 0])
|
call setpos('.', [0, 2, 3, 0])
|
||||||
AssertEqual ' value: string', getline('.')
|
AssertEqual ' value: string', getline('.')
|
||||||
call ale#code_action#HandleCodeAction(g:test.create_change(2, 10, 3, 1, "number\n"))
|
call ale#code_action#HandleCodeAction(
|
||||||
|
\ g:test.create_change(2, 10, 3, 1, "number\n"), v:true)
|
||||||
AssertEqual ' value: number', getline('.')
|
AssertEqual ' value: number', getline('.')
|
||||||
AssertEqual [2, 3], getpos('.')[1:2]
|
AssertEqual [2, 3], getpos('.')[1:2]
|
||||||
|
|
||||||
|
Execute(It should just modify file when should_save is set to v:false):
|
||||||
|
call WriteFileAndEdit()
|
||||||
|
let g:test.change = g:test.create_change(1, 1, 1, 1, "import { writeFile } from 'fs';\n")
|
||||||
|
call ale#code_action#HandleCodeAction(g:test.change, v:false)
|
||||||
|
AssertEqual 1, getbufvar(bufnr(''), '&modified')
|
||||||
|
AssertEqual [
|
||||||
|
\ 'import { writeFile } from ''fs'';',
|
||||||
|
\ 'class Name {',
|
||||||
|
\ ' value: string',
|
||||||
|
\ '}',
|
||||||
|
\], getline(1, '$')
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ Before:
|
|||||||
call add(g:expr_list, a:expr)
|
call add(g:expr_list, a:expr)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#code_action#HandleCodeAction(code_action) abort
|
function! ale#code_action#HandleCodeAction(code_action, should_save) abort
|
||||||
let g:handle_code_action_called = 1
|
let g:handle_code_action_called = 1
|
||||||
|
AssertEqual v:false, a:should_save
|
||||||
call add(g:code_actions, a:code_action)
|
call add(g:code_actions, a:code_action)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|||||||
@@ -57,8 +57,9 @@ Before:
|
|||||||
call add(g:expr_list, a:expr)
|
call add(g:expr_list, a:expr)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
function! ale#code_action#HandleCodeAction(code_action) abort
|
function! ale#code_action#HandleCodeAction(code_action, should_save) abort
|
||||||
let g:handle_code_action_called = 1
|
let g:handle_code_action_called = 1
|
||||||
|
AssertEqual v:true, a:should_save
|
||||||
call add(g:code_actions, a:code_action)
|
call add(g:code_actions, a:code_action)
|
||||||
endfunction
|
endfunction
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user