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