  Code analyzers such as Error Prone and FindBugs detect code patterns
symptomatic of bugs, performance issues, or bad style. These tools express
patterns as quick fixes that detect and rewrite unwanted code. However, it is
difficult to come up with new quick fixes and decide which ones are useful and
frequently appear in real code. We propose to rely on the collective wisdom of
programmers and learn quick fixes from revision histories in software
repositories. We present REVISAR, a tool for discovering common Java edit
patterns in code repositories. Given code repositories and their revision
histories, REVISAR (i) identifies code edits from revisions and (ii) clusters
edits into sets that can be described using an edit pattern. The designers of
code analyzers can then inspect the patterns and add the corresponding quick
fixes to their tools. We ran REVISAR on nine popular GitHub projects, and it
discovered 89 useful edit patterns that appeared in 3 or more projects.
Moreover, 64% of the discovered patterns did not appear in existing tools. We
then conducted a survey with 164 programmers from 124 projects and found that
programmers significantly preferred eight out of the nine of the discovered
patterns. Finally, we submitted 16 pull requests applying our patterns to 9
projects and, at the time of the writing, programmers accepted 6 (60%) of them.
The results of this work aid toolsmiths in discovering quick fixes and making
informed decisions about which quick fixes to prioritize based on patterns
programmers actually apply in practice.
