summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ale_linters/perl6/perl6.vim55
-rw-r--r--test/handler/test_perl6_handler.vader75
2 files changed, 112 insertions, 18 deletions
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<HERE> 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"',
+ \ '}',
+ \ '}',
+ \ ])