aboutsummaryrefslogtreecommitdiff
path: root/vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim
diff options
context:
space:
mode:
Diffstat (limited to 'vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim')
-rw-r--r--vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim130
1 files changed, 130 insertions, 0 deletions
diff --git a/vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim b/vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim
new file mode 100644
index 0000000..f7f34e7
--- /dev/null
+++ b/vim/bundle/syntastic/syntax_checkers/ocaml/camlp4o.vim
@@ -0,0 +1,130 @@
+"============================================================================
+"File: ocaml.vim
+"Description: Syntax checking plugin for syntastic.vim
+"Maintainer: Török Edwin <edwintorok at gmail dot com>
+"License: This program is free software. It comes without any warranty,
+" to the extent permitted by applicable law. You can redistribute
+" it and/or modify it under the terms of the Do What The Fuck You
+" Want To Public License, Version 2, as published by Sam Hocevar.
+" See http://sam.zoy.org/wtfpl/COPYING for more details.
+"
+"============================================================================
+
+if exists('g:loaded_syntastic_ocaml_camlp4o_checker')
+ finish
+endif
+let g:loaded_syntastic_ocaml_camlp4o_checker = 1
+
+let s:save_cpo = &cpo
+set cpo&vim
+
+" Checker options {{{1
+
+if !exists('g:syntastic_ocaml_use_ocamlc') || !executable('ocamlc')
+ let g:syntastic_ocaml_use_ocamlc = 0
+endif
+
+if !exists('g:syntastic_ocaml_use_janestreet_core')
+ let g:syntastic_ocaml_use_janestreet_core = 0
+endif
+
+if !exists('g:syntastic_ocaml_janestreet_core_dir')
+ let g:syntastic_ocaml_janestreet_core_dir = '.'
+endif
+
+if !exists('g:syntastic_ocaml_use_ocamlbuild') || !executable('ocamlbuild')
+ let g:syntastic_ocaml_use_ocamlbuild = 0
+endif
+
+" }}}1
+
+function! SyntaxCheckers_ocaml_camlp4o_IsAvailable() dict " {{{1
+ let s:ocamlpp = get(g:, 'syntastic_ocaml_camlp4r', 0) ? 'camlp4r' : 'camlp4o'
+ return executable(s:ocamlpp)
+endfunction " }}}1
+
+function! SyntaxCheckers_ocaml_camlp4o_GetLocList() dict " {{{1
+ let makeprg = s:GetMakeprg()
+ if makeprg ==# ''
+ return []
+ endif
+
+ let errorformat =
+ \ '%WWarning: File "%f"\, line %l\, chars %c-%n:,'.
+ \ '%WWarning: line %l\, chars %c-%n:,'.
+ \ '%AFile "%f"\, line %l\, characters %c-%n:,'.
+ \ '%AFile "%f"\, line %l\, characters %c-%*\d (end at line %*\d\, character %*\d):,'.
+ \ '%AFile "%f"\, line %l\, character %c:,'.
+ \ '%AFile "%f"\, line %l\, character %c:%m,'.
+ \ '%-GPreprocessing error %.%#,'.
+ \ '%-GCommand exited %.%#,'.
+ \ '%C%tarning %*\d: %m,'.
+ \ '%C%m,'.
+ \ '%-G+%.%#'
+
+ let loclist = SyntasticMake({
+ \ 'makeprg': makeprg,
+ \ 'errorformat': errorformat,
+ \ 'defaults': {'bufnr': bufnr('')} })
+
+ for e in loclist
+ if get(e, 'col', 0) && get(e, 'nr', 0)
+ let e['hl'] = '\%>' . (e['col'] - 1) . 'c\%<' . (e['nr'] + 1) . 'c'
+ let e['nr'] = 0
+ endif
+ endfor
+
+ return loclist
+endfunction " }}}1
+
+" Utilities {{{1
+
+function! s:GetMakeprg() " {{{2
+ return
+ \ g:syntastic_ocaml_use_ocamlc ? g:syntastic_ocaml_use_ocamlc :
+ \ (g:syntastic_ocaml_use_ocamlbuild && isdirectory('_build')) ? s:GetOcamlcMakeprg() :
+ \ s:GetOtherMakeprg()
+endfunction " }}}2
+
+function! s:GetOcamlcMakeprg() " {{{2
+ let build_cmd = g:syntastic_ocaml_use_janestreet_core ?
+ \ 'ocamlc -I ' . syntastic#util#shexpand(g:syntastic_ocaml_janestreet_core_dir) : 'ocamlc'
+ let build_cmd .= ' -c ' . syntastic#util#shexpand('%')
+ return build_cmd
+endfunction " }}}2
+
+function! s:GetOcamlBuildMakeprg() " {{{2
+ return 'ocamlbuild -quiet -no-log -tag annot,' . s:ocamlpp . ' -no-links -no-hygiene -no-sanitize ' .
+ \ syntastic#util#shexpand('%:r') . '.cmi'
+endfunction " }}}2
+
+function! s:GetOtherMakeprg() " {{{2
+ "TODO: give this function a better name?
+ "
+ "TODO: should use throw/catch instead of returning an empty makeprg
+
+ let extension = expand('%:e', 1)
+ let makeprg = ''
+
+ if stridx(extension, 'mly') >= 0 && executable('menhir')
+ " ocamlyacc output can't be redirected, so use menhir
+ let makeprg = 'menhir --only-preprocess ' . syntastic#util#shexpand('%') . ' >' . syntastic#util#DevNull()
+ elseif stridx(extension,'mll') >= 0 && executable('ocamllex')
+ let makeprg = 'ocamllex -q ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%')
+ else
+ let makeprg = 'camlp4o ' . syntastic#c#NullOutput() . ' ' . syntastic#util#shexpand('%')
+ endif
+
+ return makeprg
+endfunction " }}}2
+
+" }}}1
+
+call g:SyntasticRegistry.CreateAndRegisterChecker({
+ \ 'filetype': 'ocaml',
+ \ 'name': 'camlp4o'})
+
+let &cpo = s:save_cpo
+unlet s:save_cpo
+
+" vim: set sw=4 sts=4 et fdm=marker: