You could treat this post as ad. Because, literally it is.
I have realise that our code contains a little bit copy-pasted blocks. Code in Scala, obviously. So, I was looking for perfect working tools for it (at least, to find those blocks). I found only two non-working implementations. One is based on PMD (some classic tool for this topic), I cannot execute other variant because of elder sbt version.
So... I write my own. It's sbt-plugin.
The code is pretty simple. Scala 2.10 contains macros/run time aka ToolBox. That means, we have AST for free. After that we traverse tree and put all matched subtrees into dictionary (as strings). All matched substrees are blocks/functions_apply/vals/defs and so on. Yeah, and we don't care about comments, because ToolBox-parser perform only AST for code, not for comments.
If two subtrees are equal (syntactically, by _.toString) and big enough, it's a problem. Houston.
Fairly, first version is simple. Next version, I hope, would find val-renaming. It should be simple task while we work with AST, not with code-as-string.
At least, we use it in out CI-process. For each commits, TeamCity execute task with this plugin, and check that count of copy-pasted-blocks is less or equal than for previous commit.
It would be a big pleasure, if you also will use it.
PS. 3 years ago we use Simian. It's good enough, but it's not a AST, just strings.
Комментариев нет:
Отправить комментарий