Syntax Checking For Redcar
I spent the last couple of days thinking about how to implement syntax checking for Redcar. Konstantin Haase and I discussed using the Melbourne gem, which is basically Rubinius’ parser extracted into a gem. Melbourne is a C extension which has been passing all specs for some time now on JRuby master with cext support, so that seemed like a viable way to go.
Before I got started on my plan, however, I remembered that JRuby,
like MRI, supports the -c
switch to just do Syntax
checking. So I dug into that a little and came up with a short script to
run the JRuby parser on a piece of code from within a JRuby process:
From this I have now created two Redcar plugins: redcar_syntax_check
which offers some general features pertaining to syntax checking: an
abstract checker class, a syntax error class which knows how to annotate
an edit view in Redcar and a hook to run available syntax checkers after
saving a file.
To do this I had to add a few methods to Redcar’s edit_view
plugin, so currently this runs only on master.
Using this plugin it is now fairly easy to offer syntax checking for
any language: All you have to do is inherit from
Redcar::SyntaxCheck::Checker
and implement your custom
syntax checking logic in the check
method. If you discover
syntax errors in the given file, build instances of
Redcar::SyntaxCheck::Error
from them - Error
’s
need only know which document they belong to, the line number and a
message. Calling annotate
on them will then draw the
annotation and a wiggly line at the error position.
Finally, tell Redcar which grammar’s you support using the
supported_grammars
class method and a list of grammar names
in your Checker
subclass’ class body and you’re done!
See redcar_syntax_check_ruby for an example of how to do it.
When all went well, you can just open a document, write some code and, upon saving, it will automatically check the syntax and show you your errors:
