diff --git a/ale_linters/perl6/perl6.vim b/ale_linters/perl6/perl6.vim index 326850a2..b33a0c51 100644 --- a/ale_linters/perl6/perl6.vim +++ b/ale_linters/perl6/perl6.vim @@ -21,9 +21,9 @@ function! ale_linters#perl6#perl6#GetCommand(buffer) abort \ . ' %t' endfunction -function! ale_linters#perl6#perl6#ExtractError(dict, item, type) abort +function! ale_linters#perl6#perl6#ExtractError(dict, item, type, buffer) abort let l:file = '' - let l:line = '' + let l:line = 1 let l:column = '' let l:text = '' let l:pre = '' @@ -32,26 +32,26 @@ function! ale_linters#perl6#perl6#ExtractError(dict, item, type) abort let l:linepatternmessage = 'at\s\+line\s\+\(\d\+\)' if has_key(a:dict[a:item], 'filename') && !empty(a:dict[a:item]['filename']) - let l:file .= a:dict[a:item]['filename'] + let l:file = a:dict[a:item]['filename'] endif if has_key(a:dict[a:item], 'line') && !empty(a:dict[a:item]['line']) - let l:line .= a:dict[a:item]['line'] + let l:line = a:dict[a:item]['line'] let l:counter -= 1 endif if has_key(a:dict[a:item], 'column') && !empty(a:dict[a:item]['column']) - let l:column .= a:dict[a:item]['column'] + let l:column = a:dict[a:item]['column'] endif if has_key(a:dict[a:item], 'message') && !empty(a:dict[a:item]['message']) - let l:text .= substitute(a:dict[a:item]['message'], '\s*\n\s*', ' ', 'g') + let l:text = substitute(a:dict[a:item]['message'], '\s*\n\s*', ' ', 'g') let l:counter -= 1 endif if has_key(a:dict[a:item], 'line-real') && !empty(a:dict[a:item]['line-real']) let l:end_line = l:line - let l:line .= a:dict[a:item]['line-real'] + let l:line = a:dict[a:item]['line-real'] endif for l:match in ale#util#GetMatches(l:text, l:linepatternmessage) @@ -59,9 +59,11 @@ function! ale_linters#perl6#perl6#ExtractError(dict, item, type) abort let l:counter -= 1 endfor - if l:counter < 1 +" Currently, filenames and line numbers are not always given in the error output + if l:counter < 2 + \&& ( ale#path#IsBufferPath(a:buffer, l:file) || l:file is# '' ) return { - \ 'lnum': l:line, + \ 'lnum': '' . l:line, \ 'text': l:text, \ 'type': a:type, \ 'col': l:column, @@ -69,6 +71,8 @@ function! ale_linters#perl6#perl6#ExtractError(dict, item, type) abort \ 'code': a:item, \} endif + + return '' endfunction function! ale_linters#perl6#perl6#Handle(buffer, lines) abort @@ -102,13 +106,17 @@ function! ale_linters#perl6#perl6#Handle(buffer, lines) abort if !empty(l:json[l:key]['sorrows']) for l:dictionary in get(l:json[l:key], 'sorrows') for l:item in keys(l:dictionary) - call add(l:output, + let l:result = \ ale_linters#perl6#perl6#ExtractError( \ l:dictionary, \ l:item, - \ 'E' + \ 'E', + \ a:buffer, \ ) - \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif endfor endfor endif @@ -116,20 +124,31 @@ function! ale_linters#perl6#perl6#Handle(buffer, lines) abort if !empty(l:json[l:key]['worries']) for l:dictionary in get(l:json[l:key], 'worries') for l:item in keys(l:dictionary) - call add(l:output, + let l:result = \ ale_linters#perl6#perl6#ExtractError( \ l:dictionary, \ l:item, - \ 'W' + \ 'W', + \ a:buffer, \ ) - \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif endfor endfor endif else - call add(l:output, - \ ale_linters#perl6#perl6#ExtractError(l:json, l:key, 'E') - \ ) + let l:result = ale_linters#perl6#perl6#ExtractError( + \ l:json, + \ l:key, + \ 'E', + \ a:buffer, + \ ) + + if l:result isnot# '' + call add(l:output, l:result) + endif endif endfor endif diff --git a/test/handler/test_perl6_handler.vader b/test/handler/test_perl6_handler.vader index fbc5b12b..452a9174 100644 --- a/test/handler/test_perl6_handler.vader +++ b/test/handler/test_perl6_handler.vader @@ -200,3 +200,78 @@ Execute(The Perl6 linter should gracefully handle non-JSON messages): \ ' ------> /win 3/', \ 'Syntax OK' \ ]) + +Execute(The Perl6 linter should gracefully handle messages without a line number): + call ale#test#SetFilename('bar.pl6') + + AssertEqual + \ [ + \ { + \ 'lnum': '1', + \ 'end_lnum': '', + \ 'text': 'Cannot find method ''has_compile_time_value'' on object of type NQPMu', + \ 'type': 'E', + \ 'col' : '', + \ 'code': 'X::AdHoc', + \ } + \ ], + \ ale_linters#perl6#perl6#Handle(bufnr(''), [ + \ '{', + \ '"X::AdHoc" : {', + \ '"message" : "Cannot find method ''has_compile_time_value'' on object of type NQPMu",', + \ '"payload" : "Cannot find method ''has_compile_time_value'' on object of type NQPMu"', + \ '}', + \ '}', + \ ]) + +Execute(The Perl6 linter should not include errors from a known separate file): + call ale#test#SetFilename('bar.pl6') + + AssertEqual + \ [], + \ ale_linters#perl6#perl6#Handle(bufnr(''), [ + \ '{ + \ "X::Undeclared" : { + \ "highexpect" : [ ], + \ "is-compile-time" : 1, + \ "modules" : [ ], + \ "column" : null, + \ "pos" : 18, + \ "symbol" : "$tes", + \ "filename" : "foo.pl6", + \ "what" : "Variable", + \ "pre" : "my $test = 0; say ", + \ "post" : "$tes", + \ "suggestions" : [ + \ "$res", + \ "$test" + \ ], + \ "line" : 6, + \ "message" : "Variable ''$tes'' is not declared. Did you mean any of these?\n $res\n $test\n" + \ } + \ }' + \ ]) + +Execute(The Perl6 linter should not ignore errors without a filename): + call ale#test#SetFilename('bar.pl6') + + AssertEqual + \ [ + \ { + \ 'lnum': '3', + \ 'end_lnum': '', + \ 'text': 'Cannot find method ''has_compile_time_value'' on object of type NQPMu', + \ 'type': 'E', + \ 'col' : '', + \ 'code': 'X::AdHoc', + \ } + \ ], + \ ale_linters#perl6#perl6#Handle(bufnr(''), [ + \ '{', + \ '"X::AdHoc" : {', + \ '"line" : 3,', + \ '"message" : "Cannot find method ''has_compile_time_value'' on object of type NQPMu",', + \ '"payload" : "Cannot find method ''has_compile_time_value'' on object of type NQPMu"', + \ '}', + \ '}', + \ ])