File path: /emf-2.4.1/src/org/eclipse/emf/ecore/xml/type/internal/RegEx.java | File path: /emf-2.4.1/src/org/eclipse/emf/ecore/xml/type/internal/RegEx.java | |||
Method name: void subtractRanges(Token)
|
Method name: void intersectRanges(Token)
|
|||
Number of AST nodes: 43 | Number of AST nodes: 42 | |||
1 | if (token.type == NRANGE) {↵ | |||
2 | this.intersectRanges(token);↵ | |||
3 | return;↵ | |||
4 | }↵ | |||
5 | RangeToken tok = (RangeToken)token;↵ | 1 | RangeToken tok = (RangeToken)token;↵ | |
6 | if (tok.ranges == null || this.ranges == null)↵ | 2 | if (tok.ranges == null || this.ranges == null)↵ | |
7 | return;↵ | 3 | return;↵ | |
8 | this.icaseCache = null;↵ | 4 | this.icaseCache = null;↵ | |
9 | this.sortRanges();↵ | 5 | this.sortRanges();↵ | |
10 | this.compactRanges();↵ | 6 | this.compactRanges();↵ | |
11 | tok.sortRanges();↵ | 7 | tok.sortRanges();↵ | |
12 | tok.compactRanges();↵ | 8 | tok.compactRanges();↵ | |
13 | //System.err.println("Token#substractRanges(): Entry: "+this.ranges.length+", "+tok.ranges.length);↵ | |||
14 | int[] result = new int[this.ranges.length+tok.ranges.length];↵ | 9 | int[] result = new int[this.ranges.length+tok.ranges.length];↵ | |
15 | int wp = 0, src = 0, sub = 0;↵ | 10 | int wp = 0, src1 = 0, src2 = 0;↵ | |
16 | while (src < this.ranges.length && sub < tok.ranges.length) {↵ | 11 | while (src1 < this.ranges.length && src2 < tok.ranges.length) {↵ | |
17 | int srcbegin = this.ranges[src];↵ | 12 | int src1begin = this.ranges[src1];↵ | |
18 | int srcend = this.ranges[src+1];↵ | 13 | int src1end = this.ranges[src1+1];↵ | |
19 | int subbegin = tok.ranges[sub];↵ | 14 | int src2begin = tok.ranges[src2];↵ | |
20 | int subend = tok.ranges[sub+1];↵ | 15 | int src2end = tok.ranges[src2+1];↵ | |
21 | if (srcend < subbegin) { // Not overlapped↵ | 16 | if (src1end < src2begin) { // Not overlapped↵ | |
22 | // src: o-----o↵ | 17 | // src1: o-----o↵ | |
23 | // sub: o-----o↵ | 18 | // src2: o-----o↵ | |
24 | // res: o-----o↵ | 19 | // res: empty↵ | |
25 | // Reuse sub↵ | 20 | // Reuse src2↵ | |
26 | result[wp++] = this.ranges[src++];↵ | 21 | ↵ | |
27 | result[wp++] = this.ranges[src++];↵ | 22 | src1 += 2;↵ | |
28 | } else if (srcend >= subbegin↵ | 23 | } else if (src1end >= src2begin↵ | |
29 | && srcbegin <= subend) { // Overlapped↵ | 24 | && src1begin <= src2end) { // Overlapped↵ | |
30 | // src: o--------o↵ | 25 | // src1: o--------o↵ | |
31 | // sub: o----o↵ | 26 | // src2: o----o↵ | |
32 | // sub: o----o↵ | 27 | // src2: o----o↵ | |
33 | // sub: o----o↵ | 28 | // src2: o----o↵ | |
34 | // sub: o------------o↵ | 29 | // src2: o------------o↵ | |
35 | if (subbegin <= srcbegin && srcend <= subend) {↵ | 30 | if (src2begin <= src1begin && src1end <= src2end) {↵ | |
36 | // src: o--------o↵ | 31 | // src1: o--------o↵ | |
37 | // sub: o------------o↵ | 32 | // src2: o------------o↵ | |
38 | // res: empty↵ | 33 | // res: o--------o↵ | |
39 | // Reuse sub↵ | 34 | // Reuse s↵ | |
40 | src↵ | 35 | rc2↵ | |
36 | result[wp++] = src1begin;↵ | |||
37 | result[wp++] = src1end;↵ | |||
41 | += 2;↵ | 38 | src1 += 2;↵ | |
42 | } else if (subbegin <= srcbegin) {↵ | 39 | } else if (src2begin <= src1begin) {↵ | |
43 | // src: o--------o↵ | 40 | // src1: o--------o↵ | |
44 | // sub: o----o↵ | 41 | // src2: o----o↵ | |
45 | // res: o-----o↵ | 42 | // res: o--o↵ | |
46 | // Reuse src(=res)↵ | 43 | // Reuse the rest of src1↵ | |
44 | result[wp++] = src1begin;↵ | |||
45 | result[wp++] = src2end;↵ | |||
47 | this.ranges[src] = subend+1;↵ | 46 | this.ranges[src1] = src2end+1;↵ | |
48 | sub += 2;↵ | 47 | src2 += 2;↵ | |
49 | } else if (srcend <= subend) {↵ | 48 | } else if (src1end <= src2end) {↵ | |
50 | // src: o--------o↵ | 49 | // src1: o--------o↵ | |
51 | // sub: o----o↵ | 50 | // src2: o----o↵ | |
52 | // res: o-----o↵ | 51 | // res: o--o↵ | |
53 | // Reuse sub↵ | 52 | // Reuse src2↵ | |
54 | result[wp++] = srcbegin;↵ | 53 | result[wp++] = src2begin;↵ | |
55 | result[wp++] = subbegin-1;↵ | 54 | result[wp++] = src1end;↵ | |
56 | src += 2;↵ | 55 | src1 += 2;↵ | |
57 | } else {↵ | 56 | } else {↵ | |
58 | // src: o--------o↵ | 57 | // src1: o--------o↵ | |
59 | // sub: o----o↵ | 58 | // src2: o----o↵ | |
60 | // res: o-o o-o↵ | 59 | // res: o----o↵ | |
61 | // Reuse src(=right res)↵ | 60 | // Reuse the rest of src1↵ | |
62 | result[wp++] = srcbegin;↵ | 61 | result[wp++] = src2begin;↵ | |
63 | result[wp++] = subbegin-1;↵ | 62 | result[wp++] = src2end;↵ | |
64 | this.ranges[src] = subend+1;↵ | 63 | this.ranges[src1] = src2end+1;↵ | |
65 | sub += 2;↵ | |||
66 | }↵ | 64 | }↵ | |
67 | } else if (subend < srcbegin) {↵ | 65 | } else if (src2end < src1begin) {↵ | |
68 | // Not overlapped↵ | 66 | // Not overlapped↵ | |
69 | // src: o-----o↵ | 67 | // src1: o-----o↵ | |
70 | // sub: o----o↵ | 68 | // src2: o----o↵ | |
71 | sub += 2;↵ | 69 | src2 += 2;↵ | |
72 | } else {↵ | 70 | } else {↵ | |
73 | throw new RuntimeException("Token#subtractRanges(): Internal Error: ["↵ | 71 | throw new RuntimeException("Token#intersectRanges(): Internal Error: ["↵ | |
74 | +this.ranges[src]↵ | 72 | +this.ranges[src1]↵ | |
75 | +","+this.ranges[src+1]↵ | 73 | +","+this.ranges[src1+1]↵ | |
76 | +"] - ["+tok.ranges[sub]↵ | 74 | +"] & ["+tok.ranges[src2]↵ | |
77 | +","+tok.ranges[sub+1]↵ | 75 | +","+tok.ranges[src2+1]↵ | |
78 | +"]");↵ | 76 | +"]");↵ | |
79 | }↵ | 77 | }↵ | |
80 | }↵ | 78 | }↵ | |
81 | while (src < this.ranges.length) {↵ | 79 | while (src1 < this.ranges.length) {↵ | |
82 | result[wp++] = this.ranges[src++];↵ | 80 | result[wp++] = this.ranges[src1++];↵ | |
83 | result[wp++] = this.ranges[src++];↵ | 81 | result[wp++] = this.ranges[src1++];↵ | |
84 | }↵ | 82 | }↵ | |
85 | this.ranges = new int[wp];↵ | 83 | this.ranges = new int[wp];↵ | |
86 | System.arraycopy(result, 0, this.ranges, 0, wp); | 84 |
| |
See real code fragment | See real code fragment |
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) | 1.7 |
Clones location | Clones are declared in the same class |
Number of node comparisons | 245 |
Number of mapped statements | 37 |
Number of unmapped statements in the first code fragment | 3 |
Number of unmapped statements in the second code fragment | 5 |
Time elapsed for statement mapping (ms) | 27.6 |
Clone type | Type 3 |
ID | Statement | ID | Statement | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
4 | RangeToken tok = (RangeToken)token; | 1 | RangeToken tok = (RangeToken)token; | ||||||||||||||||||||||||||
5 | if (tok.ranges == null || this.ranges == null) | 2 | if (tok.ranges == null || this.ranges == null) | ||||||||||||||||||||||||||
6 | return; |
| 3 | return; | |||||||||||||||||||||||||
7 | this.icaseCache = null; | 4 | this.icaseCache = null; | ||||||||||||||||||||||||||
8 | this.sortRanges(); | 5 | this.sortRanges(); | ||||||||||||||||||||||||||
9 | this.compactRanges(); | 6 | this.compactRanges(); | ||||||||||||||||||||||||||
10 | tok.sortRanges(); | 7 | tok.sortRanges(); | ||||||||||||||||||||||||||
11 | tok.compactRanges(); | 8 | tok.compactRanges(); | ||||||||||||||||||||||||||
12 | int[] result = new int[this.ranges.length + tok.ranges.length]; | 9 | int[] result = new int[this.ranges.length + tok.ranges.length]; | ||||||||||||||||||||||||||
13 | int wp = 0, src = 0, sub = 0; |
| 10 | int wp = 0, src1 = 0, src2 = 0; | |||||||||||||||||||||||||
14 | while (src < this.ranges.length && sub < tok.ranges.length) |
| 11 | while (src1 < this.ranges.length && src2 < tok.ranges.length) | |||||||||||||||||||||||||
15 | int srcbegin = this.ranges[src]; |
| 12 | int src1begin = this.ranges[src1]; | |||||||||||||||||||||||||
16 | int srcend = this.ranges[src + 1]; |
| 13 | int src1end = this.ranges[src1 + 1]; | |||||||||||||||||||||||||
17 | int subbegin = tok.ranges[sub]; |
| 14 | int src2begin = tok.ranges[src2]; | |||||||||||||||||||||||||
18 | int subend = tok.ranges[sub + 1]; |
| 15 | int src2end = tok.ranges[src2 + 1]; | |||||||||||||||||||||||||
19 | if (srcend < subbegin) |
| 16 | if (src1end < src2begin) | |||||||||||||||||||||||||
|
| 17 | src1 += 2; | ||||||||||||||||||||||||||
20 | result[wp++] = this.ranges[src++]; |
| | ||||||||||||||||||||||||||
21 | result[wp++] = this.ranges[src++]; |
| | ||||||||||||||||||||||||||
22 | else if (srcend >= subbegin && srcbegin <= subend) |
| 18 | else if (src1end >= src2begin && src1begin <= src2end) | |||||||||||||||||||||||||
23 | if (subbegin <= srcbegin && srcend <= subend) |
| 19 | if (src2begin <= src1begin && src1end <= src2end) | |||||||||||||||||||||||||
|
| 20 | result[wp++] = src1begin; | ||||||||||||||||||||||||||
|
| 21 | result[wp++] = src1end; | ||||||||||||||||||||||||||
24 | src += 2; |
| 22 | src1 += 2; | |||||||||||||||||||||||||
25 | else if (subbegin <= srcbegin) |
| 23 | else if (src2begin <= src1begin) | |||||||||||||||||||||||||
|
| 24 | result[wp++] = src1begin; | ||||||||||||||||||||||||||
|
| 25 | result[wp++] = src2end; | ||||||||||||||||||||||||||
26 | this.ranges[src] = subend + 1; |
| 26 | this.ranges[src1] = src2end + 1; | |||||||||||||||||||||||||
27 | sub += 2; |
| 27 | src2 += 2; | |||||||||||||||||||||||||
28 | else if (srcend <= subend) |
| 28 | else if (src1end <= src2end) | |||||||||||||||||||||||||
29 | result[wp++] = srcbegin; |
| 29 | result[wp++] = src2begin; | |||||||||||||||||||||||||
30 | result[wp++] = subbegin - 1; |
| 30 | result[wp++] = src1end; | |||||||||||||||||||||||||
31 | src += 2; |
| 31 | src1 += 2; | |||||||||||||||||||||||||
else | else | ||||||||||||||||||||||||||||
32 | result[wp++] = srcbegin; |
| 32 | result[wp++] = src2begin; | |||||||||||||||||||||||||
33 | result[wp++] = subbegin - 1; |
| 33 | result[wp++] = src2end; | |||||||||||||||||||||||||
34 | this.ranges[src] = subend + 1; |
| 34 | this.ranges[src1] = src2end + 1; | |||||||||||||||||||||||||
35 | sub += 2; |
| | ||||||||||||||||||||||||||
36 | else if (subend < srcbegin) |
| 35 | else if (src2end < src1begin) | |||||||||||||||||||||||||
37 | sub += 2; |
| 36 | src2 += 2; | |||||||||||||||||||||||||
else | else | ||||||||||||||||||||||||||||
38 | throw new RuntimeException("Token#subtractRanges(): Internal Error: [" + this.ranges[src] + "," + this.ranges[src + 1] + "] - [" + tok.ranges[sub] + "," + tok.ranges[sub + 1] + "]"); |
| 37 | throw new RuntimeException("Token#intersectRanges(): Internal Error: [" + this.ranges[src1] + "," + this.ranges[src1 + 1] + "] & [" + tok.ranges[src2] + "," + tok.ranges[src2 + 1] + "]"); | |||||||||||||||||||||||||
39 | while (src < this.ranges.length) |
| 38 | while (src1 < this.ranges.length) | |||||||||||||||||||||||||
40 | result[wp++] = this.ranges[src++]; |
| 39 | result[wp++] = this.ranges[src1++]; | |||||||||||||||||||||||||
41 | result[wp++] = this.ranges[src++]; |
| 40 | result[wp++] = this.ranges[src1++]; | |||||||||||||||||||||||||
42 | this.ranges = new int[wp]; | 41 | this.ranges = new int[wp]; | ||||||||||||||||||||||||||
43 | System.arraycopy(result, 0, this.ranges, 0, wp); | 42 | System.arraycopy(result, 0, this.ranges, 0, wp); |
Row | Violation |
---|---|
1 | Conditional return; |
2 | Expression srcbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
3 | Expression src1begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
4 | Expression subbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
5 | Expression src2begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
6 | Expression subbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
7 | Expression src2begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
8 | Unmatched statement src1+=2; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
9 | Unmatched statement result[wp++]=this.ranges[src++]; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
10 | Unmatched statement result[wp++]=this.ranges[src++]; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
11 | Expression subbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
12 | Expression src2begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
13 | Expression srcbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
14 | Expression src1begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
15 | Expression subbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
16 | Expression src2begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
17 | Expression srcbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
18 | Expression src1begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
19 | Unmatched statement result[wp++]=src1begin; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
20 | Unmatched statement result[wp++]=src1end; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
21 | Expression subbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
22 | Expression src2begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
23 | Expression srcbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
24 | Expression src1begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
25 | Unmatched statement result[wp++]=src1begin; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
26 | Unmatched statement result[wp++]=src2end; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
27 | Expression subbegin - 1 cannot be parameterized, because it has dependencies to/from statements that will be extracted |
28 | Expression src1end cannot be parameterized, because it has dependencies to/from statements that will be extracted |
29 | Expression subbegin - 1 cannot be parameterized, because it has dependencies to/from statements that will be extracted |
30 | Expression src2end cannot be parameterized, because it has dependencies to/from statements that will be extracted |
31 | Unmatched statement sub+=2; cannot be moved before or after the extracted code, because it has dependencies to/from statements that will be extracted |
32 | Expression srcbegin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
33 | Expression src1begin cannot be parameterized, because it has dependencies to/from statements that will be extracted |
34 | Clone fragment #1 returns variables result, wp, src, sub , while Clone fragment #2 returns variables src1, result, wp, src1begin, src1end, src2end |