summaryrefslogtreecommitdiff
path: root/ale_linters/fortran
diff options
context:
space:
mode:
authorw0rp <devw0rp@gmail.com>2016-09-18 19:19:40 +0100
committerw0rp <devw0rp@gmail.com>2016-09-18 19:19:40 +0100
commit9553c24fa00ac8499d01adbb55d32403f180bf53 (patch)
tree465f54f99b32407b3af9299ef2a3b9becaa0c66e /ale_linters/fortran
parent0bc4b4c14c3cce61dd1838b5ed3ae5696f76f14d (diff)
downloadale-9553c24fa00ac8499d01adbb55d32403f180bf53.zip
Add support for checking Fortran syntax with GCC. Mad respect for the mathematicians.
Diffstat (limited to 'ale_linters/fortran')
-rw-r--r--ale_linters/fortran/gcc.vim68
1 files changed, 68 insertions, 0 deletions
diff --git a/ale_linters/fortran/gcc.vim b/ale_linters/fortran/gcc.vim
new file mode 100644
index 00000000..6df2c65a
--- /dev/null
+++ b/ale_linters/fortran/gcc.vim
@@ -0,0 +1,68 @@
+if exists('g:loaded_ale_linters_fortran_gcc')
+ finish
+endif
+
+let g:loaded_ale_linters_fortran_gcc = 1
+
+" Set this option to change the GCC options for warnings for Fortran.
+if !exists('g:ale_fortran_gcc_options')
+ let g:ale_fortran_gcc_options = '-Wall'
+endif
+
+function! ale_linters#fortran#gcc#Handle(buffer, lines)
+ " We have to match a starting line and a later ending line together,
+ " like so.
+ "
+ " :21.34:
+ " Error: Expected comma in I/O list at (1)
+ let line_marker_pattern = '^:\(\d\+\)\.\(\d\+\):$'
+ let message_pattern = '^\(Error\|Warning\): \(.\+\)$'
+ let looking_for_message = 0
+ let last_loclist_obj = {}
+
+ let output = []
+
+ for line in a:lines
+ if looking_for_message
+ let l:match = matchlist(line, message_pattern)
+ else
+ let l:match = matchlist(line, line_marker_pattern)
+ endif
+
+ if len(l:match) == 0
+ continue
+ endif
+
+ if looking_for_message
+ let looking_for_message = 0
+
+ " Now we have the text, we can set it and add the error.
+ let last_loclist_obj.text = l:match[2]
+ let last_loclist_obj.type = l:match[1] ==# 'Warning' ? 'W' : 'E'
+ call add(output, last_loclist_obj)
+ else
+ let last_loclist_obj = {
+ \ 'bufnr': a:buffer,
+ \ 'lnum': l:match[1] + 0,
+ \ 'vcol': 0,
+ \ 'col': l:match[2] + 0,
+ \ 'nr': -1,
+ \}
+
+ " Start looking for the message and error type.
+ let looking_for_message = 1
+ endif
+ endfor
+
+ return output
+endfunction
+
+call ALEAddLinter('fortran', {
+\ 'name': 'gcc',
+\ 'output_stream': 'stderr',
+\ 'executable': 'gcc',
+\ 'command': 'gcc -S -x f95 -fsyntax-only -ffree-form '
+\ . g:ale_fortran_gcc_options
+\ . ' -',
+\ 'callback': 'ale_linters#fortran#gcc#Handle',
+\})