The gfortran checker now supports Intel Fortran.

It's now possible to set g:syntastic_fortran_compiler to 'ifort' to use
Intel Fortran instead of GNU Fortran.
This commit is contained in:
LCD 47 2015-04-15 14:27:06 +03:00
parent 80c5a047c0
commit b152ac3db3
2 changed files with 81 additions and 14 deletions

View File

@ -19,7 +19,7 @@ if has('reltime')
lockvar! g:_SYNTASTIC_START lockvar! g:_SYNTASTIC_START
endif endif
let g:_SYNTASTIC_VERSION = '3.6.0-72' let g:_SYNTASTIC_VERSION = '3.6.0-74'
lockvar g:_SYNTASTIC_VERSION lockvar g:_SYNTASTIC_VERSION
" Sanity checks {{{1 " Sanity checks {{{1

View File

@ -13,34 +13,101 @@
if exists('g:loaded_syntastic_fortran_gfortran_checker') if exists('g:loaded_syntastic_fortran_gfortran_checker')
finish finish
endif endif
let g:loaded_syntastic_fortran_gfortran_checker=1 let g:loaded_syntastic_fortran_gfortran_checker = 1
if !exists('g:syntastic_fortran_compiler_options') if !exists('g:syntastic_fortran_compiler_options')
let g:syntastic_fortran_compiler_options = '' let g:syntastic_fortran_compiler_options = ''
endif endif
let s:type_map = {}
let s:save_cpo = &cpo let s:save_cpo = &cpo
set cpo&vim set cpo&vim
function! SyntaxCheckers_fortran_gfortran_IsAvailable() dict function! SyntaxCheckers_fortran_gfortran_IsAvailable() dict " {{{1
if !exists('g:syntastic_fortran_compiler') if !exists('g:syntastic_fortran_compiler')
let g:syntastic_fortran_compiler = self.getExec() let g:syntastic_fortran_compiler = self.getExec()
endif endif
call self.log('g:syntastic_fortran_compiler = ', g:syntastic_fortran_compiler) call self.log('g:syntastic_fortran_compiler = ', g:syntastic_fortran_compiler)
return executable(expand(g:syntastic_fortran_compiler, 1)) return executable(expand(g:syntastic_fortran_compiler, 1))
endfunction endfunction " }}}1
function! SyntaxCheckers_fortran_gfortran_GetLocList() dict " @vimlint(EVL104, 1, l:errorformat)
return syntastic#c#GetLocList('fortran', 'gfortran', { function! SyntaxCheckers_fortran_gfortran_GetLocList() dict " {{{1
\ 'errorformat': 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 %#,'.
\ '%-C %#%.%#,'. \ '%-C %#%.%#,'.
\ '%A%f:%l.%c:,'. \ '%A%f:%l.%c:,'.
\ '%Z%trror: %m,'. \ '%Z%trror: %m,'.
\ '%Z%tarning: %m,'. \ '%Z%tarning: %m,'.
\ '%-G%.%#', \ '%-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' }) \ '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({ call g:SyntasticRegistry.CreateAndRegisterChecker({
\ 'filetype': 'fortran', \ 'filetype': 'fortran',