#562 Join split JSON lines together for new Rust output

This commit is contained in:
w0rp 2017-05-17 09:43:22 +01:00
parent 372a4dfd7e
commit 5790df1272
2 changed files with 44 additions and 6 deletions

View File

@ -20,17 +20,37 @@ function! s:FindErrorInExpansion(span, file_name) abort
return [] return []
endfunction endfunction
" The JSON output for Rust can be split over many lines.
" Those lines should be joined together again.
function! s:JoinJSONLines(lines) abort
let l:corrected_lines = []
let l:object_continues = 0
for l:line in a:lines
if l:object_continues
let l:corrected_lines[-1] .= l:line
if l:line =~# '}$'
let l:object_continues = 0
endif
elseif l:line =~# '^{'
call add(l:corrected_lines, l:line)
if l:line !~# '}$'
let l:object_continues = 1
endif
endif
endfor
return l:corrected_lines
endfunction
" A handler function which accepts a file name, to make unit testing easier. " A handler function which accepts a file name, to make unit testing easier.
function! ale#handlers#rust#HandleRustErrorsForFile(buffer, full_filename, lines) abort function! ale#handlers#rust#HandleRustErrorsForFile(buffer, full_filename, lines) abort
let l:filename = fnamemodify(a:full_filename, ':t') let l:filename = fnamemodify(a:full_filename, ':t')
let l:output = [] let l:output = []
for l:errorline in a:lines for l:errorline in s:JoinJSONLines(a:lines)
" ignore everything that is not Json
if l:errorline !~# '^{'
continue
endif
let l:error = json_decode(l:errorline) let l:error = json_decode(l:errorline)
if has_key(l:error, 'message') && type(l:error.message) == type({}) if has_key(l:error, 'message') && type(l:error.message) == type({})

View File

@ -46,3 +46,21 @@ Execute(The Rust handler should handle cargo output):
\ '{"message":{"children":[],"code":null,"level":"error","message":"no method named `wat` found for type `std::string::String` in the current scope","rendered":null,"spans":[{"byte_end":11497,"byte_start":11494,"column_end":10,"column_start":7,"expansion":null,"file_name":"src/playpen.rs","is_primary":true,"label":null,"line_end":13,"line_start":13,"suggested_replacement":null,"text":[{"highlight_end":10,"highlight_start":7,"text":" s.wat()"}]}]},"package_id":"update 0.0.1 (path+file:///home/w0rp/Downloads/rust-by-example)","reason":"compiler-message","target":{"kind":["bin"],"name":"update","src_path":"/home/w0rp/Downloads/rust-by-example/src/main.rs"}}', \ '{"message":{"children":[],"code":null,"level":"error","message":"no method named `wat` found for type `std::string::String` in the current scope","rendered":null,"spans":[{"byte_end":11497,"byte_start":11494,"column_end":10,"column_start":7,"expansion":null,"file_name":"src/playpen.rs","is_primary":true,"label":null,"line_end":13,"line_start":13,"suggested_replacement":null,"text":[{"highlight_end":10,"highlight_start":7,"text":" s.wat()"}]}]},"package_id":"update 0.0.1 (path+file:///home/w0rp/Downloads/rust-by-example)","reason":"compiler-message","target":{"kind":["bin"],"name":"update","src_path":"/home/w0rp/Downloads/rust-by-example/src/main.rs"}}',
\ '{"message":{"children":[],"code":null,"level":"error","message":"aborting due to previous error","rendered":null,"spans":[]},"package_id":"update 0.0.1 (path+file:///home/w0rp/Downloads/rust-by-example)","reason":"compiler-message","target":{"kind":["bin"],"name":"update","src_path":"/home/w0rp/Downloads/rust-by-example/src/main.rs"}}', \ '{"message":{"children":[],"code":null,"level":"error","message":"aborting due to previous error","rendered":null,"spans":[]},"package_id":"update 0.0.1 (path+file:///home/w0rp/Downloads/rust-by-example)","reason":"compiler-message","target":{"kind":["bin"],"name":"update","src_path":"/home/w0rp/Downloads/rust-by-example/src/main.rs"}}',
\ ]) \ ])
Execute(The Rust handler should handle JSON split over many lines):
AssertEqual
\ [
\ {
\ 'lnum': 15,
\ 'type': 'E',
\ 'col': 11505,
\ 'text': 'expected one of `.`, `;`, `?`, `}`, or an operator, found `for`',
\ },
\ ],
\ ale#handlers#rust#HandleRustErrorsForFile(347, 'src/playpen.rs', [
\ '',
\ 'ignore this',
\ '{"message":{"children":[],"code":null,"level":"error","message":"expected one of `.`, `;`, `?`, `}`, or an operator, found `for`","rendered":null,"spans":[{"byte_end":11508,"byte_start":11505,"column_end":8,"column_start":5,"expansion":null',
\ ',"file_name":"src/playpen.rs","is_primary":true,"label":null,"line_end":15,"line_start":15,"suggested_replacement":null,',
\ '"text":[{"highlight_end":8,"highlight_start":5,"text":" for chr in source.trim().chars() {"}]}]},"package_id":"update 0.0.1 (path+file:///home/w0rp/Downloads/rust-by-example)","reason":"compiler-message","target":{"kind":["bin"],"name":"update","src_path":"/home/w0rp/Downloads/rust-by-example/src/main.rs"}}',
\ ])