You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
145 lines
4.5 KiB
VimL
145 lines
4.5 KiB
VimL
if exists("g:loaded_syntastic_checker")
|
|
finish
|
|
endif
|
|
let g:loaded_syntastic_checker = 1
|
|
|
|
let g:SyntasticChecker = {}
|
|
|
|
" Public methods {{{1
|
|
|
|
function! g:SyntasticChecker.New(args)
|
|
let newObj = copy(self)
|
|
|
|
let newObj._filetype = a:args['filetype']
|
|
let newObj._name = a:args['name']
|
|
let newObj._exec = get(a:args, 'exec', newObj._name)
|
|
|
|
if has_key(a:args, 'redirect')
|
|
let [filetype, name] = split(a:args['redirect'], '/')
|
|
let prefix = 'SyntaxCheckers_' . filetype . '_' . name . '_'
|
|
else
|
|
let prefix = 'SyntaxCheckers_' . newObj._filetype . '_' . newObj._name . '_'
|
|
endif
|
|
|
|
let newObj._locListFunc = function(prefix . 'GetLocList')
|
|
|
|
if exists('*' . prefix . 'IsAvailable')
|
|
let newObj._isAvailableFunc = function(prefix . 'IsAvailable')
|
|
else
|
|
let newObj._isAvailableFunc = function('SyntasticCheckerIsAvailableDefault')
|
|
endif
|
|
|
|
if exists('*' . prefix . 'GetHighlightRegex')
|
|
let newObj._highlightRegexFunc = function(prefix . 'GetHighlightRegex')
|
|
endif
|
|
|
|
return newObj
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getFiletype()
|
|
return self._filetype
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getName()
|
|
return self._name
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getExec()
|
|
if exists('g:syntastic_' . self._filetype . '_' . self._name . '_exec')
|
|
return expand(g:syntastic_{self._filetype}_{self._name}_exec)
|
|
endif
|
|
|
|
return self._exec
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getExecEscaped()
|
|
return syntastic#util#shescape(self.getExec())
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getLocListRaw()
|
|
let name = self._filetype . '/' . self._name
|
|
try
|
|
let list = self._locListFunc()
|
|
call syntastic#log#debug(g:SyntasticDebugTrace, 'getLocList: checker ' . name . ' returned ' . v:shell_error)
|
|
catch /\m\C^Syntastic: checker error$/
|
|
let list = []
|
|
call syntastic#log#error('checker ' . name . ' returned abnormal status ' . v:shell_error)
|
|
endtry
|
|
call self._populateHighlightRegexes(list)
|
|
call syntastic#log#debug(g:SyntasticDebugLoclist, name . ' raw:', list)
|
|
call self._quietMessages(list)
|
|
return list
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.getLocList()
|
|
return g:SyntasticLoclist.New(self.getLocListRaw())
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.makeprgBuild(opts)
|
|
let basename = self._filetype . '_' . self._name . '_'
|
|
|
|
let parts = []
|
|
call extend(parts, self._getOpt(a:opts, basename, 'exe', self.getExecEscaped()))
|
|
call extend(parts, self._getOpt(a:opts, basename, 'args', ''))
|
|
call extend(parts, self._getOpt(a:opts, basename, 'fname', syntastic#util#shexpand('%')))
|
|
call extend(parts, self._getOpt(a:opts, basename, 'post_args', ''))
|
|
call extend(parts, self._getOpt(a:opts, basename, 'tail', ''))
|
|
|
|
return join(parts)
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker.isAvailable()
|
|
return self._isAvailableFunc()
|
|
endfunction
|
|
|
|
" Private methods {{{1
|
|
|
|
function! g:SyntasticChecker._quietMessages(errors)
|
|
let filter = 'g:syntastic_' . self._filetype . '_' . self._name . '_quiet_messages'
|
|
if exists(filter) && type({filter}) == type({}) && !empty({filter})
|
|
call syntastic#util#dictFilter(a:errors, {filter})
|
|
call syntastic#log#debug(g:SyntasticDebugLoclist, 'filtered by ' . filter . ':', a:errors)
|
|
endif
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker._populateHighlightRegexes(errors)
|
|
if has_key(self, '_highlightRegexFunc')
|
|
for e in a:errors
|
|
if e['valid']
|
|
let term = self._highlightRegexFunc(e)
|
|
if len(term) > 0
|
|
let e['hl'] = term
|
|
endif
|
|
endif
|
|
endfor
|
|
endif
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker._getOpt(opts, basename, name, default)
|
|
let user_val = syntastic#util#var(a:basename . a:name)
|
|
let ret = []
|
|
call extend( ret, self._shescape(get(a:opts, a:name . '_before', '')) )
|
|
call extend( ret, self._shescape(user_val != '' ? user_val : get(a:opts, a:name, a:default)) )
|
|
call extend( ret, self._shescape(get(a:opts, a:name . '_after', '')) )
|
|
|
|
return ret
|
|
endfunction
|
|
|
|
function! g:SyntasticChecker._shescape(opt)
|
|
if type(a:opt) == type('') && a:opt != ''
|
|
return [a:opt]
|
|
elseif type(a:opt) == type([])
|
|
return map(copy(a:opt), 'syntastic#util#shescape(v:val)')
|
|
endif
|
|
|
|
return []
|
|
endfunction
|
|
|
|
" Non-method functions {{{1
|
|
|
|
function! SyntasticCheckerIsAvailableDefault() dict
|
|
return executable(self.getExec())
|
|
endfunction
|
|
|
|
" vim: set sw=4 sts=4 et fdm=marker:
|