Clang Project

clang_source_code/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp
1// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -fcxx-exceptions | grep -v CHECK | FileCheck %s
2
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: }
193