I am finally getting around to working on my next pet project which is a Static Analysis tool for Scala.
Java has a number of quite good Static Analysis tools such as:
checkstyle - enforces a large set of user configurable rules about things like
max-line-length, max-parameters, max-if-nesting,
max Cyclomatic complexity, etc
findbugs - looks for common bug patterns
Scala, for all of its power currently lacks such tools. There is even debate within the community if such tools matter for functional languages. Still, it seems like a very interesting problem to me so I decided to give it a go.
In talking with people at Boston Scala Days 2012 the consensus was that a compiler plugin was the best way to approach this problem. So, I started thinking about a two pronged approach:
1 - develop a compiler plugin to get access to the Abstract Syntax Tree of a program
2 - start a discussion about what kind of rules or metrics might make sense for a language like Scala.
The plug-in itself splits into at least two parts: the skeleton that hooks itself into the compilation process and the part that accesses the AST itself.
There is a great "how to" article on the compiler plug-in skeleton at http://www.scala-lang.org/node/140 This article shows how to build a trivial plug-in that looks for divide by zero errors. The guts are in the "apply" method...and that's where things got spooky for me!
def apply(unit: CompilationUnit) {
for ( tree @ Apply(Select(rcvr, nme.DIV), List(Literal(Constant(0)))) <- unit.body;
if rcvr.tpe <:< definitions.IntClass.tpe)
{
unit.error(tree.pos, "definitely division by zero")
}
}
I know that this method iterates over the unit.body tree looking for items that are division, with a literal zero and an integer. That doesn't mean however that I fully grok the Tree hierarchy and its various flavors of Apply and Select methods!
I will say I'm getting some very good help on this via a question I asked on StackOverflow:
http://stackoverflow.com/questions/10419101/how-can-i-find-the-statements-in-a-scala-program-from-within-a-compiler-plugin
More as I get smarter about Abstract Syntax Trees! If anyone wants to help on this project please contact me as I clearly could use help. I'll put the project up on GitHub soon.