summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDalius Dobravolskas <daliusd@wix.com>2021-09-16 16:05:38 +0300
committerGitHub <noreply@github.com>2021-09-16 22:05:38 +0900
commitdca56dd77267d6cedc3785f1359dd96d1f4b3fa9 (patch)
treee41aa1cb6777ab6eb15b16982f0ddb74a27cd01c
parent31349f208bf186bab90e51fddc09493fe28a19d8 (diff)
downloadale-dca56dd77267d6cedc3785f1359dd96d1f4b3fa9.zip
ALECodeAction fix: check linter name when searching for nearest error. (#3901)
It is easier to explain this fix with an example: * tsserver and LSPs ask for error information when you want to fix error. tsserver `ts@getCodeFixes` command needs tsserver error code. * now let's imagine that user has eslint and tsserver in use. Sometimes both can report same error in different way. * Now there is no guarantee which error will come first and if eslint error comes first then tsserver will not return code fixes as we are passing wrong error code to it. This fix will return proper error code based on linter.
-rw-r--r--autoload/ale/codefix.vim10
-rw-r--r--test/test_codefix.vader4
2 files changed, 8 insertions, 6 deletions
diff --git a/autoload/ale/codefix.vim b/autoload/ale/codefix.vim
index 4a78063b..09ee34cb 100644
--- a/autoload/ale/codefix.vim
+++ b/autoload/ale/codefix.vim
@@ -299,7 +299,7 @@ function! ale#codefix#HandleLSPResponse(conn_id, response) abort
endif
endfunction
-function! s:FindError(buffer, line, column, end_line, end_column) abort
+function! s:FindError(buffer, line, column, end_line, end_column, linter_name) abort
let l:nearest_error = v:null
if a:line == a:end_line
@@ -308,7 +308,9 @@ function! s:FindError(buffer, line, column, end_line, end_column) abort
let l:nearest_error_diff = -1
for l:error in get(g:ale_buffer_info[a:buffer], 'loclist', [])
- if has_key(l:error, 'code') && l:error.lnum == a:line
+ if has_key(l:error, 'code')
+ \ && (a:linter_name is v:null || l:error.linter_name is# a:linter_name)
+ \ && l:error.lnum == a:line
let l:diff = abs(l:error.col - a:column)
if l:nearest_error_diff == -1 || l:diff < l:nearest_error_diff
@@ -341,7 +343,7 @@ function! s:OnReady(
if a:linter.lsp is# 'tsserver'
let l:nearest_error =
- \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column)
+ \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column, a:linter.lsp)
if l:nearest_error isnot v:null
let l:message = ale#lsp#tsserver_message#GetCodeFixes(
@@ -368,7 +370,7 @@ function! s:OnReady(
let l:diagnostics = []
let l:nearest_error =
- \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column)
+ \ s:FindError(l:buffer, a:line, a:column, a:end_line, a:end_column, v:null)
if l:nearest_error isnot v:null
let l:diagnostics = [
diff --git a/test/test_codefix.vader b/test/test_codefix.vader
index fc5470aa..a9fff89d 100644
--- a/test/test_codefix.vader
+++ b/test/test_codefix.vader
@@ -280,7 +280,7 @@ Execute(tsserver codefix requests should be sent):
call ale#linter#Reset()
runtime ale_linters/typescript/tsserver.vim
- let g:ale_buffer_info = {bufnr(''): {'loclist': [{'lnum': 2, 'col': 5, 'code': 2304}]}}
+ let g:ale_buffer_info = {bufnr(''): {'loclist': [{'lnum': 2, 'col': 5, 'code': 2304, 'linter_name': 'tsserver'}]}}
call setpos('.', [bufnr(''), 2, 16, 0])
" ALECodeAction
@@ -314,7 +314,7 @@ Execute(tsserver codefix requests should be sent only for error with code):
call ale#linter#Reset()
runtime ale_linters/typescript/tsserver.vim
- let g:ale_buffer_info = {bufnr(''): {'loclist': [{'lnum': 2, 'col': 16}, {'lnum': 2, 'col': 16, 'code': 2304}]}}
+ let g:ale_buffer_info = {bufnr(''): {'loclist': [{'lnum': 2, 'col': 16, 'linter_name': 'tsserver'}, {'lnum': 2, 'col': 16, 'code': 2304, 'linter_name': 'tsserver'}]}}
call setpos('.', [bufnr(''), 2, 16, 0])
" ALECodeAction