diff --git a/README.markdown b/README.markdown index 66d996ef..346123ee 100644 --- a/README.markdown +++ b/README.markdown @@ -61,10 +61,10 @@ Source Language, ActionScript, Ada, Ansible configurations, API Blueprint, AppleScript, AsciiDoc, Assembly languages, BEMHTML, Bro, Bourne shell, C, C++, C#, Cabal, Chef, CMake, CoffeeScript, Coco, Coq, CSS, Cucumber, CUDA, D, Dart, DocBook, Dockerfile, Dust, Elixir, Erlang, eRuby, Fortran, Gentoo metadata, -GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, -JSON, JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, -Markdown, MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, -Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug +GLSL, Go, Haml, Haskell, Haxe, Handlebars, HSS, HTML, Java, JavaScript, JSON, +JSX, Julia, LESS, Lex, Limbo, LISP, LLVM intermediate language, Lua, Markdown, +MATLAB, Mercury, NASM, Nix, Objective-C, Objective-C++, OCaml, Perl, Perl +6, Perl POD, PHP, gettext Portable Object, OS X and iOS property lists, Pug (formerly Jade), Puppet, Python, QML, R, Racket, RDF TriG, RDF Turtle, Relax NG, reStructuredText, RPM spec, Ruby, SASS/SCSS, Scala, Slim, SML, Solidity, Sphinx, SQL, Stylus, Tcl, TeX, Texinfo, Twig, TypeScript, Vala, Verilog, VHDL, diff --git a/autoload/syntastic/postprocess.vim b/autoload/syntastic/postprocess.vim index 136fa589..c69f3978 100644 --- a/autoload/syntastic/postprocess.vim +++ b/autoload/syntastic/postprocess.vim @@ -65,6 +65,17 @@ function! syntastic#postprocess#guards(errors) abort " {{{2 return a:errors endfunction " }}}2 +" convert error messages from UTF-8 to the current encoding +function! syntastic#postprocess#iconv(errors) abort " {{{2 + if has('iconv') && &encoding !=# '' && &encoding !=# 'utf-8' + for e in a:errors + let e['text'] = iconv(e['text'], "utf-8", &encoding) + endfor + endif + + return a:errors +endfunction " }}}2 + " }}}1 let &cpo = s:save_cpo diff --git a/autoload/syntastic/preprocess.vim b/autoload/syntastic/preprocess.vim index 43a1b9ac..79e4face 100644 --- a/autoload/syntastic/preprocess.vim +++ b/autoload/syntastic/preprocess.vim @@ -264,6 +264,43 @@ function! syntastic#preprocess#perl(errors) abort " {{{2 return syntastic#util#unique(out) endfunction " }}}2 +function! syntastic#preprocess#perl6(errors) abort " {{{2 + if a:errors[0] ==# 'Syntax OK' + return [] + endif + + let errs = s:_decode_JSON(join(a:errors, '')) + + let out = [] + if type(errs) == type({}) + try + for val in values(errs) + let line = get(val, 'line', 0) + let pos = get(val, 'pos', 0) + if pos && has('byte_offset') + let line_pos = byte2line(pos + 1) + let column = line_pos > 0 ? pos - line2byte(line_pos) + 2 : 0 + else + let column = 0 + endif + + call add(out, join([ + \ get(val, 'filename', ''), + \ line, + \ column, + \ get(val, 'message', '') ], ':')) + endfor + catch /\m^Vim\%((\a\+)\)\=:E716/ + call syntastic#log#warn('checker perl6/perl6: unrecognized error item ' . string(val)) + let out = [] + endtry + else + call syntastic#log#warn('checker perl6/perl6: unrecognized error format') + endif + + return out +endfunction " }}}2 + function! syntastic#preprocess#prospector(errors) abort " {{{2 let errs = join(a:errors, '') if errs ==# '' diff --git a/doc/syntastic-checkers.txt b/doc/syntastic-checkers.txt index 591754d7..2700a310 100644 --- a/doc/syntastic-checkers.txt +++ b/doc/syntastic-checkers.txt @@ -81,6 +81,7 @@ SYNTAX CHECKERS BY LANGUAGE *syntastic-checkers-lang* OCaml....................................|syntastic-checkers-ocaml| Perl.....................................|syntastic-checkers-perl| + Perl 6...................................|syntastic-checkers-perl6| PHP......................................|syntastic-checkers-php| POD......................................|syntastic-checkers-pod| Pug (formerly Jade)......................|syntastic-checkers-pug| @@ -4562,11 +4563,11 @@ Security~ This checker runs "perl -c" against your files, which in turn executes any "BEGIN", "UNITCHECK", and "CHECK" blocks, and any "use" statements in your -file (cf. http://perldoc.perl.org/perlrun.html#*-c*). This is probably fine if -you wrote the file yourself, but it can be a problem if you're trying to check -third party files. If you are 100% willing to let Vim run the code in your -file, set 'g:syntastic_enable_perl_checker' to 1 in your vimrc to enable this -checker: > +files (cf. http://perldoc.perl.org/perlrun.html#*-c*). This is probably fine +if you wrote the file yourself, but it can be a problem if you're trying to +check third party files. If you are 100% willing to let Vim run the code in +your files, set 'g:syntastic_enable_perl_checker' to 1 in your vimrc to enable +this checker: > let g:syntastic_enable_perl_checker = 1 < There is also a buffer-local version of this variable, that takes precedence @@ -4589,7 +4590,7 @@ Default: "perl" The perl interpreter to use. *'g:syntastic_perl_lib_path'* -Type: list os strings +Type: list of strings Default: [] List of include directories to be added to the perl command line. Example: > let g:syntastic_perl_lib_path = [ "./lib", "./lib/auto" ] @@ -4651,6 +4652,65 @@ accepts the standard options described at |syntastic-config-makeprg|. See also: |syntastic-pod-podchecker|. +============================================================================== +SYNTAX CHECKERS FOR PERL 6 *syntastic-checkers-perl6* + +The following checkers are available for Perl 6 (filetype "perl6"): + + 1. perl6....................|syntastic-perl6-perl6| + +------------------------------------------------------------------------------ +1. perl6 *syntastic-perl6-perl6* + +Name: perl6 +Maintainers: Claudio Ramirez + +"perl6" is a checker for Perl 6 files using the "Rakudo" compiler. See the +project's page for details: + + http://rakudo.org/ + +Syntastic requires Rakudo Star release 2017.01 or later. + +Security~ + +This checker runs "perl6 -c" against your files, which executes any "BEGIN" +and "CHECK" blocks (cf. https://docs.perl6.org/programs/00-running). This +is probably fine if you wrote the files yourself, but it can be a problem if +you're trying to check third party files. If you are 100% willing to let Vim +run the code in your files, set 'g:syntastic_enable_perl6_checker' to 1 in +your vimrc to enable this checker: > + let g:syntastic_enable_perl6_checker = 1 +< +There is also a buffer-local version of this variable, that takes precedence +over it in the buffers where it is defined. + +Please note that setting this variable doesn't automatically enable the +checker, you still need to add it to 'g:syntastic_perl6_checkers' if you plan +to use it. + +Checker options~ + +This checker is initialised using the "makeprgBuild()" function and thus it +accepts the standard options described at syntastic-config-makeprg. + +Additionally: + + *'g:syntastic_perl6_lib_path'* +Type: list of strings +Default: [] +List of include directories to be added to the perl6 command line. Example: > + let g:syntastic_perl6_lib_path = [ "./lib", "./lib/auto" ] +< +You can also set the "PERL6LIB" environment variable to a colon-separated +list of add-hoc include paths. These paths will then be added to the ones +prescribed by |'g:syntastic_perl6_lib_path'|. + +Note~ + +At the time of this writing the support for JSON error output of the "Rakudo" +compiler is still incomplete. + ============================================================================== SYNTAX CHECKERS FOR PHP *syntastic-checkers-php* diff --git a/plugin/syntastic.vim b/plugin/syntastic.vim index 63e256f9..3f177d26 100644 --- a/plugin/syntastic.vim +++ b/plugin/syntastic.vim @@ -19,7 +19,7 @@ if has('reltime') lockvar! g:_SYNTASTIC_START endif -let g:_SYNTASTIC_VERSION = '3.8.0-83' +let g:_SYNTASTIC_VERSION = '3.8.0-84' lockvar g:_SYNTASTIC_VERSION " Sanity checks {{{1 diff --git a/plugin/syntastic/registry.vim b/plugin/syntastic/registry.vim index 760cdb67..780e277e 100644 --- a/plugin/syntastic/registry.vim +++ b/plugin/syntastic/registry.vim @@ -68,6 +68,7 @@ let s:_DEFAULT_CHECKERS = { \ 'objcpp': ['gcc'], \ 'ocaml': ['camlp4o'], \ 'perl': ['perlcritic'], + \ 'perl6': [], \ 'php': ['php', 'phpcs', 'phpmd'], \ 'po': ['msgfmt'], \ 'pod': ['podchecker'], diff --git a/syntax_checkers/perl6/perl6.vim b/syntax_checkers/perl6/perl6.vim new file mode 100644 index 00000000..fe1dd10b --- /dev/null +++ b/syntax_checkers/perl6/perl6.vim @@ -0,0 +1,106 @@ +"============================================================================ +"File: perl6.vim +"Description: Syntax checking plugin for syntastic +"Maintainer: Claudio Ramirez +"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. +" +"============================================================================ +" +" Security: +" +" This checker runs 'perl6 -c' against your file, which in turn executes +" any BEGIN and CHECK blocks in your file. This is probably fine if you +" wrote the file yourself, but it can be a problem if you're trying to +" check third party files. If you are 100% willing to let Vim run the code +" in your file, set g:syntastic_enable_perl6_checker to 1 in your vimrc +" to enable this +" checker: +" +" let g:syntastic_enable_perl6_checker = 1 +" +" Reference: +" +" - https://docs.perl6.org/programs/00-running + +if exists('g:loaded_syntastic_perl6_perl6_checker') + finish +endif +let g:loaded_syntastic_perl6_perl6_checker = 1 + +if !exists('g:syntastic_perl6_lib_path') + let g:syntastic_perl6_lib_path = [] +endif + +if !exists('g:syntastic_perl6_perl6_sort') + let g:syntastic_perl6_perl6_sort = 1 +endif + +let s:save_cpo = &cpo +set cpo&vim + +function! SyntaxCheckers_perl6_perl6_IsAvailable() dict " {{{1 + " don't call executable() here, to allow things like + " let g:syntastic_perl6_perl6_exec = '/usr/bin/env perl6' + silent! call syntastic#util#system(self.getExecEscaped() . ' -e ' . syntastic#util#shescape('exit(0)')) + return (v:shell_error == 0) && syntastic#util#versionIsAtLeast(self.getVersion(), [2017, 1]) +endfunction " }}}1 + +function! SyntaxCheckers_perl6_perl6_GetHighlightRegex(item) " {{{1 + let term = matchstr(a:item['text'], '\m''\zs.\{-}\ze''') + if term !=# '' + return '\V' . escape(term, '\') + endif + let term = matchstr(a:item['text'], '\m^Undeclared .\+:\W\zs\S\+\ze') + if term !=# '' + return '\V' . escape(term, '\') + endif + let term = matchstr(a:item['text'], '\mCould not find \zs.\{-}\ze at') + if term !=# '' + return '\V' . escape(term, '\') + endif + let term = matchstr(a:item['text'], '\mCould not find \zs\S\+$') + return term !=# '' ? '\V' . escape(term, '\') : '' +endfunction " }}}1 + +function! SyntaxCheckers_perl6_perl6_GetLocList() dict " {{{1 + if type(g:syntastic_perl6_lib_path) == type('') + call syntastic#log#oneTimeWarn('variable g:syntastic_perl6_lib_path should be a list') + let includes = split(g:syntastic_perl6_lib_path, ',') + else + let includes = copy(syntastic#util#var('perl6_lib_path', [])) + endif + " support for PERL6LIB environment variable + if $PERL6LIB !=# '' + let includes += split($PERL6LIB, ':') + endif + call map(includes, '"-I" . v:val') + + let errorformat = + \ '%f:%l:%c:%m,' . + \ ':%l:%c:%m' + + let makeprg = self.makeprgBuild({ 'args_before': ['-c'] + includes }) + + return SyntasticMake({ + \ 'makeprg': makeprg, + \ 'errorformat': errorformat, + \ 'env': { 'RAKUDO_EXCEPTIONS_HANDLER': 'JSON' }, + \ 'defaults': { 'bufnr': bufnr(''), 'type': 'E' }, + \ 'returns': [0, 1], + \ 'preprocess': 'perl6', + \ 'postprocess': ['guards', 'iconv'] }) +endfunction " }}}1 + +call g:SyntasticRegistry.CreateAndRegisterChecker({ + \ 'filetype': 'perl6', + \ 'name': 'perl6', + \ 'enable': 'enable_perl6_checker'}) + +let &cpo = s:save_cpo +unlet s:save_cpo + +" vim: set sw=4 sts=4 et fdm=marker: