Coding and stuff

Syntax Checking For Redcar

by Tim Felgentreff ,

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:

ruby_syntax_checker.rb

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:

Syntax error in a Ruby file

 


This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Germany License. Any source code included is, unless stated otherwise, licensed under a MIT License. This does not apply for comments (below).