Skip to content

Commit

Permalink
Add ability to rename variables in TypeScript files
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremija committed Aug 14, 2019
1 parent 4487725 commit 2e6e77a
Showing 1 changed file with 54 additions and 28 deletions.
82 changes: 54 additions & 28 deletions autoload/ale/rename.vim
Original file line number Diff line number Diff line change
Expand Up @@ -14,36 +14,67 @@ function! ale#rename#ClearLSPData() abort
let s:rename_map = {}
endfunction

function! s:ApplyRenameEdits(item_list) abort
" TODO: implement...
function! s:ApplyRenameEdits(new_name, item_list) abort
let l:new_length = len(a:new_name)
for l:file in a:item_list
execute 'edit' l:file.filename
let l:buf = bufnr('')
if getbufvar(l:buf, '&mod')
call ale#util#Execute('echom ''Aborting rename, file is modified''')
break
endif

for l:loc in reverse(l:file.locs)
" set last visual mode to characterwise-visual
execute 'normal! v'
call setpos("'<", [l:buf, l:loc.start.line, l:loc.start.column, 0])
call setpos("'>", [l:buf, l:loc.end.line, l:loc.end.column - 1, 0])
execute 'normal! gvc' . a:new_name
" TODO maybe save?
endfor
endfor
endfunction

function! ale#rename#HandleTSServerResponse(conn_id, response) abort
call ale#util#Execute('echom '')
function! ale#rename#HandleTSServerResponse(new_name, conn_id, response) abort
" call ale#util#Execute('echom '')
if get(a:response, 'command', '') is# 'rename'
\&& has_key(s:rename_map, a:response.request_seq)
call remove(s:rename_map, a:response.request_seq)
if get(a:response, 'success', v:false) is v:true
let l:item_list = []

for l:response_item in a:response.body.refs
echom string(a:response.body)
for l:response_item in a:response.body.locs
let l:filename = l:response_item.file
let l:locs = []
for l:loc in l:response_item.locs
call add(l:locs, {
\ 'start': {
\ 'line': l:loc.start.line,
\ 'column': l:loc.start.offset,
\ },
\ 'end': {
\ 'line': l:loc.end.line,
\ 'column': l:loc.end.offset,
\ },
\})
endfor
call add(l:item_list, {
\ 'filename': l:response_item.file,
\ 'line': l:response_item.start.line,
\ 'column': l:response_item.start.offset,
\ 'filename': l:filename,
\ 'locs': l:locs,
\})
endfor

if empty(l:item_list)
call ale#util#Execute('echom ''Could not rename.''')
else
call s:ApplyRenameEdits(l:item_list)
call s:ApplyRenameEdits(a:new_name, l:item_list)
endif
endif
endif
endfunction

function! ale#rename#HandleLSPResponse(conn_id, response) abort
function! ale#rename#HandleLSPResponse(new_name, conn_id, response) abort
if has_key(a:response, 'id')
\&& has_key(s:rename_map, a:response.id)
call remove(s:rename_map, a:response.id)
Expand All @@ -62,27 +93,31 @@ function! ale#rename#HandleLSPResponse(conn_id, response) abort
if empty(l:item_list)
call ale#util#Execute('echom ''Could not rename.''')
else
call s:ApplyRenameEdits(l:item_list)
call s:ApplyRenameEdits(a:new_name, l:item_list)
endif
endif
endfunction

function! s:OnReady(linter, lsp_details, line, column, new_name, ...) abort
let l:buffer = a:lsp_details.buffer
function! s:OnReady(line, column, new_name, linter, lsp_details) abort
let l:id = a:lsp_details.connection_id

if !ale#lsp#HasCapability(l:id, 'rename')
return
endif

let l:buffer = a:lsp_details.buffer

let l:Callback = a:linter.lsp is# 'tsserver'
\ ? function('ale#rename#HandleTSServerResponse')
\ : function('ale#rename#HandleLSPResponse')
\ ? function('ale#rename#HandleTSServerResponse', [a:new_name])
\ : function('ale#rename#HandleLSPResponse', [a:new_name])

call ale#lsp#RegisterCallback(l:id, l:Callback)

if a:linter.lsp is# 'tsserver'
let l:message = ale#lsp#tsserver_message#Rename(
\ l:buffer,
\ a:line,
\ a:column,
\ a:new_name
\ a:column
\)
else
" Send a message saying the buffer has changed first, or the
Expand Down Expand Up @@ -110,17 +145,8 @@ function! s:ExecuteRename(linter, new_name) abort
let l:column = min([l:column, len(getline(l:line))])
endif

let l:lsp_details = ale#lsp_linter#StartLSP(l:buffer, a:linter)

if empty(l:lsp_details)
return 0
endif

let l:id = l:lsp_details.connection_id

call ale#lsp#WaitForCapability(l:id, 'rename', function('s:OnReady', [
\ a:linter, l:lsp_details, l:line, l:column, a:new_name
\]))
let l:Callback = function('s:OnReady', [l:line, l:column, a:new_name])
call ale#lsp_linter#StartLSP(l:buffer, a:linter, l:Callback)
endfunction

function! ale#rename#Execute(...) abort
Expand Down

0 comments on commit 2e6e77a

Please sign in to comment.