From 394d129b55aa5167eee0d52d68ec3367e7d7c2c1 Mon Sep 17 00:00:00 2001 From: Martin Grenfell Date: Sun, 11 Dec 2011 22:54:33 +0000 Subject: [PATCH] refactor the javascript syntax checkers The js syntax checker was 4 checkers stuffed into 1 file. Now it is broken down so that each checker is in its own file inside syntax_checkers/javascript/ while syntax_checkers/javascript.vim just determines which file to source. Change the names of the global js checker config variables so that they all start with "syntastic_javascript_". This is purely for namespacing. Remove some unneeded logic around the config variables too. Not sure how it got in there, but it was more confusing than helpful without offering any benefits... --- syntax_checkers/javascript.vim | 106 ++++--------------------- syntax_checkers/javascript/gjslint.vim | 20 +++++ syntax_checkers/javascript/jshint.vim | 19 +++++ syntax_checkers/javascript/jsl.vim | 20 +++++ syntax_checkers/javascript/jslint.vim | 30 +++++++ 5 files changed, 104 insertions(+), 91 deletions(-) create mode 100644 syntax_checkers/javascript/gjslint.vim create mode 100644 syntax_checkers/javascript/jshint.vim create mode 100644 syntax_checkers/javascript/jsl.vim create mode 100644 syntax_checkers/javascript/jslint.vim diff --git a/syntax_checkers/javascript.vim b/syntax_checkers/javascript.vim index 5bf231ea..0f1bd291 100644 --- a/syntax_checkers/javascript.vim +++ b/syntax_checkers/javascript.vim @@ -1,6 +1,7 @@ "============================================================================ "File: javascript.vim -"Description: Syntax checking plugin for syntastic.vim using jslin/jshint +"Description: Figures out which javascript syntax checker (if any) to load +" from the javascript directory. "Maintainer: Martin Grenfell "License: This program is free software. It comes without any warranty, " to the extent permitted by applicable law. You can redistribute @@ -8,16 +9,10 @@ " Want To Public License, Version 2, as published by Sam Hocevar. " See http://sam.zoy.org/wtfpl/COPYING for more details. " -" Added changes from Matthew Kitt's javascript.vim to support jshint. -" " Use g:syntastic_javascript_checker option to specify which jslint executable " should be used (see below for a list of supported checkers). " If g:syntastic_javascript_checker is not set, just use the first syntax " checker that we find installed. -" -" Some work could be done here to remove the duplication of the *_conf -" variables. A single variable could be used here. -" "============================================================================ if exists("loaded_javascript_syntax_checker") finish @@ -26,92 +21,21 @@ let loaded_javascript_syntax_checker = 1 let s:supported_checkers = ["gjslint", "jslint", "jsl", "jshint"] -let s:checker = "" +function! s:load_checker(checker) + exec "runtime syntax_checkers/javascript/" . a:checker . ".vim" +endfunction + if exists("g:syntastic_javascript_checker") - let s:checker = g:syntastic_javascript_checker - if !executable(s:checker) || index(s:supported_checkers, s:checker) == -1 + if index(s:supported_checkers, g:syntastic_javascript_checker) != -1 && executable(g:syntastic_javascript_checker) + call s:load_checker(g:syntastic_javascript_checker) + else echoerr "Javascript syntax not supported or not installed." endif else - " Use whichever syntax checker we find installed first - if executable("gjslint") - let s:checker = "gjslint" - elseif executable("jslint") - let s:checker = "jslint" - elseif executable("jsl") - let s:checker = "jsl" - elseif executable("jshint") - let s:checker = "jshint" - endif -endif - -if s:checker == "gjslint" - if !exists("g:syntastic_gjslint_conf") - let g:syntastic_gjslint_conf = "" - endif - - function! SyntaxCheckers_javascript_GetLocList() - if empty(g:syntastic_gjslint_conf) - let gjslintconf = "" - else - let gjslintconf = g:syntastic_gjslint_conf - endif - let makeprg = "gjslint" . gjslintconf . " --nosummary --unix_mode --nodebug_indentation --nobeep " . shellescape(expand('%')) - let errorformat="%f:%l:(New Error -%\\?\%n) %m,%f:%l:(-%\\?%n) %m,%-G1 files checked, no errors found.,%-G%.%#" - return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) - endfunction - -elseif s:checker == "jslint" - if !exists("g:syntastic_jslint_conf") - let g:syntastic_jslint_conf = "" - endif - - function! SyntaxCheckers_javascript_HighlightTerm(error) - let unexpected = matchstr(a:error['text'], 'Expected.*and instead saw \'\zs.*\ze\'') - if len(unexpected) < 1 | return '' | end - return '\V'.split(unexpected, "'")[1] - endfunction - - function! SyntaxCheckers_javascript_GetLocList() - if empty(g:syntastic_jslint_conf) - let jslintconf = "" - else - let jslintconf = g:syntastic_jslint_conf - endif - - let makeprg = "jslint" . jslintconf . " " . shellescape(expand('%')) - let errorformat=' %#%n %l\,%c: %m,%-G%.%#' - let errors = SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat, 'defaults': {'bufnr': bufnr("")} }) - - call SyntasticHighlightErrors(errors, function('SyntaxCheckers_javascript_HighlightTerm')) - - return errors - endfunction - -elseif s:checker == "jsl" - if !exists("g:syntastic_jsl_conf") - let g:syntastic_jsl_conf = "" - endif - - function! SyntaxCheckers_javascript_GetLocList() - if empty(g:syntastic_jsl_conf) - let jslconf = "" - else - let jslconf = " -conf " . g:syntastic_jsl_conf - endif - let makeprg = "jsl" . jslconf . " -nologo -nofilelisting -nosummary -nocontext -process ".shellescape(expand('%')) - let errorformat='%W%f(%l): lint warning: %m,%-Z%p^,%W%f(%l): warning: %m,%-Z%p^,%E%f(%l): SyntaxError: %m,%-Z%p^,%-G' - return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) - endfunction - -elseif s:checker == 'jshint' - function! SyntaxCheckers_javascript_GetLocList() - if exists('s:config') - let makeprg = 'jshint ' . shellescape(expand("%")) . ' --config ' . s:config - else - let makeprg = 'jshint ' . shellescape(expand("%")) - endif - let errorformat = '%ELine %l:%c,%Z\\s%#Reason: %m,%C%.%#,%f: line %l\, col %c\, %m,%-G%.%#' - return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat, 'defaults': {'bufnr': bufnr('')} }) - endfunction + for checker in s:supported_checkers + if executable(checker) + call s:load_checker(checker) + break + endif + endfor endif diff --git a/syntax_checkers/javascript/gjslint.vim b/syntax_checkers/javascript/gjslint.vim new file mode 100644 index 00000000..05e1c0f1 --- /dev/null +++ b/syntax_checkers/javascript/gjslint.vim @@ -0,0 +1,20 @@ +"============================================================================ +"File: gjslint.vim +"Description: Javascript syntax checker - using gjslint +"Maintainer: Martin Grenfell +"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:syntastic_javascript_gjslint_conf") + let g:syntastic_javascript_gjslint_conf = "" +endif + +function! SyntaxCheckers_javascript_GetLocList() + let makeprg = "gjslint " . g:syntastic_javascript_gjslint_conf . " --nosummary --unix_mode --nodebug_indentation --nobeep " . shellescape(expand('%')) + let errorformat="%f:%l:(New Error -%\\?\%n) %m,%f:%l:(-%\\?%n) %m,%-G1 files checked, no errors found.,%-G%.%#" + return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) +endfunction + diff --git a/syntax_checkers/javascript/jshint.vim b/syntax_checkers/javascript/jshint.vim new file mode 100644 index 00000000..373aec94 --- /dev/null +++ b/syntax_checkers/javascript/jshint.vim @@ -0,0 +1,19 @@ +"============================================================================ +"File: jshint.vim +"Description: Javascript syntax checker - using jshint +"Maintainer: Martin Grenfell +"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:syntastic_javascript_jshint_conf") + let g:syntastic_javascript_jshint_conf = "" +endif + +function! SyntaxCheckers_javascript_GetLocList() + let makeprg = 'jshint ' . shellescape(expand("%")) . ' --config ' . g:syntastic_javascript_jshint_conf + let errorformat = '%ELine %l:%c,%Z\\s%#Reason: %m,%C%.%#,%f: line %l\, col %c\, %m,%-G%.%#' + return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat, 'defaults': {'bufnr': bufnr('')} }) +endfunction diff --git a/syntax_checkers/javascript/jsl.vim b/syntax_checkers/javascript/jsl.vim new file mode 100644 index 00000000..36c7efc5 --- /dev/null +++ b/syntax_checkers/javascript/jsl.vim @@ -0,0 +1,20 @@ +"============================================================================ +"File: jsl.vim +"Description: Javascript syntax checker - using jsl +"Maintainer: Martin Grenfell +"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:syntastic_javascript_jsl_conf") + let g:syntastic_javascript_jsl_conf = "" +endif + +function! SyntaxCheckers_javascript_GetLocList() + let makeprg = "jsl " . g:syntastic_javascript_jsl_conf . " -nologo -nofilelisting -nosummary -nocontext -process ".shellescape(expand('%')) + let errorformat='%W%f(%l): lint warning: %m,%-Z%p^,%W%f(%l): warning: %m,%-Z%p^,%E%f(%l): SyntaxError: %m,%-Z%p^,%-G' + return SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat }) +endfunction + diff --git a/syntax_checkers/javascript/jslint.vim b/syntax_checkers/javascript/jslint.vim new file mode 100644 index 00000000..c518909d --- /dev/null +++ b/syntax_checkers/javascript/jslint.vim @@ -0,0 +1,30 @@ +"============================================================================ +"File: jslint.vim +"Description: Javascript syntax checker - using jslint +"Maintainer: Martin Grenfell +"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:syntastic_javascript_jslint_conf") + let g:syntastic_javascript_jslint_conf = "" +endif + +function! SyntaxCheckers_javascript_HighlightTerm(error) + let unexpected = matchstr(a:error['text'], 'Expected.*and instead saw \'\zs.*\ze\'') + if len(unexpected) < 1 | return '' | end + return '\V'.split(unexpected, "'")[1] +endfunction + +function! SyntaxCheckers_javascript_GetLocList() + let makeprg = "jslint" . g:syntastic_javascript_jslint_conf . " " . shellescape(expand('%')) + let errorformat=' %#%n %l\,%c: %m,%-G%.%#' + let errors = SyntasticMake({ 'makeprg': makeprg, 'errorformat': errorformat, 'defaults': {'bufnr': bufnr("")} }) + + call SyntasticHighlightErrors(errors, function('SyntaxCheckers_javascript_HighlightTerm')) + + return errors +endfunction +