217 lines
6.0 KiB
C++
217 lines
6.0 KiB
C++
|
// 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: }
|
||
|
|