blob: 5caf9d4526844f3fad63da0e6ccab8c279d13bde [file] [log] [blame]
Alex Lorenz3cee7cf2017-11-03 21:31:10 +00001// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -fcxx-exceptions | grep -v CHECK | FileCheck %s
Alex Lorenzebbbb812017-11-03 18:11:22 +00002
3struct Rectangle { int width, height; };
4
5void 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
16void 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
31void 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
46void 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
67void 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
82void 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
95struct XS {
96 int *begin() { return 0; }
97 int *end() { return 0; }
98};
99
100void 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
113void 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
130void 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
149void 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
162void call();
163
164void 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
177void 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: }