#392 Report errors inside of headers, in a very basic way
This commit is contained in:
		
							parent
							
								
									8b890caa31
								
							
						
					
					
						commit
						b06b832447
					
				@ -22,5 +22,5 @@ call ale#linter#Define('c', {
 | 
				
			|||||||
\   'output_stream': 'stderr',
 | 
					\   'output_stream': 'stderr',
 | 
				
			||||||
\   'executable': 'clang',
 | 
					\   'executable': 'clang',
 | 
				
			||||||
\   'command_callback': 'ale_linters#c#clang#GetCommand',
 | 
					\   'command_callback': 'ale_linters#c#clang#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -22,5 +22,5 @@ call ale#linter#Define('c', {
 | 
				
			|||||||
\   'output_stream': 'stderr',
 | 
					\   'output_stream': 'stderr',
 | 
				
			||||||
\   'executable': 'gcc',
 | 
					\   'executable': 'gcc',
 | 
				
			||||||
\   'command_callback': 'ale_linters#c#gcc#GetCommand',
 | 
					\   'command_callback': 'ale_linters#c#gcc#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -19,5 +19,5 @@ call ale#linter#Define('coffee', {
 | 
				
			|||||||
\   'executable_callback': 'ale_linters#coffee#coffee#GetExecutable',
 | 
					\   'executable_callback': 'ale_linters#coffee#coffee#GetExecutable',
 | 
				
			||||||
\   'command_callback': 'ale_linters#coffee#coffee#GetCommand',
 | 
					\   'command_callback': 'ale_linters#coffee#coffee#GetCommand',
 | 
				
			||||||
\   'output_stream': 'stderr',
 | 
					\   'output_stream': 'stderr',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -19,5 +19,5 @@ call ale#linter#Define('cpp', {
 | 
				
			|||||||
\   'output_stream': 'stderr',
 | 
					\   'output_stream': 'stderr',
 | 
				
			||||||
\   'executable': 'clang++',
 | 
					\   'executable': 'clang++',
 | 
				
			||||||
\   'command_callback': 'ale_linters#cpp#clang#GetCommand',
 | 
					\   'command_callback': 'ale_linters#cpp#clang#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -14,5 +14,5 @@ call ale#linter#Define('cpp', {
 | 
				
			|||||||
\   'output_stream': 'stdout',
 | 
					\   'output_stream': 'stdout',
 | 
				
			||||||
\   'executable': 'clang-tidy',
 | 
					\   'executable': 'clang-tidy',
 | 
				
			||||||
\   'command_callback': 'ale_linters#cpp#clangtidy#GetCommand',
 | 
					\   'command_callback': 'ale_linters#cpp#clangtidy#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -28,5 +28,5 @@ call ale#linter#Define('cpp', {
 | 
				
			|||||||
\   'output_stream': 'stderr',
 | 
					\   'output_stream': 'stderr',
 | 
				
			||||||
\   'executable': 'g++',
 | 
					\   'executable': 'g++',
 | 
				
			||||||
\   'command_callback': 'ale_linters#cpp#gcc#GetCommand',
 | 
					\   'command_callback': 'ale_linters#cpp#gcc#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -6,5 +6,5 @@ call ale#linter#Define('puppet', {
 | 
				
			|||||||
\   'command': 'puppet-lint --no-autoloader_layout-check'
 | 
					\   'command': 'puppet-lint --no-autoloader_layout-check'
 | 
				
			||||||
\   .   ' --log-format "-:%{line}:%{column}: %{kind}: [%{check}] %{message}"'
 | 
					\   .   ' --log-format "-:%{line}:%{column}: %{kind}: [%{check}] %{message}"'
 | 
				
			||||||
\   .   ' %t',
 | 
					\   .   ' %t',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -48,5 +48,5 @@ call ale#linter#Define('sh', {
 | 
				
			|||||||
\   'name': 'shellcheck',
 | 
					\   'name': 'shellcheck',
 | 
				
			||||||
\   'executable_callback': 'ale_linters#sh#shellcheck#GetExecutable',
 | 
					\   'executable_callback': 'ale_linters#sh#shellcheck#GetExecutable',
 | 
				
			||||||
\   'command_callback': 'ale_linters#sh#shellcheck#GetCommand',
 | 
					\   'command_callback': 'ale_linters#sh#shellcheck#GetCommand',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -5,5 +5,5 @@ call ale#linter#Define('swift', {
 | 
				
			|||||||
\   'name': 'swiftlint',
 | 
					\   'name': 'swiftlint',
 | 
				
			||||||
\   'executable': 'swiftlint',
 | 
					\   'executable': 'swiftlint',
 | 
				
			||||||
\   'command': 'swiftlint lint --use-stdin',
 | 
					\   'command': 'swiftlint lint --use-stdin',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -20,5 +20,5 @@ call ale#linter#Define('vim', {
 | 
				
			|||||||
\       . s:enable_neovim
 | 
					\       . s:enable_neovim
 | 
				
			||||||
\       . s:format
 | 
					\       . s:format
 | 
				
			||||||
\       . ' %t',
 | 
					\       . ' %t',
 | 
				
			||||||
\   'callback': 'ale#handlers#HandleGCCFormat',
 | 
					\   'callback': 'ale#handlers#gcc#HandleGCCFormat',
 | 
				
			||||||
\})
 | 
					\})
 | 
				
			||||||
 | 
				
			|||||||
@ -45,36 +45,6 @@ function! ale#handlers#HandleUnixFormatAsWarning(buffer, lines) abort
 | 
				
			|||||||
    return s:HandleUnixFormat(a:buffer, a:lines, 'W')
 | 
					    return s:HandleUnixFormat(a:buffer, a:lines, 'W')
 | 
				
			||||||
endfunction
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function! ale#handlers#HandleGCCFormat(buffer, lines) abort
 | 
					 | 
				
			||||||
    " Look for lines like the following.
 | 
					 | 
				
			||||||
    "
 | 
					 | 
				
			||||||
    " <stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]
 | 
					 | 
				
			||||||
    " <stdin>:10:27: error: invalid operands to binary - (have ‘int’ and ‘char *’)
 | 
					 | 
				
			||||||
    " -:189:7: note: $/${} is unnecessary on arithmetic variables. [SC2004]
 | 
					 | 
				
			||||||
    let l:pattern = '^.\+:\(\d\+\):\(\d\+\): \([^:]\+\): \(.\+\)$'
 | 
					 | 
				
			||||||
    let l:output = []
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    for l:line in a:lines
 | 
					 | 
				
			||||||
        let l:match = matchlist(l:line, l:pattern)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if len(l:match) == 0
 | 
					 | 
				
			||||||
            continue
 | 
					 | 
				
			||||||
        endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        call add(l:output, {
 | 
					 | 
				
			||||||
        \   'bufnr': a:buffer,
 | 
					 | 
				
			||||||
        \   'lnum': l:match[1] + 0,
 | 
					 | 
				
			||||||
        \   'vcol': 0,
 | 
					 | 
				
			||||||
        \   'col': l:match[2] + 0,
 | 
					 | 
				
			||||||
        \   'text': l:match[4],
 | 
					 | 
				
			||||||
        \   'type': l:match[3] =~# 'error' ? 'E' : 'W',
 | 
					 | 
				
			||||||
        \   'nr': -1,
 | 
					 | 
				
			||||||
        \})
 | 
					 | 
				
			||||||
    endfor
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return l:output
 | 
					 | 
				
			||||||
endfunction
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function! ale#handlers#HandleCppCheckFormat(buffer, lines) abort
 | 
					function! ale#handlers#HandleCppCheckFormat(buffer, lines) abort
 | 
				
			||||||
    " Look for lines like the following.
 | 
					    " Look for lines like the following.
 | 
				
			||||||
    "
 | 
					    "
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										78
									
								
								autoload/ale/handlers/gcc.vim
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								autoload/ale/handlers/gcc.vim
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,78 @@
 | 
				
			|||||||
 | 
					scriptencoding utf-8
 | 
				
			||||||
 | 
					" Author: w0rp <devw0rp@gmail.com>
 | 
				
			||||||
 | 
					" Description: This file defines a handler function which ought to work for
 | 
				
			||||||
 | 
					" any program which outputs errors in the format that GCC uses.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! s:AddIncludedErrors(output, include_lnum, include_lines) abort
 | 
				
			||||||
 | 
					    if a:include_lnum > 0
 | 
				
			||||||
 | 
					        call add(a:output, {
 | 
				
			||||||
 | 
					        \   'lnum': a:include_lnum,
 | 
				
			||||||
 | 
					        \   'type': 'E',
 | 
				
			||||||
 | 
					        \   'text': 'Problems were found in the header (See :ALEDetail)',
 | 
				
			||||||
 | 
					        \   'detail': join(a:include_lines, "\n"),
 | 
				
			||||||
 | 
					        \})
 | 
				
			||||||
 | 
					    endif
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function! ale#handlers#gcc#HandleGCCFormat(buffer, lines) abort
 | 
				
			||||||
 | 
					    let l:include_pattern = '\v^(In file included | *)from [^:]*:(\d+)'
 | 
				
			||||||
 | 
					    let l:include_lnum = 0
 | 
				
			||||||
 | 
					    let l:include_lines = []
 | 
				
			||||||
 | 
					    let l:included_filename = ''
 | 
				
			||||||
 | 
					    " Look for lines like the following.
 | 
				
			||||||
 | 
					    "
 | 
				
			||||||
 | 
					    " <stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]
 | 
				
			||||||
 | 
					    " <stdin>:10:27: error: invalid operands to binary - (have ‘int’ and ‘char *’)
 | 
				
			||||||
 | 
					    " -:189:7: note: $/${} is unnecessary on arithmetic variables. [SC2004]
 | 
				
			||||||
 | 
					    let l:pattern = '^\(.\+\):\(\d\+\):\(\d\+\): \([^:]\+\): \(.\+\)$'
 | 
				
			||||||
 | 
					    let l:output = []
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    for l:line in a:lines
 | 
				
			||||||
 | 
					        let l:match = matchlist(l:line, l:pattern)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        if empty(l:match)
 | 
				
			||||||
 | 
					            " Check for matches in includes.
 | 
				
			||||||
 | 
					            " We will keep matching lines until we hit the last file, which
 | 
				
			||||||
 | 
					            " is our file.
 | 
				
			||||||
 | 
					            let l:include_match = matchlist(l:line, l:include_pattern)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            if empty(l:include_match)
 | 
				
			||||||
 | 
					                " If this isn't another include header line, then we
 | 
				
			||||||
 | 
					                " need to collect it.
 | 
				
			||||||
 | 
					                call add(l:include_lines, l:line)
 | 
				
			||||||
 | 
					            else
 | 
				
			||||||
 | 
					                " Get the line number out of the parsed include line,
 | 
				
			||||||
 | 
					                " and reset the other variables.
 | 
				
			||||||
 | 
					                let l:include_lnum = str2nr(l:include_match[2])
 | 
				
			||||||
 | 
					                let l:include_lines = []
 | 
				
			||||||
 | 
					                let l:included_filename = ''
 | 
				
			||||||
 | 
					            endif
 | 
				
			||||||
 | 
					        elseif l:include_lnum > 0
 | 
				
			||||||
 | 
					        \&& (empty(l:included_filename) || l:included_filename ==# l:match[1])
 | 
				
			||||||
 | 
					            " If we hit the first error after an include header, or the
 | 
				
			||||||
 | 
					            " errors below have the same name as the first filename we see,
 | 
				
			||||||
 | 
					            " then include these lines, and remember what that filename was.
 | 
				
			||||||
 | 
					            let l:included_filename = l:match[1]
 | 
				
			||||||
 | 
					            call add(l:include_lines, l:line)
 | 
				
			||||||
 | 
					        else
 | 
				
			||||||
 | 
					            " If we hit a regular error again, then add the previously
 | 
				
			||||||
 | 
					            " collected lines as one error, and reset the include variables.
 | 
				
			||||||
 | 
					            call s:AddIncludedErrors(l:output, l:include_lnum, l:include_lines)
 | 
				
			||||||
 | 
					            let l:include_lnum = 0
 | 
				
			||||||
 | 
					            let l:include_lines = []
 | 
				
			||||||
 | 
					            let l:included_filename = ''
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            call add(l:output, {
 | 
				
			||||||
 | 
					            \   'lnum': l:match[2] + 0,
 | 
				
			||||||
 | 
					            \   'col': l:match[3] + 0,
 | 
				
			||||||
 | 
					            \   'type': l:match[4] =~# 'error' ? 'E' : 'W',
 | 
				
			||||||
 | 
					            \   'text': l:match[5],
 | 
				
			||||||
 | 
					            \})
 | 
				
			||||||
 | 
					        endif
 | 
				
			||||||
 | 
					    endfor
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    " Add remaining include errors after we go beyond the last line.
 | 
				
			||||||
 | 
					    call s:AddIncludedErrors(l:output, l:include_lnum, l:include_lines)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return l:output
 | 
				
			||||||
 | 
					endfunction
 | 
				
			||||||
							
								
								
									
										1
									
								
								test/c_tests/broken.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								test/c_tests/broken.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1 @@
 | 
				
			|||||||
 | 
					{{{
 | 
				
			||||||
@ -34,12 +34,9 @@ Given c (A test C file):
 | 
				
			|||||||
Execute(Basic errors should be returned for GCC for C files):
 | 
					Execute(Basic errors should be returned for GCC for C files):
 | 
				
			||||||
  call ale#Lint()
 | 
					  call ale#Lint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AssertEqual [{
 | 
					  AssertEqual
 | 
				
			||||||
  \   'lnum': 3,
 | 
					  \ [{'lnum': 3, 'col': 1}],
 | 
				
			||||||
  \   'col': 1,
 | 
					  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}')
 | 
				
			||||||
  \ }],
 | 
					 | 
				
			||||||
  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}'),
 | 
					 | 
				
			||||||
  \ 'No errors returned! Got: ' . GetCommandOutput()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Assert match(getloclist(0)[0].text, '\v^expected .*;.* before .*\}.* token$') >= 0,
 | 
					  Assert match(getloclist(0)[0].text, '\v^expected .*;.* before .*\}.* token$') >= 0,
 | 
				
			||||||
  \ 'Invalid error text: ' .  getloclist(0)[0].text
 | 
					  \ 'Invalid error text: ' .  getloclist(0)[0].text
 | 
				
			||||||
@ -52,12 +49,42 @@ Given cpp (A test C++ file):
 | 
				
			|||||||
Execute(Basic errors should be returned for GCC for C++ files):
 | 
					Execute(Basic errors should be returned for GCC for C++ files):
 | 
				
			||||||
  call ale#Lint()
 | 
					  call ale#Lint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  AssertEqual [{
 | 
					  AssertEqual
 | 
				
			||||||
  \   'lnum': 3,
 | 
					  \ [{'lnum': 3, 'col': 1}],
 | 
				
			||||||
  \   'col': 1,
 | 
					  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}')
 | 
				
			||||||
  \ }],
 | 
					 | 
				
			||||||
  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}'),
 | 
					 | 
				
			||||||
  \ 'No errors returned! Got: ' . GetCommandOutput()
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  Assert match(getloclist(0)[0].text, '\v^expected .*;.* before .*\}.* token$') >= 0,
 | 
					  Assert match(getloclist(0)[0].text, '\v^expected .*;.* before .*\}.* token$') >= 0,
 | 
				
			||||||
  \ 'Invalid error text: ' .  getloclist(0)[0].text
 | 
					
 | 
				
			||||||
 | 
					Given c (A test C file with a header containing broken code):
 | 
				
			||||||
 | 
					  // Some comment line
 | 
				
			||||||
 | 
					  #include "broken.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int main() {
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Execute(Basic errors should be returned for GCC for C files with headers):
 | 
				
			||||||
 | 
					  call ale#Lint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [{'lnum': 2, 'col': 0}],
 | 
				
			||||||
 | 
					  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual 'Problems were found in the header (See :ALEDetail)', getloclist(0)[0].text
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Given cpp (A test C++ file with a header containing broken code):
 | 
				
			||||||
 | 
					  // Some comment line
 | 
				
			||||||
 | 
					  #include "broken.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  int main() {
 | 
				
			||||||
 | 
					    return 0
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Execute(Basic errors should be returned for GCC for C++ files with headers):
 | 
				
			||||||
 | 
					  call ale#Lint()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [{'lnum': 2, 'col': 0}],
 | 
				
			||||||
 | 
					  \ map(getloclist(0), '{''lnum'': v:val.lnum, ''col'': v:val.col}')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual 'Problems were found in the header (See :ALEDetail)', getloclist(0)[0].text
 | 
				
			||||||
 | 
				
			|||||||
@ -55,7 +55,7 @@ Then (The loclist should be correct):
 | 
				
			|||||||
  \], g:loclist
 | 
					  \], g:loclist
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Execute (Run HandleGCCFormat):
 | 
					Execute (Run HandleGCCFormat):
 | 
				
			||||||
  let g:loclist = ale#handlers#HandleGCCFormat(42, [
 | 
					  let g:loclist = ale#handlers#gcc#HandleGCCFormat(42, [
 | 
				
			||||||
  \ '<stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]',
 | 
					  \ '<stdin>:8:5: warning: conversion lacks type at end of format [-Wformat=]',
 | 
				
			||||||
  \ '<stdin>:10:27: error: invalid operands to binary - (have ‘int’ and ‘char *’)',
 | 
					  \ '<stdin>:10:27: error: invalid operands to binary - (have ‘int’ and ‘char *’)',
 | 
				
			||||||
  \])
 | 
					  \])
 | 
				
			||||||
@ -63,18 +63,12 @@ Execute (Run HandleGCCFormat):
 | 
				
			|||||||
Then (The loclist should be correct):
 | 
					Then (The loclist should be correct):
 | 
				
			||||||
  AssertEqual [
 | 
					  AssertEqual [
 | 
				
			||||||
  \ {
 | 
					  \ {
 | 
				
			||||||
  \   'bufnr': 42,
 | 
					 | 
				
			||||||
  \   'vcol': 0,
 | 
					 | 
				
			||||||
  \   'nr': -1,
 | 
					 | 
				
			||||||
  \   'lnum': 8,
 | 
					  \   'lnum': 8,
 | 
				
			||||||
  \   'col': 5,
 | 
					  \   'col': 5,
 | 
				
			||||||
  \   'type': 'W',
 | 
					  \   'type': 'W',
 | 
				
			||||||
  \   'text': 'conversion lacks type at end of format [-Wformat=]',
 | 
					  \   'text': 'conversion lacks type at end of format [-Wformat=]',
 | 
				
			||||||
  \ },
 | 
					  \ },
 | 
				
			||||||
  \ {
 | 
					  \ {
 | 
				
			||||||
  \   'bufnr': 42,
 | 
					 | 
				
			||||||
  \   'vcol': 0,
 | 
					 | 
				
			||||||
  \   'nr': -1,
 | 
					 | 
				
			||||||
  \   'lnum': 10,
 | 
					  \   'lnum': 10,
 | 
				
			||||||
  \   'col': 27,
 | 
					  \   'col': 27,
 | 
				
			||||||
  \   'type': 'E',
 | 
					  \   'type': 'E',
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										68
									
								
								test/handler/test_gcc_handler.vader
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								test/handler/test_gcc_handler.vader
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,68 @@
 | 
				
			|||||||
 | 
					Execute(GCC errors from included files should be parsed correctly):
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 3,
 | 
				
			||||||
 | 
					  \     'type': 'E',
 | 
				
			||||||
 | 
					  \     'text': 'Problems were found in the header (See :ALEDetail)',
 | 
				
			||||||
 | 
					  \     'detail': join([
 | 
				
			||||||
 | 
					  \       'broken.h:1:1: error: expected identifier or ''('' before ''{'' token',
 | 
				
			||||||
 | 
					  \       ' {{{',
 | 
				
			||||||
 | 
					  \       ' ^',
 | 
				
			||||||
 | 
					  \     ], "\n"),
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \ ],
 | 
				
			||||||
 | 
					  \ ale#handlers#gcc#HandleGCCFormat(347, [
 | 
				
			||||||
 | 
					  \   'In file included from <stdin>:3:0:',
 | 
				
			||||||
 | 
					  \   'broken.h:1:1: error: expected identifier or ''('' before ''{'' token',
 | 
				
			||||||
 | 
					  \   ' {{{',
 | 
				
			||||||
 | 
					  \   ' ^',
 | 
				
			||||||
 | 
					  \ ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 3,
 | 
				
			||||||
 | 
					  \     'type': 'E',
 | 
				
			||||||
 | 
					  \     'text': 'Problems were found in the header (See :ALEDetail)',
 | 
				
			||||||
 | 
					  \     'detail': join([
 | 
				
			||||||
 | 
					  \       'b.h:1:1: error: expected identifier or ''('' before ''{'' token',
 | 
				
			||||||
 | 
					  \       ' {{{',
 | 
				
			||||||
 | 
					  \       ' ^',
 | 
				
			||||||
 | 
					  \     ], "\n"),
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \ ],
 | 
				
			||||||
 | 
					  \ ale#handlers#gcc#HandleGCCFormat(347, [
 | 
				
			||||||
 | 
					  \   'In file included from a.h:1:0,',
 | 
				
			||||||
 | 
					  \   '                 from test.c:3:',
 | 
				
			||||||
 | 
					  \   'b.h:1:1: error: expected identifier or ''('' before ''{'' token',
 | 
				
			||||||
 | 
					  \   ' {{{',
 | 
				
			||||||
 | 
					  \   ' ^',
 | 
				
			||||||
 | 
					  \ ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 3,
 | 
				
			||||||
 | 
					  \     'type': 'E',
 | 
				
			||||||
 | 
					  \     'text': 'Problems were found in the header (See :ALEDetail)',
 | 
				
			||||||
 | 
					  \     'detail': join([
 | 
				
			||||||
 | 
					  \       'b.h:1:1: error: unknown type name ‘bad_type’',
 | 
				
			||||||
 | 
					  \       ' bad_type x;',
 | 
				
			||||||
 | 
					  \       ' ^',
 | 
				
			||||||
 | 
					  \       'b.h:2:1: error: unknown type name ‘other_bad_type’',
 | 
				
			||||||
 | 
					  \       ' other_bad_type y;',
 | 
				
			||||||
 | 
					  \       ' ^',
 | 
				
			||||||
 | 
					  \     ], "\n"),
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \ ],
 | 
				
			||||||
 | 
					  \ ale#handlers#gcc#HandleGCCFormat(347, [
 | 
				
			||||||
 | 
					  \   'In file included from a.h:1:0,',
 | 
				
			||||||
 | 
					  \   '                 from test.c:3:',
 | 
				
			||||||
 | 
					  \   'b.h:1:1: error: unknown type name ‘bad_type’',
 | 
				
			||||||
 | 
					  \   ' bad_type x;',
 | 
				
			||||||
 | 
					  \   ' ^',
 | 
				
			||||||
 | 
					  \   'b.h:2:1: error: unknown type name ‘other_bad_type’',
 | 
				
			||||||
 | 
					  \   ' other_bad_type y;',
 | 
				
			||||||
 | 
					  \   ' ^',
 | 
				
			||||||
 | 
					  \ ])
 | 
				
			||||||
@ -2,26 +2,20 @@ Execute(The swiftint handler should parse error messages correctly):
 | 
				
			|||||||
  AssertEqual
 | 
					  AssertEqual
 | 
				
			||||||
  \ [
 | 
					  \ [
 | 
				
			||||||
  \   {
 | 
					  \   {
 | 
				
			||||||
  \     'bufnr': 347,
 | 
					 | 
				
			||||||
  \     'lnum': 1,
 | 
					  \     'lnum': 1,
 | 
				
			||||||
  \     'col': 7,
 | 
					  \     'col': 7,
 | 
				
			||||||
  \     'text': 'Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
					  \     'text': 'Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
				
			||||||
  \     'type': 'W',
 | 
					  \     'type': 'W',
 | 
				
			||||||
  \     'vcol': 0,
 | 
					 | 
				
			||||||
  \     'nr': -1,
 | 
					 | 
				
			||||||
  \   },
 | 
					  \   },
 | 
				
			||||||
  \   {
 | 
					  \   {
 | 
				
			||||||
  \     'bufnr': 347,
 | 
					 | 
				
			||||||
  \     'lnum': 1,
 | 
					  \     'lnum': 1,
 | 
				
			||||||
  \     'col': 11,
 | 
					  \     'col': 11,
 | 
				
			||||||
  \     'text': 'Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
					  \     'text': 'Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
				
			||||||
  \     'type': 'W',
 | 
					  \     'type': 'W',
 | 
				
			||||||
  \     'vcol': 0,
 | 
					 | 
				
			||||||
  \     'nr': -1,
 | 
					 | 
				
			||||||
  \   },
 | 
					  \   },
 | 
				
			||||||
  \
 | 
					  \
 | 
				
			||||||
  \ ],
 | 
					  \ ],
 | 
				
			||||||
  \ ale#handlers#HandleGCCFormat(347, [
 | 
					  \ ale#handlers#gcc#HandleGCCFormat(347, [
 | 
				
			||||||
  \   'This line should be ignored',
 | 
					  \   'This line should be ignored',
 | 
				
			||||||
  \   '<nopath>:1:7: warning: Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
					  \   '<nopath>:1:7: warning: Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
				
			||||||
  \   '<nopath>:1:11: warning: Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
					  \   '<nopath>:1:11: warning: Operator Usage Whitespace Violation: Operators should be surrounded by a single whitespace when they are being used. (operator_usage_whitespace)',
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										36
									
								
								test/handler/test_vint_handler.vader
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										36
									
								
								test/handler/test_vint_handler.vader
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,36 @@
 | 
				
			|||||||
 | 
					Execute(The vint handler should parse error messages correctly):
 | 
				
			||||||
 | 
					  :file! gxc.vim
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  AssertEqual
 | 
				
			||||||
 | 
					  \ [
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 1,
 | 
				
			||||||
 | 
					  \     'col': 1,
 | 
				
			||||||
 | 
					  \     'text': 'Use scriptencoding when multibyte char exists (see :help :script encoding)',
 | 
				
			||||||
 | 
					  \     'type': 'W',
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 3,
 | 
				
			||||||
 | 
					  \     'col': 17,
 | 
				
			||||||
 | 
					  \     'text': 'Use robust operators `==#` or `==?` instead of `==` (see Google VimScript Style Guide (Matching))',
 | 
				
			||||||
 | 
					  \     'type': 'W',
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 3,
 | 
				
			||||||
 | 
					  \     'col': 8,
 | 
				
			||||||
 | 
					  \     'text': 'Make the scope explicit like `l:filename` (see Anti-pattern of vimrc (Scope of identifier))',
 | 
				
			||||||
 | 
					  \     'type': 'W',
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \   {
 | 
				
			||||||
 | 
					  \     'lnum': 7,
 | 
				
			||||||
 | 
					  \     'col': 8,
 | 
				
			||||||
 | 
					  \     'text': 'Undefined variable: filename (see :help E738)',
 | 
				
			||||||
 | 
					  \     'type': 'W',
 | 
				
			||||||
 | 
					  \   },
 | 
				
			||||||
 | 
					  \ ],
 | 
				
			||||||
 | 
					  \ ale#handlers#gcc#HandleGCCFormat(347, [
 | 
				
			||||||
 | 
					  \   'gcc.vim:1:1: warning: Use scriptencoding when multibyte char exists (see :help :script encoding)',
 | 
				
			||||||
 | 
					  \   'gcc.vim:3:17: warning: Use robust operators `==#` or `==?` instead of `==` (see Google VimScript Style Guide (Matching))',
 | 
				
			||||||
 | 
					  \   'gcc.vim:3:8: style_problem: Make the scope explicit like `l:filename` (see Anti-pattern of vimrc (Scope of identifier))',
 | 
				
			||||||
 | 
					  \   'gcc.vim:7:8: warning: Undefined variable: filename (see :help E738)',
 | 
				
			||||||
 | 
					  \ ])
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user