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