From 2b2e766dc6df4d05e58c106f51b5444be4efbcea Mon Sep 17 00:00:00 2001 From: Travis Gibson Date: Fri, 28 Sep 2018 16:18:40 -0700 Subject: Add Perl6 support via 'perl6 -c' --- ale_linters/perl6/perl6.vim | 147 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 ale_linters/perl6/perl6.vim (limited to 'ale_linters') diff --git a/ale_linters/perl6/perl6.vim b/ale_linters/perl6/perl6.vim new file mode 100644 index 00000000..326850a2 --- /dev/null +++ b/ale_linters/perl6/perl6.vim @@ -0,0 +1,147 @@ +" Author:Travis Gibson +" Description: This file adds support for checking perl6 syntax + +let g:ale_perl6_perl6_executable = +\ get(g:, 'ale_perl6_perl6_executable', 'perl6') + +let g:ale_perl6_perl6_options = +\ get(g:, 'ale_perl6_perl6_options', '-c -Ilib') + +let $PERL6_EXCEPTIONS_HANDLER = 'JSON' + +let $RAKUDO_ERROR_COLOR = 0 + +function! ale_linters#perl6#perl6#GetExecutable(buffer) abort + return ale#Var(a:buffer, 'perl6_perl6_executable') +endfunction + +function! ale_linters#perl6#perl6#GetCommand(buffer) abort + return ale_linters#perl6#perl6#GetExecutable(a:buffer) + \ . ' ' . ale#Var(a:buffer, 'perl6_perl6_options') + \ . ' %t' +endfunction + +function! ale_linters#perl6#perl6#ExtractError(dict, item, type) abort + let l:file = '' + let l:line = '' + let l:column = '' + let l:text = '' + let l:pre = '' + let l:counter = 2 + let l:end_line = '' + 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'] + 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: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'] + 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: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'] + endif + + for l:match in ale#util#GetMatches(l:text, l:linepatternmessage) + let l:line = l:match[1] + let l:counter -= 1 + endfor + + if l:counter < 1 + return { + \ 'lnum': l:line, + \ 'text': l:text, + \ 'type': a:type, + \ 'col': l:column, + \ 'end_lnum': l:end_line, + \ 'code': a:item, + \} + endif +endfunction + +function! ale_linters#perl6#perl6#Handle(buffer, lines) abort + let l:output = [] + + if empty(a:lines) + return l:output + endif + + if a:lines[0] is# 'Syntax OK' + return l:output + endif + + try + let l:json = json_decode(join(a:lines, '')) + catch /E474/ + call add(l:output, { + \ 'lnum': '1', + \ 'text': 'Received output in the default Perl6 error format. See :ALEDetail for details', + \ 'detail': join(a:lines, "\n"), + \ 'type': 'W', + \ }) + + return l:output + endtry + + if type(l:json) is v:t_dict + for l:key in keys(l:json) + if has_key(l:json[l:key], 'sorrows') && + \ has_key(l:json[l:key], 'worries') + 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, + \ ale_linters#perl6#perl6#ExtractError( + \ l:dictionary, + \ l:item, + \ 'E' + \ ) + \ ) + endfor + endfor + endif + + 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, + \ ale_linters#perl6#perl6#ExtractError( + \ l:dictionary, + \ l:item, + \ 'W' + \ ) + \ ) + endfor + endfor + endif + else + call add(l:output, + \ ale_linters#perl6#perl6#ExtractError(l:json, l:key, 'E') + \ ) + endif + endfor + endif + + return l:output +endfunction + +call ale#linter#Define('perl6', { +\ 'name': 'perl6', +\ 'executable_callback': 'ale_linters#perl6#perl6#GetExecutable', +\ 'output_stream': 'both', +\ 'command_callback': 'ale_linters#perl6#perl6#GetCommand', +\ 'callback': 'ale_linters#perl6#perl6#Handle', +\}) + -- cgit v1.2.3 From adad9a21ab3fa16b115c044de3c46d98b577f72b Mon Sep 17 00:00:00 2001 From: Travis Gibson Date: Wed, 3 Oct 2018 14:13:34 -0700 Subject: Fix crashes with incomplete errors --- ale_linters/perl6/perl6.vim | 55 ++++++++++++++++++++++++++++++--------------- 1 file changed, 37 insertions(+), 18 deletions(-) (limited to 'ale_linters') 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 -- cgit v1.2.3