mirror of
https://github.com/dense-analysis/ale.git
synced 2026-02-04 09:02:52 +08:00
Indicate that a C compiler failed due to problems in a header file
This commit is contained in:
@@ -5,6 +5,13 @@ scriptencoding utf-8
|
||||
|
||||
let s:pragma_error = '#pragma once in main file'
|
||||
|
||||
" 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 s:pattern = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$'
|
||||
|
||||
function! s:IsHeaderFile(filename) abort
|
||||
return a:filename =~? '\v\.(h|hpp)$'
|
||||
endfunction
|
||||
@@ -18,16 +25,63 @@ function! s:RemoveUnicodeQuotes(text) abort
|
||||
return l:text
|
||||
endfunction
|
||||
|
||||
" Report problems inside of header files just for gcc and clang
|
||||
function! s:ParseProblemsInHeaders(buffer, lines) abort
|
||||
let l:output = []
|
||||
let l:include_item = {}
|
||||
|
||||
for l:line in a:lines[: -2]
|
||||
let l:include_match = matchlist(l:line, '\v^In file included from')
|
||||
|
||||
if !empty(l:include_item)
|
||||
let l:pattern_match = matchlist(l:line, s:pattern)
|
||||
|
||||
if !empty(l:pattern_match) && l:pattern_match[1] is# '<stdin>'
|
||||
if has_key(l:include_item, 'lnum')
|
||||
call add(l:output, l:include_item)
|
||||
endif
|
||||
|
||||
let l:include_item = {}
|
||||
|
||||
continue
|
||||
endif
|
||||
|
||||
let l:include_item.detail .= "\n" . l:line
|
||||
endif
|
||||
|
||||
if !empty(l:include_match)
|
||||
if empty(l:include_item)
|
||||
let l:include_item = {
|
||||
\ 'text': 'Error found in header. See :ALEDetail',
|
||||
\ 'detail': l:line,
|
||||
\}
|
||||
endif
|
||||
endif
|
||||
|
||||
if !empty(l:include_item)
|
||||
let l:stdin_match = matchlist(l:line, '\vfrom \<stdin\>:(\d+):(\d*):?$')
|
||||
|
||||
if !empty(l:stdin_match)
|
||||
let l:include_item.lnum = str2nr(l:stdin_match[1])
|
||||
|
||||
if str2nr(l:stdin_match[2])
|
||||
let l:include_item.col = str2nr(l:stdin_match[2])
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
endfor
|
||||
|
||||
if !empty(l:include_item) && has_key(l:include_item, 'lnum')
|
||||
call add(l:output, l:include_item)
|
||||
endif
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
function! ale#handlers#gcc#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 = '\v^([a-zA-Z]?:?[^:]+):(\d+):(\d+)?:? ([^:]+): (.+)$'
|
||||
let l:output = []
|
||||
|
||||
for l:match in ale#util#GetMatches(a:lines, l:pattern)
|
||||
for l:match in ale#util#GetMatches(a:lines, s:pattern)
|
||||
" Filter out the pragma errors
|
||||
if s:IsHeaderFile(bufname(bufnr('')))
|
||||
\&& l:match[5][:len(s:pragma_error) - 1] is# s:pragma_error
|
||||
@@ -67,3 +121,12 @@ function! ale#handlers#gcc#HandleGCCFormat(buffer, lines) abort
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
" Handle problems with the GCC format, but report problems inside of headers.
|
||||
function! ale#handlers#gcc#HandleGCCFormatWithIncludes(buffer, lines) abort
|
||||
let l:output = ale#handlers#gcc#HandleGCCFormat(a:buffer, a:lines)
|
||||
|
||||
call extend(l:output, s:ParseProblemsInHeaders(a:buffer, a:lines))
|
||||
|
||||
return l:output
|
||||
endfunction
|
||||
|
||||
Reference in New Issue
Block a user