  IDEs, such as Visual Studio, automate common transformations, such as Rename
and Extract Method refactorings. However, extending these catalogs of
transformations is complex and time-consuming. A similar phenomenon appears in
intelligent tutoring systems where instructors have to write cumbersome code
transformations that describe "common faults" to fix similar student
submissions to programming assignments. We present REFAZER, a technique for
automatically generating program transformations. REFAZER builds on the
observation that code edits performed by developers can be used as examples for
learning transformations. Example edits may share the same structure but
involve different variables and subexpressions, which must be generalized in a
transformation at the right level of abstraction. To learn transformations,
REFAZER leverages state-of-the-art programming-by-example methodology using the
following key components: (a) a novel domain-specific language (DSL) for
describing program transformations, (b) domain-specific deductive algorithms
for synthesizing transformations in the DSL, and (c) functions for ranking the
synthesized transformations. We instantiate and evaluate REFAZER in two
domains. First, given examples of edits used by students to fix incorrect
programming assignment submissions, we learn transformations that can fix other
students' submissions with similar faults. In our evaluation conducted on 4
programming tasks performed by 720 students, our technique helped to fix
incorrect submissions for 87% of the students. In the second domain, we use
repetitive edits applied by developers to the same project to synthesize a
program transformation that applies these edits to other locations in the code.
In our evaluation conducted on 59 scenarios of repetitive edits taken from 3 C#
open-source projects, REFAZER learns the intended program transformation in 83%
of the cases.
