1 | // RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -fcxx-exceptions | grep -v CHECK | FileCheck %s |
2 | |
3 | struct Rectangle { int width, height; }; |
4 | |
5 | void extractStatement(const Rectangle &r) { |
6 | /*range adeclstmt=->+0:59*/int area = r.width * r.height; |
7 | } |
8 | // CHECK: 1 'adeclstmt' results: |
9 | // CHECK: static void extracted() { |
10 | // CHECK-NEXT: int area = r.width * r.height;{{$}} |
11 | // CHECK-NEXT: }{{[[:space:]].*}} |
12 | // CHECK-NEXT: void extractStatement(const Rectangle &r) { |
13 | // CHECK-NEXT: /*range adeclstmt=->+0:59*/extracted();{{$}} |
14 | // CHECK-NEXT: } |
15 | |
16 | void extractStatementNoSemiIf(const Rectangle &r) { |
17 | /*range bextractif=->+2:4*/if (r.width) { |
18 | int x = r.height; |
19 | } |
20 | } |
21 | // CHECK: 1 'bextractif' results: |
22 | // CHECK: static void extracted() { |
23 | // CHECK-NEXT: if (r.width) { |
24 | // CHECK-NEXT: int x = r.height; |
25 | // CHECK-NEXT: }{{$}} |
26 | // CHECK-NEXT: }{{[[:space:]].*}} |
27 | // CHECK-NEXT: void extractStatementNoSemiIf(const Rectangle &r) { |
28 | // CHECK-NEXT: /*range bextractif=->+2:4*/extracted();{{$}} |
29 | // CHECK-NEXT: } |
30 | |
31 | void extractStatementDontExtraneousSemi(const Rectangle &r) { |
32 | /*range cextractif=->+2:4*/if (r.width) { |
33 | int x = r.height; |
34 | } ; |
35 | } //^ This semicolon shouldn't be extracted. |
36 | // CHECK: 1 'cextractif' results: |
37 | // CHECK: static void extracted() { |
38 | // CHECK-NEXT: if (r.width) { |
39 | // CHECK-NEXT: int x = r.height; |
40 | // CHECK-NEXT: }{{$}} |
41 | // CHECK-NEXT: }{{[[:space:]].*}} |
42 | // CHECK-NEXT: void extractStatementDontExtraneousSemi(const Rectangle &r) { |
43 | // CHECK-NEXT: extracted(); ;{{$}} |
44 | // CHECK-NEXT: } |
45 | |
46 | void extractStatementNotSemiSwitch() { |
47 | /*range dextract=->+5:4*/switch (2) { |
48 | case 1: |
49 | break; |
50 | case 2: |
51 | break; |
52 | } |
53 | } |
54 | // CHECK: 1 'dextract' results: |
55 | // CHECK: static void extracted() { |
56 | // CHECK-NEXT: switch (2) { |
57 | // CHECK-NEXT: case 1: |
58 | // CHECK-NEXT: break; |
59 | // CHECK-NEXT: case 2: |
60 | // CHECK-NEXT: break; |
61 | // CHECK-NEXT: }{{$}} |
62 | // CHECK-NEXT: }{{[[:space:]].*}} |
63 | // CHECK-NEXT: void extractStatementNotSemiSwitch() { |
64 | // CHECK-NEXT: extracted();{{$}} |
65 | // CHECK-NEXT: } |
66 | |
67 | void extractStatementNotSemiWhile() { |
68 | /*range eextract=->+2:4*/while (true) { |
69 | int x = 0; |
70 | } |
71 | } |
72 | // CHECK: 1 'eextract' results: |
73 | // CHECK: static void extracted() { |
74 | // CHECK-NEXT: while (true) { |
75 | // CHECK-NEXT: int x = 0; |
76 | // CHECK-NEXT: }{{$}} |
77 | // CHECK-NEXT: }{{[[:space:]].*}} |
78 | // CHECK-NEXT: void extractStatementNotSemiWhile() { |
79 | // CHECK-NEXT: extracted();{{$}} |
80 | // CHECK-NEXT: } |
81 | |
82 | void extractStatementNotSemiFor() { |
83 | /*range fextract=->+1:4*/for (int i = 0; i < 10; ++i) { |
84 | } |
85 | } |
86 | // CHECK: 1 'fextract' results: |
87 | // CHECK: static void extracted() { |
88 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) { |
89 | // CHECK-NEXT: }{{$}} |
90 | // CHECK-NEXT: }{{[[:space:]].*}} |
91 | // CHECK-NEXT: void extractStatementNotSemiFor() { |
92 | // CHECK-NEXT: extracted();{{$}} |
93 | // CHECK-NEXT: } |
94 | |
95 | struct XS { |
96 | int *begin() { return 0; } |
97 | int *end() { return 0; } |
98 | }; |
99 | |
100 | void extractStatementNotSemiRangedFor(XS xs) { |
101 | /*range gextract=->+1:4*/for (int i : xs) { |
102 | } |
103 | } |
104 | // CHECK: 1 'gextract' results: |
105 | // CHECK: static void extracted() { |
106 | // CHECK-NEXT: for (int i : xs) { |
107 | // CHECK-NEXT: }{{$}} |
108 | // CHECK-NEXT: }{{[[:space:]].*}} |
109 | // CHECK-NEXT: void extractStatementNotSemiRangedFor(XS xs) { |
110 | // CHECK-NEXT: extracted();{{$}} |
111 | // CHECK-NEXT: } |
112 | |
113 | void extractStatementNotSemiRangedTryCatch() { |
114 | /*range hextract=->+3:4*/try { int x = 0; } |
115 | catch (const int &i) { |
116 | int y = i; |
117 | } |
118 | } |
119 | // CHECK: 1 'hextract' results: |
120 | // CHECK: static void extracted() { |
121 | // CHECK-NEXT: try { int x = 0; } |
122 | // CHECK-NEXT: catch (const int &i) { |
123 | // CHECK-NEXT: int y = i; |
124 | // CHECK-NEXT: }{{$}} |
125 | // CHECK-NEXT: }{{[[:space:]].*}} |
126 | // CHECK-NEXT: void extractStatementNotSemiRangedTryCatch() { |
127 | // CHECK-NEXT: extracted();{{$}} |
128 | // CHECK-NEXT: } |
129 | |
130 | void extractCantFindSemicolon() { |
131 | /*range iextract=->+1:17*/do { |
132 | } while (true) |
133 | // Add a semicolon in both the extracted and original function as we don't |
134 | // want to extract the semicolon below. |
135 | ; |
136 | } |
137 | // CHECK: 1 'iextract' results: |
138 | // CHECK: static void extracted() { |
139 | // CHECK-NEXT: do { |
140 | // CHECK-NEXT: } while (true);{{$}} |
141 | // CHECK-NEXT: }{{[[:space:]].*}} |
142 | // CHECK-NEXT: void extractCantFindSemicolon() { |
143 | // CHECK-NEXT: extracted();{{$}} |
144 | // CHECK-NEXT: // |
145 | // CHECK-NEXT: // |
146 | // CHECK-NEXT: ; |
147 | // CHECK-NEXT: } |
148 | |
149 | void extractFindSemicolon() { |
150 | /*range jextract=->+1:17*/do { |
151 | } while (true) /*grab*/ ; |
152 | } |
153 | // CHECK: 1 'jextract' results: |
154 | // CHECK: static void extracted() { |
155 | // CHECK-NEXT: do { |
156 | // CHECK-NEXT: } while (true) /*grab*/ ;{{$}} |
157 | // CHECK-NEXT: }{{[[:space:]].*}} |
158 | // CHECK-NEXT: void extractFindSemicolon() { |
159 | // CHECK-NEXT: extracted();{{$}} |
160 | // CHECK-NEXT: } |
161 | |
162 | void call(); |
163 | |
164 | void careForNonCompoundSemicolons1() { |
165 | /*range kextract=->+1:11*/if (true) |
166 | call(); |
167 | } |
168 | // CHECK: 1 'kextract' results: |
169 | // CHECK: static void extracted() { |
170 | // CHECK-NEXT: if (true) |
171 | // CHECK-NEXT: call();{{$}} |
172 | // CHECK-NEXT: }{{[[:space:]].*}} |
173 | // CHECK-NEXT: void careForNonCompoundSemicolons1() { |
174 | // CHECK-NEXT: extracted();{{$}} |
175 | // CHECK-NEXT: } |
176 | |
177 | void careForNonCompoundSemicolons2() { |
178 | /*range lextract=->+3:1*/for (int i = 0; i < 10; ++i) |
179 | while (i != 0) |
180 | ; |
181 | // end right here111! |
182 | } |
183 | // CHECK: 1 'lextract' results: |
184 | // CHECK: static void extracted() { |
185 | // CHECK-NEXT: for (int i = 0; i < 10; ++i) |
186 | // CHECK-NEXT: while (i != 0) |
187 | // CHECK-NEXT: ;{{$}} |
188 | // CHECK-NEXT: }{{[[:space:]].*}} |
189 | // CHECK-NEXT: void careForNonCompoundSemicolons2() { |
190 | // CHECK-NEXT: extracted();{{$}} |
191 | // CHECK-NEXT: // |
192 | // CHECK-NEXT: } |
193 | |