101-1-2

while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) { String patDir = patDirs[patIdxEnd]; if (patDir.equals("**")) { break; } if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive)) { patDirs = null; strDirs = null; return false; } patIdxEnd--; strIdxEnd--; }
while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) { String patDir = patDirs[patIdxStart]; if (patDir.equals("**")) { break; } if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) { patDirs = null; strDirs = null; return false; } patIdxStart++; strIdxStart++; }

Clone fragments detected by clone detection tool
File path: /apache-ant-1.7.0/src/org/apache/tools/ant/types/selectors/SelectorUtils.java |  | File path: /apache-ant-1.7.0/src/org/apache/tools/ant/types/selectors/SelectorUtils.java
Method name: `boolean matchPath(String, String, boolean)` |  | Method name: `boolean matchPath(String, String, boolean)`
Number of AST nodes: 10 |  | Number of AST nodes: 10

1

    while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {↵

1

    while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd) {↵

2

                String patDir = patDirs[patIdxEnd];↵

2

                String patDir = patDirs[patIdxStart];↵

3

                if (patDir.equals("**")) {↵

3

                if (patDir.equals("**")) {↵

4

                    break;↵

4

                    break;↵

5

                }↵

5

                }↵

6

                if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive)) {↵

6

                if (!match(patDir, strDirs[strIdxStart], isCaseSensitive)) {↵

7

                    patDirs = null;↵

7

                    patDirs = null;↵

8

                    strDirs = null;↵

8

                    strDirs = null;↵

9

                    return false;↵

9

                    return false;↵

10

                }↵

10

                }↵

11

                patIdxEnd--;↵

11

                patIdxStart++;↵

12

                strIdxEnd--;↵

12

                strIdxStart++;↵

13

            }

13

            }

See real code fragment |  | See real code fragment

Summary
Number of common nesting structure subtrees | 1
Number of refactorable cases | 0
Number of non-refactorable cases | 1
Time elapsed for finding largest common nesting structure subtrees (ms) | 0.6
Clones location | Clones are in the same method
Number of node comparisons | 47

1. {Non-refactorable}

   Mapping Summary
   Number of mapped statements | 8
   Number of unmapped statements in the first code fragment | 2
   Number of unmapped statements in the second code fragment | 2
   Time elapsed for statement mapping (ms) | 2.9
   Clone type | Type 2

   Mapped Statements
   ID | Statement |  | ID | Statement
   --- | --- | --- | --- | ---

   28

       while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd)

   7

       while (patIdxStart <= patIdxEnd && strIdxStart <= strIdxEnd)

   29

       String patDir = patDirs[patIdxEnd];

   29 | String patDir = patDirs[patIdxEnd];
   8 | String patDir = patDirs[patIdxStart];

   Differences
   Expression1 | Expression2 | Difference
   --- | --- | ---
   patIdxEnd | patIdxStart | VARIABLE_NAME_MISMATCH

   8

       String patDir = patDirs[patIdxStart];

   30

       if (patDir.equals("**"))

   9

       if (patDir.equals("**"))

   31

       break;

   10

       break;

   32

       if (!match(patDir, strDirs[strIdxEnd], isCaseSensitive))

   32 | if (! match(patDir, strDirs[strIdxEnd], isCaseSensitive))
   11 | if (! match(patDir, strDirs[strIdxStart], isCaseSensitive))

   Differences
   Expression1 | Expression2 | Difference
   --- | --- | ---
   strIdxEnd | strIdxStart | VARIABLE_NAME_MISMATCH

   11

       if (!match(patDir, strDirs[strIdxStart], isCaseSensitive))

   33

       patDirs = null;

   12

       patDirs = null;

   34

       strDirs = null;

   13

       strDirs = null;

   35

       return false;

   35 | return false;
   14 | return false;

   Preondition Violations
   Conditional return false;
   Conditional return false;

   14

       return false;

   15 | patIdxStart++;

   Preondition Violations
   Unmatched statement patIdxStart++; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted

   15

       patIdxStart++;

   16 | strIdxStart++;

   Preondition Violations
   Unmatched statement strIdxStart++; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted

   16

       strIdxStart++;

   36

       patIdxEnd--;

   36 | patIdxEnd--;

   Preondition Violations
   Unmatched statement patIdxEnd--; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted

   37

       strIdxEnd--;

   37 | strIdxEnd--;

   Preondition Violations
   Unmatched statement strIdxEnd--; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted

   Precondition Violations (7)
   Row | Violation
   --- | ---
   1 | Unmatched statement patIdxStart++; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
   2 | Unmatched statement strIdxStart++; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
   3 | Unmatched statement patIdxEnd--; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
   4 | Unmatched statement strIdxEnd--; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted
   5 | Clone fragment #1 returns variables patDirs, strDirs , while Clone fragment #2 returns variables patDirs, strDirs
   6 | Conditional return false;
   7 | Conditional return false;