217 lines · cpp
1// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -fcxx-exceptions | grep -v CHECK | FileCheck %s2 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 67 68void extractStatementNotSemiWhile() {69 /*range eextract=->+2:4*/while (true) {70 int x = 0;71 }72}73// CHECK: 1 'eextract' results:74// CHECK: static void extracted() {75// CHECK-NEXT: while (true) {76// CHECK-NEXT: int x = 0;77// CHECK-NEXT: }{{$}}78// CHECK-NEXT: }{{[[:space:]].*}}79// CHECK-NEXT: void extractStatementNotSemiWhile() {80// CHECK-NEXT: extracted();{{$}}81// CHECK-NEXT: }82 83void extractStatementNotSemiFor() {84 /*range fextract=->+1:4*/for (int i = 0; i < 10; ++i) {85 }86}87// CHECK: 1 'fextract' results:88// CHECK: static void extracted() {89// CHECK-NEXT: for (int i = 0; i < 10; ++i) {90// CHECK-NEXT: }{{$}}91// CHECK-NEXT: }{{[[:space:]].*}}92// CHECK-NEXT: void extractStatementNotSemiFor() {93// CHECK-NEXT: extracted();{{$}}94// CHECK-NEXT: }95 96struct XS {97 int *begin() { return 0; }98 int *end() { return 0; }99};100 101void extractStatementNotSemiRangedFor(XS xs) {102 /*range gextract=->+1:4*/for (int i : xs) {103 }104}105// CHECK: 1 'gextract' results:106// CHECK: static void extracted() {107// CHECK-NEXT: for (int i : xs) {108// CHECK-NEXT: }{{$}}109// CHECK-NEXT: }{{[[:space:]].*}}110// CHECK-NEXT: void extractStatementNotSemiRangedFor(XS xs) {111// CHECK-NEXT: extracted();{{$}}112// CHECK-NEXT: }113 114void extractStatementNotSemiRangedTryCatch() {115 /*range hextract=->+3:4*/try { int x = 0; }116 catch (const int &i) {117 int y = i;118 }119}120// CHECK: 1 'hextract' results:121// CHECK: static void extracted() {122// CHECK-NEXT: try { int x = 0; }123// CHECK-NEXT: catch (const int &i) {124// CHECK-NEXT: int y = i;125// CHECK-NEXT: }{{$}}126// CHECK-NEXT: }{{[[:space:]].*}}127// CHECK-NEXT: void extractStatementNotSemiRangedTryCatch() {128// CHECK-NEXT: extracted();{{$}}129// CHECK-NEXT: }130 131void extractCantFindSemicolon() {132 /*range iextract=->+1:17*/do {133 } while (true)134 // Add a semicolon in both the extracted and original function as we don't135 // want to extract the semicolon below.136 ;137}138// CHECK: 1 'iextract' results:139// CHECK: static void extracted() {140// CHECK-NEXT: do {141// CHECK-NEXT: } while (true);{{$}}142// CHECK-NEXT: }{{[[:space:]].*}}143// CHECK-NEXT: void extractCantFindSemicolon() {144// CHECK-NEXT: extracted();{{$}}145// CHECK-NEXT: //146// CHECK-NEXT: //147// CHECK-NEXT: ;148// CHECK-NEXT: }149 150void extractFindSemicolon() {151 /*range jextract=->+1:17*/do {152 } while (true) /*grab*/ ;153}154// CHECK: 1 'jextract' results:155// CHECK: static void extracted() {156// CHECK-NEXT: do {157// CHECK-NEXT: } while (true) /*grab*/ ;{{$}}158// CHECK-NEXT: }{{[[:space:]].*}}159// CHECK-NEXT: void extractFindSemicolon() {160// CHECK-NEXT: extracted();{{$}}161// CHECK-NEXT: }162 163void call();164 165void careForNonCompoundSemicolons1() {166 /*range kextract=->+1:11*/if (true)167 call();168}169// CHECK: 1 'kextract' results:170// CHECK: static void extracted() {171// CHECK-NEXT: if (true)172// CHECK-NEXT: call();{{$}}173// CHECK-NEXT: }{{[[:space:]].*}}174// CHECK-NEXT: void careForNonCompoundSemicolons1() {175// CHECK-NEXT: extracted();{{$}}176// CHECK-NEXT: }177 178void careForNonCompoundSemicolons2() {179 /*range lextract=->+3:1*/for (int i = 0; i < 10; ++i)180 while (i != 0)181 ;182 // end right here111!183}184// CHECK: 1 'lextract' results:185// CHECK: static void extracted() {186// CHECK-NEXT: for (int i = 0; i < 10; ++i)187// CHECK-NEXT: while (i != 0)188// CHECK-NEXT: ;{{$}}189// CHECK-NEXT: }{{[[:space:]].*}}190// CHECK-NEXT: void careForNonCompoundSemicolons2() {191// CHECK-NEXT: extracted();{{$}}192// CHECK-NEXT: //193// CHECK-NEXT: }194 195void careForSwitchSemicolon() {196 /*range mextract=->+0:53*/switch(0) default: break;197}198// CHECK: 1 'mextract' results:199// CHECK: static void extracted() {200// CHECK-NEXT: switch(0) default: break;{{$}}201// CHECK-NEXT: }{{[[:space:]].*}}202// CHECK-NEXT: void careForSwitchSemicolon() {203// CHECK-NEXT: extracted();{{$}}204// CHECK-NEXT: }205 206void extractStatementNotSemiDecl() {207 /*range nextract=->+0:38*/int x = 5;208}209// CHECK: 1 'nextract' results:210// CHECK: static void extracted() {211// CHECK-NEXT: int x = 5;{{$}}212// CHECK-NEXT: }{{[[:space:]].*}}213// CHECK-NEXT: void extractStatementNotSemiDecl() {214// CHECK-NEXT: extracted();{{$}}215// CHECK-NEXT: }216 217