// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -fcxx-exceptions | grep -v CHECK | FileCheck %s struct Rectangle { int width, height; }; void extractStatement(const Rectangle &r) { /*range adeclstmt=->+0:59*/int area = r.width * r.height; } // CHECK: 1 'adeclstmt' results: // CHECK: static void extracted() { // CHECK-NEXT: int area = r.width * r.height;{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatement(const Rectangle &r) { // CHECK-NEXT: /*range adeclstmt=->+0:59*/extracted();{{$}} // CHECK-NEXT: } void extractStatementNoSemiIf(const Rectangle &r) { /*range bextractif=->+2:4*/if (r.width) { int x = r.height; } } // CHECK: 1 'bextractif' results: // CHECK: static void extracted() { // CHECK-NEXT: if (r.width) { // CHECK-NEXT: int x = r.height; // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNoSemiIf(const Rectangle &r) { // CHECK-NEXT: /*range bextractif=->+2:4*/extracted();{{$}} // CHECK-NEXT: } void extractStatementDontExtraneousSemi(const Rectangle &r) { /*range cextractif=->+2:4*/if (r.width) { int x = r.height; } ; } //^ This semicolon shouldn't be extracted. // CHECK: 1 'cextractif' results: // CHECK: static void extracted() { // CHECK-NEXT: if (r.width) { // CHECK-NEXT: int x = r.height; // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementDontExtraneousSemi(const Rectangle &r) { // CHECK-NEXT: extracted(); ;{{$}} // CHECK-NEXT: } void extractStatementNotSemiSwitch() { /*range dextract=->+5:4*/switch (2) { case 1: break; case 2: break; } } // CHECK: 1 'dextract' results: // CHECK: static void extracted() { // CHECK-NEXT: switch (2) { // CHECK-NEXT: case 1: // CHECK-NEXT: break; // CHECK-NEXT: case 2: // CHECK-NEXT: break; // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiSwitch() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void extractStatementNotSemiWhile() { /*range eextract=->+2:4*/while (true) { int x = 0; } } // CHECK: 1 'eextract' results: // CHECK: static void extracted() { // CHECK-NEXT: while (true) { // CHECK-NEXT: int x = 0; // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiWhile() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void extractStatementNotSemiFor() { /*range fextract=->+1:4*/for (int i = 0; i < 10; ++i) { } } // CHECK: 1 'fextract' results: // CHECK: static void extracted() { // CHECK-NEXT: for (int i = 0; i < 10; ++i) { // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiFor() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } struct XS { int *begin() { return 0; } int *end() { return 0; } }; void extractStatementNotSemiRangedFor(XS xs) { /*range gextract=->+1:4*/for (int i : xs) { } } // CHECK: 1 'gextract' results: // CHECK: static void extracted() { // CHECK-NEXT: for (int i : xs) { // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiRangedFor(XS xs) { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void extractStatementNotSemiRangedTryCatch() { /*range hextract=->+3:4*/try { int x = 0; } catch (const int &i) { int y = i; } } // CHECK: 1 'hextract' results: // CHECK: static void extracted() { // CHECK-NEXT: try { int x = 0; } // CHECK-NEXT: catch (const int &i) { // CHECK-NEXT: int y = i; // CHECK-NEXT: }{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiRangedTryCatch() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void extractCantFindSemicolon() { /*range iextract=->+1:17*/do { } while (true) // Add a semicolon in both the extracted and original function as we don't // want to extract the semicolon below. ; } // CHECK: 1 'iextract' results: // CHECK: static void extracted() { // CHECK-NEXT: do { // CHECK-NEXT: } while (true);{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractCantFindSemicolon() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: // // CHECK-NEXT: // // CHECK-NEXT: ; // CHECK-NEXT: } void extractFindSemicolon() { /*range jextract=->+1:17*/do { } while (true) /*grab*/ ; } // CHECK: 1 'jextract' results: // CHECK: static void extracted() { // CHECK-NEXT: do { // CHECK-NEXT: } while (true) /*grab*/ ;{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractFindSemicolon() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void call(); void careForNonCompoundSemicolons1() { /*range kextract=->+1:11*/if (true) call(); } // CHECK: 1 'kextract' results: // CHECK: static void extracted() { // CHECK-NEXT: if (true) // CHECK-NEXT: call();{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void careForNonCompoundSemicolons1() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void careForNonCompoundSemicolons2() { /*range lextract=->+3:1*/for (int i = 0; i < 10; ++i) while (i != 0) ; // end right here111! } // CHECK: 1 'lextract' results: // CHECK: static void extracted() { // CHECK-NEXT: for (int i = 0; i < 10; ++i) // CHECK-NEXT: while (i != 0) // CHECK-NEXT: ;{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void careForNonCompoundSemicolons2() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: // // CHECK-NEXT: } void careForSwitchSemicolon() { /*range mextract=->+0:53*/switch(0) default: break; } // CHECK: 1 'mextract' results: // CHECK: static void extracted() { // CHECK-NEXT: switch(0) default: break;{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void careForSwitchSemicolon() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: } void extractStatementNotSemiDecl() { /*range nextract=->+0:38*/int x = 5; } // CHECK: 1 'nextract' results: // CHECK: static void extracted() { // CHECK-NEXT: int x = 5;{{$}} // CHECK-NEXT: }{{[[:space:]].*}} // CHECK-NEXT: void extractStatementNotSemiDecl() { // CHECK-NEXT: extracted();{{$}} // CHECK-NEXT: }