<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta>
      <journal-title-group>
        <journal-title>EMLS</journal-title>
      </journal-title-group>
    </journal-meta>
    <article-meta>
      <title-group>
        <article-title>A Survey of Refactoring Detection Tools</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Liang Tan</string-name>
          <email>tan@staff.uni-marburg.de</email>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <contrib contrib-type="author">
          <string-name>Christoph Bockisch</string-name>
          <email>bockisch@acm.org</email>
          <xref ref-type="aff" rid="aff1">1</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Philipps-Universita ̈t Marburg</institution>
          ,
          <addr-line>Programming Languages and Tools, Marburg</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
        <aff id="aff1">
          <label>1</label>
          <institution>Philipps-Universita ̈t Marburg</institution>
          ,
          <addr-line>Programming Languages and Tools, Marburg</addr-line>
          ,
          <country country="DE">Germany</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2019</year>
      </pub-date>
      <volume>6</volume>
      <fpage>100</fpage>
      <lpage>105</lpage>
      <abstract>
        <p>-Several tools for detecting refactorings in the code exist and have been evaluated in the literature. However, we found that the benchmarks used for the evaluation so far are incomplete and therefore, the validity of the previous evaluations is at stake. While our completed benchmark largely confirmed the previous results, in particular confirming that RefactoringMiner generally outperforms its competitors, we also identified a weak spot of RefactoringMiner that was not noted before: Refactorings of the type Move Class and Rename Package are frequently classified falsely. In this paper we discuss the reasons for this wrong classification and outline a possible fix, which potentially boosts the overall precision and recall of RefactoringMiner to over 95%. Index Terms-Refactoring Detection, Reproduction Study, Move Method, Rename Package, RefactoringMiner</p>
      </abstract>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>I. INTRODUCTION</title>
      <p>
        During software upgrades and maintenance, programmers
frequently need to review code, e.g., to fix bugs or to identify
how to implement new features. A primary task during a
code review is understanding the code structure and logic.
If code changed since the last review, developers often also
need to understand the change to update their understanding.
Such code changes, in particular to the code structure—
i.e., to improve the internal code quality or prepare future
extensions—, are often realized by means of refactorings [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ].
      </p>
      <p>
        The technique of refactoring software system has been
around for a long time already, however, the term was probably
coined in 1989 by Bill Opdyke and Ralph Johnson [
        <xref ref-type="bibr" rid="ref2">2</xref>
        ]. It
has gained wide adoption especially in the agile software
development community, marked by the popular book by
Martin Fowler et al. [
        <xref ref-type="bibr" rid="ref1">1</xref>
        ]. A refactoring has the special property
that it only changes the code’s structure without changing
its external behavior. Therefore, knowing a refactoring has
been applied is important such that reviewers recognize that a
change was not to the software’s functionality. Also knowing
which particular refactoring has been applied is useful, since
refactorings typically are associated with a specific intention
hinting, e.g., at the kind of extension being prepared.
      </p>
      <p>
        Unfortunately, developers rarely document it when
refactorings are applied. While it would be easy to automatically
document refactorings when they are applied using a tool,
manual refactorings are still very common. As a consequence
this information is not immediately available to reviewers
[
        <xref ref-type="bibr" rid="ref3">3</xref>
        ]. To counter this, several tools have been developed for
automatically identifying refactorings that have been applied.
      </p>
      <p>
        We have performed a common evaluation of these tools
to make them more broadly comparable and have confirmed
that the tool RefactoringMiner [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ] shows the best results and
identifies refactorings rather reliably in most cases. However,
in our study applying refactoring detection tools to 55 code
versions, we found some strange phenomena. Particularly,
RefactoringMiner has problems distinguishing between the
refactorings Move Class and Rename Package. As we will
discuss, the evaluation by the original tool developers was
incomplete and therefore this problem did not surface before
and has not been investigated yet.
      </p>
      <p>In this paper we first present a full evaluation using a
completed benchmark, and then focus evaluating the tool
RefactoringMiner, which performed best in this evaluation.
This second evaluation reveals that RefactoringMiner performs
uncharacteristically low for Move Class and Rename Package.
As we will discuss, this is founded jointly in the nature of these
refactorings and the mode of operation of RefactoringMiner,
which is to analyze only the diff between versions of the
code in a software configuration management repository. The
eventual goal of our work is to understand the workings of
tools contributing to the evolution and maintenance of
longliving software systems.</p>
    </sec>
    <sec id="sec-2">
      <title>II. REFACTORING DETECTION IN A NUTSHELL</title>
      <p>When reviewers inspect code, they will typically look at
the current version and focus on code that changed during
the previous review. Since refactorings often result in
moving code, some code may now be in a different place and
therefore appear to be new. Thus, reviewers will focus on
understanding this code and possibly attempt to ensure its
internal quality, without recognizing that this code has already
been reviewed—just in another context.</p>
      <p>Today, it is a common standard to use software
configuration management like Git to keep track of code changes,
including refactorings. Reviewers, therefore, can easily access
the changes by looking at the difference between two versions
in Git. But, unless documentation of the applied refactorings
is explicitly added, they will only see, which lines have been
added, removed or changed. In this case, reviewers will either
not be able to properly understand the reason of the code
change, which can lead to a loss of efficiency and misjudgment
during code reviews. Or they need to analyze the diff more
closely to recognize that several of the changes considered
together form a specific refactoring.</p>
      <p>For example, consider that the Extract Method refactoring
has been applied: In this refactoring, a sequence of statements
is cut out of the middle of a method and placed into a new
method; a call to this method is then placed in the original
location of the statement sequence. The new method would
appear to be added and therefore it would be assumed to
require a thorough review. Looking at the diff for this change,
it would be possible to see that the body of the new method
matches the lines that have been removed in another place and
that a call to the new method has been inserted at the same
place.</p>
      <p>Recognizing the Extract Method refactoring in this way
may sound trivial. However, often the commit discipline of
developers is such that multiple refactorings are applied at
once and committed jointly, possibly even mixed with
functional changes. If single refactorings are committed separately,
a large number of commits would have to be investigated,
which is tedious when done manually. Also, e.g., during an
Extract Method refactoring, the new method’s body will not
always be identical to the original code: Accesses to formerly
local variables, fields or methods may need to change, or
the implementation is generalized along with the method
extraction. Therefore, recognizing a refactoring is, in general,
a difficult task.</p>
      <p>Figure 1 shows another example, namely applying the Move
Class refactoring, which we will consider in more depth in
the remainder of this paper. This also shows the difference
as well as connection between refactoring and refactoring
detection. Refactoring is a one-way technique to improve code,
taking as input one code version and emitting as output the
new version. Refactoring detection is bidirectional in the sense
that it requires two code versions as input, the new and the
old version (parent and child commits in git), and outputs the
applied refactoring.</p>
      <p>There are two major aspects in the process of
refactoring detection: code matching and refactoring analysis. Code
matching is the premise for finding refactorings. The
difference between the code in the two versions is the clue of
a refactoring. Finding these clues is the basis of efficient
detection. These clues are further processed by the refactoring
analysis. A quick and accurate determination of the refactoring
type is the ultimate goal of detection.</p>
      <p>Many experts and scholars have done research in this
direction and some tools have been developed to detect the
refactoring information (refactoring location and refactoring
type) from the code. Those tools, which can recognize multiple
refactoring types, are summarized in the following subsection.</p>
    </sec>
    <sec id="sec-3">
      <title>III. REFACTORING DETECTION TOOLS</title>
      <p>
        In 2000, Demeyer et al. [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ] proposed reverse engineering
of reconstructed code and proposed a detection heuristics.
Another relevant development is the increasing availability of
technologies, which enable the detection of refactorings. For
example, Toshihiro Kamiya et al. [
        <xref ref-type="bibr" rid="ref7">6</xref>
        ] developed CCfinder, a
clone detection technique that consists of the transformation
of input source text and a token-by-token comparison. Since
then, methods for the detection of refactorings and related
technologies have entered a stage of rapid development.
      </p>
      <p>
        The first refactoring detection approaches focused on
specific refactorings that are relatively simple. Van
Rysselberghe and Demeyer [
        <xref ref-type="bibr" rid="ref8">7</xref>
        ]—inspired by palaeontological fossil
research—proposed a “software palaeontology” heuristics in
2003. This method paid special attention to the evaluation
of the “Move Method” refactoring. Their work consisted of
comparing different releases of existing source code, analyzing
differences and reconstructing past evolution processes. In
the same year, Malpohl et al. [
        <xref ref-type="bibr" rid="ref6">8</xref>
        ] proposed the algorithm
“Renaming Detection”, which is equally applicable to data
description languages such as XML. The detector works with
multiple file pairs, also finding renamings that span several
files. It is part of a suite of intelligent tools for merging
programs exploiting the semantics of programming languages.
      </p>
      <p>
        After the first concrete approaches to detecting specific
refactorings, theories for more holistic methods have been
developed. Antoniol et al. [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ] presented an approach, based
on Vector Space Cosine Similarity (used in machine
learning) of class identifiers, to automatically identify class-level
refactorings between two subsequent releases. The approach
was useful to identify some replacement, merge and split
during the evolution of “dnsjava” 1. It uses a calibration
threshold to influence the precision and recall of the
detection method. An object-oriented design structure difference
algorithm (“UMLDiff”) was proposed by Xing and Stroulia
[
        <xref ref-type="bibr" rid="ref10">10</xref>
        ] in 2005. UMLDiff can detect additions, removals, moves,
1See the “dnsjava” homepage: http://www.dnsjava.org
renamings of packages, classes, interfaces, fields and methods,
changes of attributes and changes of the dependencies among
these entities. Based on the UMLDiff algorithm, JDEvAn
(Java Design Evolution Analysis) [
        <xref ref-type="bibr" rid="ref11">11</xref>
        ] can automatically detect
the design changes between two models corresponding to two
versions of a system.
      </p>
      <p>The detection approaches and algorithms proposed by some
early researchers laid a theoretical foundation for later
refactoring detection tools. Some researchers used the above
algorithms and ideas to develop complete refactoring detection
systems, i.e., tools that automatically detect the application of
different types of refactorings in the code. These systems will
be the subject to the study presented later in this paper.</p>
      <p>
        The earliest comprehensive detection tool developed is
RefactoringCrawler by Danny Dig et al. [
        <xref ref-type="bibr" rid="ref12">12</xref>
        ] in 2006. This
tool was implemented as a plugin for Eclipse and can detect
seven types of refactorings in Java code, focusing on rename
and move refactoring. In 2010, the tool Ref-Finder, developed
by Kyle Prete and his team, was proposed [
        <xref ref-type="bibr" rid="ref13">13</xref>
        ]. This tool
is based on the tool LSdiff (Logical Structural Diff) released
by Kim et al. [
        <xref ref-type="bibr" rid="ref14">14</xref>
        ], [
        <xref ref-type="bibr" rid="ref15">15</xref>
        ], to compute the delta between two
versions of the source code. Prete and his team used a logic
meta-programming approach to identify complex refactorings
from two program versions and a tool, which they say supports
63 refactoring types. RefactoringMiner was proposed in 2013
by Tsantalis [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], [
        <xref ref-type="bibr" rid="ref16">16</xref>
        ] and his research group. It implements a
lightweight version of the UMLDiff algorithm for computing
the differences between object-oriented models independent of
the IDE. It can detect ten kinds of refactorings. In 2017,
RefDiff was created by Danilo Silva and Marco Tulio Valente [
        <xref ref-type="bibr" rid="ref17">17</xref>
        ],
an automated approach that identifies 13 different refactoring
types by inspecting two code revisions in a git repository, using
a similarity index.
      </p>
      <p>IV. AN EVALUATION OF REFACTORING DETECTION
To compare the four most complete refactoring detection
tools discussed above, we created a common benchmark2
to which we applied all tools. In this way, their ability to
detect refactorings is determined using the same code bases,
change sets, and expected results. The benchmark combines
code bases and corresponding changes used in previous studies
to evaluate refactoring detection tools. We improved it to be
applicable to all tools by making it accommodate for the
different forms of input required by the different tools: either
by means of a Git repository or by means of two Eclipse
projects reflecting the code before and after the change.</p>
      <p>
        In Table I, we show the results for this combined benchmark
and for all tools, but limited to only the refactoring types
commonly detected by all four tools (which is only four types).
This confirms the previous results from the literature, namely
that RefactoringMiner performs best among the available tools.
While RefactoringCrawler has a slightly higher precision (96%
rather than 93%) than RefactoringMiner, the latter has a higher
2The benchmark can be accessed online:
https://bitbucket.org/tanliang11/struts/src
https://bitbucket.org/bockisch/jhotdraw/src and https://umrplt.bitbucket.io/
recall (73% compared to 60%). The F1-score computes a
combined measure for precision and recall [
        <xref ref-type="bibr" rid="ref18">18</xref>
        ], [
        <xref ref-type="bibr" rid="ref19">19</xref>
        ], and (as
can be seen in the table) RefactoringMiner has the highest
ranking in the F1-score.
      </p>
      <p>As said before, this comparison of all tools only considered
the common subset of refactoring types. Because
RefactoringMiner produced the best results in this comparison (which
is consistent with the literature), we further focused on this
tool and also determined the precision and recall for all
refactoring types supported by RefactoringMiner (using the
same benchmark applications as before). In this more detailed
benchmark—results are shown in Figure II—the results remain
very good, but diverge slightly from the benchmark presented
above, which was limited to only four refactoring types.
Considering all code bases in the benchmark and all supported
refactorings, RefactoringMiner has a total precision of 94%
and a total recall of 75% (Figure II), which is in line with the
results reported by the original authors.</p>
      <p>Although still high, the precision in our detailed benchmark
is lower than in the limited benchmark, while the recall is
higher. Taking a closer look, we identified that
RefactoringMiner has problems with the two refactoring types Move Class
and Rename Package, as shown in Table II. For these
refactoring types, the recall drops to 34% for Move Class, respectively
to 11% for Rename Package. This is inconsistent with the
results previously presented in the literature. The reason is
that the benchmarks previously used were less complete and
even missed out several actually applied refactorings in the set
of expected results.</p>
    </sec>
    <sec id="sec-4">
      <title>A. Detection of Move Class and Rename Package</title>
      <p>After discovering this behavior of RefactoringMiner, we
wanted to understand it further and conducted a more
comprehensive and in-depth test for the refactorings Move Class
and Rename Package respectively. Again, we used the original
benchmarks with our extended set of expected results. Since
we specifically focused on the two refactorings, we only
considered samples that contain at least two instances of the
refactoring we are investigating. The test results are shown in
the tables III and IV. The “Number” column in the table refers
to the test samples in the code base to make the experiment
repeatable and the results traceable. A benchmark sample
consists of two versions of a code base, where the second
version is based on the first one but with the refactorings
applied. In the tables, we refer to the two versions by giving
the Git commit number, thus, the base and commit form the
two versions. We also provide the expected number of Move
Class or Rename Package refactorings to be found, as well
as the true and false positives and the false negatives in the
results of RefactoringMiner. Lastly, we present the precision
and recall calculated from these figures.</p>
      <p>The data in Table III, presenting the results for Move Class,
show that of four data points the results are significantly
different from the results of the other items in terms of recall.
The excellent results in precision, cannot cover the instability
of recall. The number of undetected Move Class refactorings in
Type
Extract Method
Inline Method
Pull Up Method
Push Down Method
Move Method
Move Class
Extract Superclass
Extract Interface
Move Attribute
Rename Package
Push Down Attribute</p>
      <p>
        Total
these four abnormal data points, with a recall of less than 60%,
is 44, accounting for 14% of the total number of refactorings.
(Note that the original authors reported 100% precision and
96.24% recall for Move Class [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].) In two out of the 14
commits, RefactoringMiner did not report any results for Move
Class, which means that we cannot compute the individual
precision for these cases.
      </p>
      <p>
        This is similar for the results for Rename Package, found in
Table IV. In four out of nine cases, no results were reported at
all and we could not compute the precision. For the remaining
commits, the precision was at 100%. In terms of recall, from
the total 9 samples, RefactoringMiner has a recall below 50%
in 7 cases and even could not find any true positives in 4 cases.
The number of false negatives is in total at 91%. In the original
evaluation of the RefactoringMiner authors, a precision of 85%
and a recall of 100% had been reported for Rename Package
[
        <xref ref-type="bibr" rid="ref4">4</xref>
        ].
      </p>
      <p>When investigating the results further, we found that false
negatives for Move Class were often falsely classified as
Rename Package and vice versa. Therefore, we believe that
RefactoringMiner easily confuses these two refactorings.
1
0
0
0
4
44
0
0
0
39
0
88
To understand this, let us start by looking at the definition
of the two types of refactoring.</p>
      <p>Move Class: Move a class to another package. The class’s
simple name is not changed, but the file is moved to a different
path and the package statement is changed. The contents of
the class are unchanged.</p>
      <p>Rename Package: Rename a package. All Java-files
contained in the path of the original package are moved to the
path corresponding to the new package name. The simple class
names stay the same, i.e., the contents of the package does not
change, except for the package statement which now uses the
changed package name.</p>
      <p>The descriptions of the two refactoring types are very
similar, namely files are moved to a different path, package
statements change and classes stay otherwise the same. An
essential difference is that in one case only one Java-file is
moved and the rest of the classes in a package stay untouched,
and in the other case, all Java-files and resources are moved
to a new path. Apparently, RefactoringMiner has difficulties
recognizing this difference.</p>
      <p>We examined the inner workings of the RefactoringMiner
to further understand this. It simply analyzes the difference
between two code versions using the diff-feature of Git.
Thus, it does not need to perform a comprehensive matching
screening for all the code of the two project versions.</p>
      <p>Figures 2 and 3 show the diff output for two samples
in our benchmark in the side-by-side view of Bitbucket.
The refactoring in Figure 2 is reported as Move Class by
RefactoringMiner and actually really shows a Move Class.
The refactoring in Figure 3 is also reported to be Move Class,
however, this time actually a Rename Package refactoring had
been performed. We can see that the diff only shows the
changed file names and package statements. In both cases, the
structure of the diff is identical and it is impossible to judge
which of the refactorings has been applied by using only this
data.</p>
      <p>This is not surprising if we recall the definition of the two
refactorings, which both include the step of moving a
Javafile and changing its package statement while leaving the file
otherwise untouched. The difference lies within the context
in which the moved file appears: For Move Class, the class
is moved to a package (and thus, the Java-file is moved to a
path), which already existed before. Except for this one class,
the contents of the original package is left unchanged, and the
package will not disappear after the refactoring. For Rename
Package, the target package (and this path) did not exist before
and the old package disappears.</p>
      <p>However, this required context information is not visible in
the diff, which is focused on showing differences in file
contents. Whether a directory was newly created or disappeared
in a commit, is not reflected. Likewise, unchanged contents
are not reported, i.e., it cannot be seen if a directory contains
other files than the ones that changed.</p>
    </sec>
    <sec id="sec-5">
      <title>V. CONCLUSION</title>
      <p>In this article, we have presented an overview of the
history of refactoring detection tools, a description of the four
refactoring detection tools RefactoringCrawler, Ref-Finder,
RefactoringMiner and RefDiff. These are, to our knowledge,
the only tools available today for recognizing a number of
different refactoring types at once. For these four tools, we have
presented a common evaluation for a direct comparison of their
performance. As the tool performing best in our evaluation,
we have further-on presented a more detailed evaluation of
RefactoringMiner. Our evaluation largely reflected the results
reported in the literature before, namely that RefactoringMiner
outperforms the other tools with an F1 score of nearly 82%.
For the two refactorings Move Class and Rename Package, we
measured values for precision and recall which significantly
diverge from all other supported refactorings, as well as from
the evaluations presented in the literature so far.</p>
      <p>Therefore, we further investigated the approach of
RefactoringMiner for these two cases and found that the
implementation approach of using only the diff of two code versions on
Git hinders the proper detection of Move Class and Rename
Package. The reason is that the difference of these two
refactorings lies within the content which did not change, and
this is not shown in the diff. For this reason, RefactoringMiner
frequently confuses these two refactorings. We, thus, conclude
that analyzing the diff provided by a version control system
such as Git is powerful for detecting refactorings that do not
depend on the context in which they appear.</p>
      <p>If the refactorings Move Class and Rename Package would
be disregarded, RefactoringMiner would even have a
precision and recall of 94% and 98%, respectively, in the
evaluation shown in this paper. Since the information required
to distinguish between Move Class and Rename Package
(namely which directories have been created or deleted
during a commit) could be easily obtained, we conclude that
RefactoringMiner—with a simple extension—could in
principle reach this high level of accuracy.</p>
      <p>Since RefactoringMiner does not support detection for all
refactoring types described in the literature, but only for a
select subset thereof, we need to further investigate if this
conclusion holds in general. In the future, diff-based detection
for additional refactoring types should be researched, as well
as additional contexts that are relevant for the distinction of
refactorings.</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          [1]
          <string-name>
            <given-names>M.</given-names>
            <surname>Fowler</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            <surname>Beck</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            <surname>Brant</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Opdyke</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Roberts</surname>
          </string-name>
          ,
          <article-title>Refactoring: Improving the Design of Existing Code (Object Technology Series)</article-title>
          .
          <source>Addison-Wesley</source>
          ,
          <year>1999</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          [2]
          <string-name>
            <surname>O. William F.</surname>
          </string-name>
          and
          <string-name>
            <surname>J. Ralph E.</surname>
          </string-name>
          , “
          <article-title>Refactoring: An Aid in Designing Application Frameworks</article-title>
          and
          <string-name>
            <given-names>Evolving</given-names>
            <surname>Object-Oriented</surname>
          </string-name>
          <string-name>
            <surname>Systems</surname>
          </string-name>
          ,” in SOOPPA.
          <source>Pough-keepsie: ACM</source>
          ,
          <year>1990</year>
          , pp.
          <fpage>145</fpage>
          --
          <lpage>161</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          [3]
          <string-name>
            <given-names>R.</given-names>
            <surname>Moser</surname>
          </string-name>
          ,
          <string-name>
            <given-names>P.</given-names>
            <surname>Abrahamsson</surname>
          </string-name>
          ,
          <string-name>
            <given-names>W.</given-names>
            <surname>Pedrycz</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Sillitti</surname>
          </string-name>
          , and G. Succi, “
          <article-title>A case study on the impact of refactoring on quality and productivity in an agile team</article-title>
          ,
          <source>” in Lecture Notes in Computer Science (including subseries Lecture Notes in Artificial Intelligence and Lecture Notes in Bioinformatics)</source>
          , vol.
          <volume>5082</volume>
          LNCS. Springer-Verlag,
          <year>2008</year>
          , pp.
          <fpage>252</fpage>
          -
          <lpage>266</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          [4]
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Mansouri</surname>
          </string-name>
          ,
          <string-name>
            <given-names>L. M.</given-names>
            <surname>Eshkevari</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Mazinanian</surname>
          </string-name>
          , and
          <string-name>
            <given-names>D.</given-names>
            <surname>Dig</surname>
          </string-name>
          , “
          <article-title>Accurate and Efficient Refactoring Detection in Commit History,”</article-title>
          <source>in 40th International Conference on Software Engineering (ICSE'18)</source>
          . New York, New York, USA: ACM Press,
          <year>2018</year>
          , pp.
          <fpage>483</fpage>
          -
          <lpage>494</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          [5]
          <string-name>
            <given-names>S.</given-names>
            <surname>Demeyer</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Ducasse</surname>
          </string-name>
          , and
          <string-name>
            <given-names>O.</given-names>
            <surname>Nierstrasz</surname>
          </string-name>
          , “
          <article-title>Finding refactorings via change metrics,” ACM SIGPLAN Notices</article-title>
          , vol.
          <volume>35</volume>
          , no.
          <issue>10</issue>
          , pp.
          <fpage>166</fpage>
          -
          <lpage>177</lpage>
          ,
          <year>2000</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          [8]
          <string-name>
            <given-names>G.</given-names>
            <surname>Malpohl</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J. J.</given-names>
            <surname>Hunt</surname>
          </string-name>
          , and
          <string-name>
            <given-names>W. F.</given-names>
            <surname>Tichy</surname>
          </string-name>
          , “Renaming detection,”
          <source>in Proceedings ASE 2000: 15th IEEE International Conference on Automated Software Engineering. IEEE</source>
          ,
          <year>2000</year>
          , pp.
          <fpage>73</fpage>
          -
          <lpage>80</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          [6]
          <string-name>
            <given-names>T.</given-names>
            <surname>Kamiya</surname>
          </string-name>
          ,
          <string-name>
            <given-names>S.</given-names>
            <surname>Kusumoto</surname>
          </string-name>
          , and
          <string-name>
            <given-names>K.</given-names>
            <surname>Inoue</surname>
          </string-name>
          , “
          <article-title>CCFinder: A multilinguistic token-based code clone detection system for large scale source code</article-title>
          ,
          <source>” IEEE Transactions on Software Engineering</source>
          , vol.
          <volume>28</volume>
          , no.
          <issue>7</issue>
          , pp.
          <fpage>654</fpage>
          -
          <lpage>670</lpage>
          , jul
          <year>2002</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          [7]
          <string-name>
            <given-names>F.</given-names>
            <surname>Van Rysselberghe</surname>
          </string-name>
          and
          <string-name>
            <given-names>S.</given-names>
            <surname>Demeyer</surname>
          </string-name>
          , “
          <article-title>Reconstruction of successful software evolution using clone detection</article-title>
          ,” in
          <source>International Workshop on Principles of Software Evolution (IWPSE)</source>
          , vol. 2003-Janua. IEEE,
          <year>2003</year>
          , pp.
          <fpage>126</fpage>
          -
          <lpage>130</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          [9]
          <string-name>
            <given-names>G.</given-names>
            <surname>Antoniol</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M. Di</given-names>
            <surname>Penta</surname>
          </string-name>
          , and E. Merlo, “
          <article-title>An automatic approach to identify class evolution discontinuities</article-title>
          ,”
          <source>in Proceedings. 7th International Workshop on Principles of Software Evolution. IEEE</source>
          ,
          <year>2004</year>
          , pp.
          <fpage>31</fpage>
          -
          <lpage>40</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          [10]
          <string-name>
            <given-names>Z.</given-names>
            <surname>Xing</surname>
          </string-name>
          and E. Stroulia, “UMLDiff,”
          <source>in Proceedings of the 20th IEEE/ACM international Conference on Automated software engineering - ASE</source>
          '
          <fpage>05</fpage>
          . New York, New York, USA: ACM Press,
          <year>2005</year>
          , p.
          <fpage>54</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          [11] --, “
          <article-title>The JDEvAn tool suite in support of object-oriented evolutionary development,” in Companion of the 13th international conference on Software engineering -</article-title>
          ICSE Companion '
          <volume>08</volume>
          . New York, New York, USA: ACM Press,
          <year>2008</year>
          , p.
          <fpage>951</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          [12]
          <string-name>
            <given-names>D.</given-names>
            <surname>Dig</surname>
          </string-name>
          ,
          <string-name>
            <given-names>C.</given-names>
            <surname>Comertoglu</surname>
          </string-name>
          ,
          <string-name>
            <given-names>D.</given-names>
            <surname>Marinov</surname>
          </string-name>
          , and R. Johnson, “
          <source>Automated Detection of Refactorings in Evolving Components,” in Proceedings of the 20th European Conference on Object-Oriented Programming</source>
          . Springer-Verlag,
          <year>2006</year>
          , pp.
          <fpage>404</fpage>
          -
          <lpage>428</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref13">
        <mixed-citation>
          [13]
          <string-name>
            <given-names>K.</given-names>
            <surname>Prete</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Rachatasumrit</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Sudan</surname>
          </string-name>
          , and
          <string-name>
            <given-names>M.</given-names>
            <surname>Kim</surname>
          </string-name>
          , “
          <article-title>Template-based reconstruction of complex refactorings,”</article-title>
          <source>in IEEE International Conference on Software Maintenance</source>
          , ICSM. IEEE, sep
          <year>2010</year>
          , pp.
          <fpage>1</fpage>
          -
          <lpage>10</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref14">
        <mixed-citation>
          [14]
          <string-name>
            <given-names>M.</given-names>
            <surname>Kim</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            <surname>Gee</surname>
          </string-name>
          ,
          <string-name>
            <given-names>A.</given-names>
            <surname>Loh</surname>
          </string-name>
          , and
          <string-name>
            <given-names>N.</given-names>
            <surname>Rachatasumrit</surname>
          </string-name>
          , “Ref-Finder,”
          <source>in Proceedings of the eighteenth ACM SIGSOFT international symposium on Foundations of software engineering - FSE</source>
          '
          <fpage>10</fpage>
          . New York, New York, USA: ACM Press,
          <year>2010</year>
          , p.
          <fpage>371</fpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref15">
        <mixed-citation>
          [15]
          <string-name>
            <given-names>M.</given-names>
            <surname>Kim</surname>
          </string-name>
          and
          <string-name>
            <given-names>D.</given-names>
            <surname>Notkin</surname>
          </string-name>
          , “
          <article-title>Discovering and representing systematic code changes</article-title>
          ,”
          <source>in Proceedings - International Conference on Software Engineering. IEEE</source>
          ,
          <year>2009</year>
          , pp.
          <fpage>309</fpage>
          -
          <lpage>319</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref16">
        <mixed-citation>
          [16]
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            <surname>Guana</surname>
          </string-name>
          , E. Stroulia,
          <article-title>and</article-title>
          <string-name>
            <given-names>A.</given-names>
            <surname>Hindle</surname>
          </string-name>
          , “
          <article-title>A Multidimensional Empirical Study on Refactoring Activity,” Proceedings of the 2013 Conference of the Center for Advanced Studies on Collaborative Research, no</article-title>
          .
          <source>November</source>
          , pp.
          <fpage>132</fpage>
          -
          <lpage>146</lpage>
          ,
          <year>2013</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref17">
        <mixed-citation>
          [17]
          <string-name>
            <given-names>D.</given-names>
            <surname>Silva</surname>
          </string-name>
          and M. T. Valente, “RefDiff: Detecting Refactorings in Version Histories,” in IEEE International Working Conference on Mining Software Repositories. IEEE, may
          <year>2017</year>
          , pp.
          <fpage>269</fpage>
          -
          <lpage>279</lpage>
          .
        </mixed-citation>
      </ref>
      <ref id="ref18">
        <mixed-citation>
          [18]
          <string-name>
            <given-names>D.</given-names>
            <surname>Silva</surname>
          </string-name>
          ,
          <string-name>
            <given-names>N.</given-names>
            <surname>Tsantalis</surname>
          </string-name>
          , and M. T. Valente, “Why We Refactor? Confessions of GitHub Contributors,
          <source>” Proceedings of the 2016 24th ACM SIGSOFT International Symposium on Foundations of Software Engineering - FSE</source>
          <year>2016</year>
          , pp.
          <fpage>858</fpage>
          -
          <lpage>870</lpage>
          ,
          <year>2016</year>
          .
        </mixed-citation>
      </ref>
      <ref id="ref19">
        <mixed-citation>
          [19] “Why We Refactor? Confessions of GitHub Contributors,” visited:
          <fpage>2019</fpage>
          -01-09. [Online]. Available: https://aserg-ufmg.github. io/why-we-refactor/#/
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>