diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index cbca40a4..7b905e3c 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.6.0-72' +let g:_SYNTASTIC_VERSION = '3.6.0-74' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/syntax_checkers/fortran/gfortran.vim b/syntax_checkers/fortran/gfortran.vim index 6cd4fe58..46ce3242 100644 --- a/syntax_checkers/fortran/gfortran.vim +++ b/syntax_checkers/fortran/gfortran.vim @@ -13,34 +13,101 @@ if exists('g:loaded_syntastic_fortran_gfortran_checker') finish endif -let g:loaded_syntastic_fortran_gfortran_checker=1 +let g:loaded_syntastic_fortran_gfortran_checker = 1 if !exists('g:syntastic_fortran_compiler_options') let g:syntastic_fortran_compiler_options = '' endif +let s:type_map = {} + let s:save_cpo = &cpo set cpo&vim -function! SyntaxCheckers_fortran_gfortran_IsAvailable() dict +function! SyntaxCheckers_fortran_gfortran_IsAvailable() dict " {{{1 if !exists('g:syntastic_fortran_compiler') let g:syntastic_fortran_compiler = self.getExec() endif call self.log('g:syntastic_fortran_compiler = ', g:syntastic_fortran_compiler) return executable(expand(g:syntastic_fortran_compiler, 1)) -endfunction +endfunction " }}}1 -function! SyntaxCheckers_fortran_gfortran_GetLocList() dict - return syntastic#c#GetLocList('fortran', 'gfortran', { - \ 'errorformat': - \ '%-C %#,'. - \ '%-C %#%.%#,'. - \ '%A%f:%l.%c:,'. - \ '%Z%trror: %m,'. - \ '%Z%tarning: %m,'. - \ '%-G%.%#', +" @vimlint(EVL104, 1, l:errorformat) +function! SyntaxCheckers_fortran_gfortran_GetLocList() dict " {{{1 + call s:SetCompilerType(g:syntastic_fortran_compiler) + if !has_key(s:type_map, g:syntastic_fortran_compiler) + call syntastic#log#error("checker fortran/gfortran: can't parse version string (abnormal termination?)") + return [] + endif + + if exists('g:syntastic_fortran_gfortran_sort') + let save_sort = g:syntastic_fortran_gfortran_sort + endif + + if s:type_map[g:syntastic_fortran_compiler] ==# 'gfortran' + let errorformat = + \ '%-C %#,'. + \ '%-C %#%.%#,'. + \ '%A%f:%l.%c:,'. + \ '%Z%trror: %m,'. + \ '%Z%tarning: %m,'. + \ '%-G%.%#' + if !exists('g:syntastic_fortran_gfortran_sort') + let g:syntastic_fortran_gfortran_sort = 0 + endif + elseif s:type_map[g:syntastic_fortran_compiler] ==# 'ifort' + let errorformat = + \ '%E%f(%l): error #%n: %m,'. + \ '%W%f(%l): warning #%n: %m,'. + \ '%W%f(%l): remark #%n: %m,'. + \ '%-Z%p^,'. + \ '%-G%.%#' + if !exists('g:syntastic_fortran_gfortran_sort') + let g:syntastic_fortran_gfortran_sort = 1 + endif + endif + + let loclist = syntastic#c#GetLocList('fortran', 'gfortran', { + \ 'errorformat': errorformat, \ 'main_flags': '-fsyntax-only' }) -endfunction + + if s:type_map[g:syntastic_fortran_compiler] ==# 'ifort' + for e in loclist + if match(getline(e['lnum']), "\t") >= 0 + let e['vcol'] = 1 + endif + endfor + endif + + if exists('save_sort') + let g:syntastic_fortran_gfortran_sort = save_sort + else + unlet! g:syntastic_fortran_gfortran_sort + endif + + return loclist +endfunction " }}}1 +" @vimlint(EVL104, 0, l:errorformat) + +" Utilities {{{1 + +function! s:SetCompilerType(exe) " {{{2 + if !has_key(s:type_map, a:exe) + try + let ver = filter( split(syntastic#util#system(syntastic#util#shescape(a:exe) . ' --version'), '\n'), + \ 'v:val =~# "\\v^%(GNU Fortran|ifort) "' )[0] + if ver =~# '\m^GNU Fortran ' + let s:type_map[a:exe] = 'gfortran' + elseif ver =~# '\m^ifort ' + let s:type_map[a:exe] = 'ifort' + endif + catch /\m^Vim\%((\a\+)\)\=:E684/ + " do nothing + endtry + endif +endfunction " }}}2 + +" }}} call g:SyntasticRegistry.CreateAndRegisterChecker({ \ 'filetype': 'fortran',