diff options
Diffstat (limited to 'test/Refactor/Extract')
-rw-r--r-- | test/Refactor/Extract/ExtractExprIntoFunction.cpp | 70 | ||||
-rw-r--r-- | test/Refactor/Extract/ExtractionSemicolonPolicy.cpp | 192 | ||||
-rw-r--r-- | test/Refactor/Extract/ExtractionSemicolonPolicy.m | 56 | ||||
-rw-r--r-- | test/Refactor/Extract/FromMethodToFunction.cpp | 42 | ||||
-rw-r--r-- | test/Refactor/Extract/ObjCProperty.m | 41 |
5 files changed, 401 insertions, 0 deletions
diff --git a/test/Refactor/Extract/ExtractExprIntoFunction.cpp b/test/Refactor/Extract/ExtractExprIntoFunction.cpp new file mode 100644 index 000000000000..0fccc9298597 --- /dev/null +++ b/test/Refactor/Extract/ExtractExprIntoFunction.cpp @@ -0,0 +1,70 @@ +// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++14 2>&1 | grep -v CHECK | FileCheck %s + + +void simpleExtractNoCaptures() { + int i = /*range=->+0:33*/1 + 2; +} + +// CHECK: 1 '' results: +// CHECK: static int extracted() { +// CHECK-NEXT: return 1 + 2;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: void simpleExtractNoCaptures() { +// CHECK-NEXT: int i = /*range=->+0:33*/extracted();{{$}} +// CHECK-NEXT: } + +void simpleExtractStmtNoCaptures() { + /*range astatement=->+1:13*/int a = 1; + int b = 2; +} +// CHECK: 1 'astatement' results: +// CHECK: static void extracted() { +// CHECK-NEXT: int a = 1; +// CHECK-NEXT: int b = 2;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: void simpleExtractStmtNoCaptures() { +// CHECK-NEXT: /*range astatement=->+1:13*/extracted();{{$}} +// CHECK-NEXT: } + + +void blankRangeNoExtraction() { + int i = /*range blank=*/1 + 2; +} + +// CHECK: 1 'blank' results: +// CHECK-NEXT: the provided selection does not overlap with the AST nodes of interest + +int outOfBodyCodeNoExtraction = /*range out_of_body_expr=->+0:72*/1 + 2; + +struct OutOfBodyStuff { + int FieldInit = /*range out_of_body_expr=->+0:58*/1 + 2; + + void foo(int x =/*range out_of_body_expr=->+0:58*/1 + 2); +}; + +auto inFunctionOutOfBody() -> decltype(/*range out_of_body_expr=->+0:79*/1 + 2) { + struct OutOfBodyStuff { + int FieldInit = /*range out_of_body_expr=->+0:60*/1 + 2; + + void foo(int x =/*range out_of_body_expr=->+0:60*/1 + 2); + }; + enum E { + X = /*range out_of_body_expr=->+0:48*/1 + 2 + }; + int x = 0; + using T = decltype(/*range out_of_body_expr=->+0:61*/x + 3); + return x; +} + +// CHECK: 8 'out_of_body_expr' results: +// CHECK: the selected code is not a part of a function's / method's body + +void simpleExpressionNoExtraction() { + int i = /*range simple_expr=->+0:41*/1 + /*range simple_expr=->+0:76*/(2); + (void) /*range simple_expr=->+0:40*/i; + (void)/*range simple_expr=->+0:47*/"literal"; + (void)/*range simple_expr=->+0:41*/'c'; +} + +// CHECK: 5 'simple_expr' results: +// CHECK-NEXT: the selected expression is too simple to extract diff --git a/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp b/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp new file mode 100644 index 000000000000..5caf9d452684 --- /dev/null +++ b/test/Refactor/Extract/ExtractionSemicolonPolicy.cpp @@ -0,0 +1,192 @@ +// 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: } diff --git a/test/Refactor/Extract/ExtractionSemicolonPolicy.m b/test/Refactor/Extract/ExtractionSemicolonPolicy.m new file mode 100644 index 000000000000..10e6a164f248 --- /dev/null +++ b/test/Refactor/Extract/ExtractionSemicolonPolicy.m @@ -0,0 +1,56 @@ +// RUN: clang-refactor extract -selection=test:%s %s -- 2>&1 | grep -v CHECK | FileCheck %s + +@interface NSArray ++ (id)arrayWithObjects:(const id [])objects count:(unsigned long)cnt; +@end + +void extractStatementNoSemiObjCFor(NSArray *array) { + /*range astmt=->+2:4*/for (id i in array) { + int x = 0; + } +} +// CHECK: 1 'astmt' results: +// CHECK: static void extracted() { +// CHECK-NEXT: for (id i in array) { +// CHECK-NEXT: int x = 0; +// CHECK-NEXT: }{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} + +void extractStatementNoSemiSync() { + id lock; + /*range bstmt=->+2:4*/@synchronized(lock) { + int x = 0; + } +} +// CHECK: 1 'bstmt' results: +// CHECK: static void extracted() { +// CHECK-NEXT: @synchronized(lock) { +// CHECK-NEXT: int x = 0; +// CHECK-NEXT: }{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} + +void extractStatementNoSemiAutorel() { + /*range cstmt=->+2:4*/@autoreleasepool { + int x = 0; + } +} +// CHECK: 1 'cstmt' results: +// CHECK: static void extracted() { +// CHECK-NEXT: @autoreleasepool { +// CHECK-NEXT: int x = 0; +// CHECK-NEXT: }{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} + +void extractStatementNoSemiTryFinalllllly() { + /*range dstmt=->+3:4*/@try { + int x = 0; + } @finally { + } +} +// CHECK: 1 'dstmt' results: +// CHECK: static void extracted() { +// CHECK-NEXT: @try { +// CHECK-NEXT: int x = 0; +// CHECK-NEXT: } @finally { +// CHECK-NEXT: }{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} diff --git a/test/Refactor/Extract/FromMethodToFunction.cpp b/test/Refactor/Extract/FromMethodToFunction.cpp new file mode 100644 index 000000000000..86bec16edfd1 --- /dev/null +++ b/test/Refactor/Extract/FromMethodToFunction.cpp @@ -0,0 +1,42 @@ +// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 2>&1 | grep -v CHECK | FileCheck --check-prefixes=CHECK,CHECK-INNER %s +// RUN: clang-refactor extract -selection=test:%s %s -- -std=c++11 -DMULTIPLE 2>&1 | grep -v CHECK | FileCheck --check-prefixes=CHECK,CHECK-OUTER %s + +#ifdef MULTIPLE +class OuterClass { +#define PREFIX OuterClass :: +#else +#define PREFIX +#endif + +class AClass { + + int method(int x) { + return /*range inner=->+0:38*/1 + 2 * 2; + } +// CHECK-INNER: 1 'inner' results: +// CHECK-INNER: static int extracted() { +// CHECK-INNER-NEXT: return 1 + 2 * 2;{{$}} +// CHECK-INNER-NEXT: }{{[[:space:]].*}} +// CHECK-INNER-NEXT: class AClass { + +// CHECK-OUTER: 1 'inner' results: +// CHECK-OUTER: static int extracted() { +// CHECK-OUTER-NEXT: return 1 + 2 * 2;{{$}} +// CHECK-OUTER-NEXT: }{{[[:space:]].*}} +// CHECK-OUTER-NEXT: class OuterClass { + + int otherMethod(int x); +}; + +#ifdef MULTIPLE +}; +#endif + +int PREFIX AClass::otherMethod(int x) { + return /*range outofline=->+0:46*/2 * 2 - 1; +} +// CHECK: 1 'outofline' results: +// CHECK: static int extracted() { +// CHECK-NEXT: return 2 * 2 - 1;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: int PREFIX AClass::otherMethod diff --git a/test/Refactor/Extract/ObjCProperty.m b/test/Refactor/Extract/ObjCProperty.m new file mode 100644 index 000000000000..152ccb348421 --- /dev/null +++ b/test/Refactor/Extract/ObjCProperty.m @@ -0,0 +1,41 @@ +// RUN: clang-refactor extract -selection=test:%s %s -- 2>&1 | grep -v CHECK | FileCheck %s + +@interface HasProperty + +@property (strong) HasProperty *item; + +- (HasProperty *)implicitProp; + +- (void)setImplicitSetter:(HasProperty *)value; + +@end + +@implementation HasProperty + +- (void)allowGetterExtraction { + /*range allow_getter=->+0:42*/self.item; + /*range allow_imp_getter=->+0:54*/self.implicitProp; +} +// CHECK: 1 'allow_getter' results: +// CHECK: extracted() { +// CHECK-NEXT: return self.item;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: - (void)allowGetterExtraction { +// CHECK-NEXT: extracted(); + +// CHECK: 1 'allow_imp_getter' results: +// CHECK: extracted() { +// CHECK-NEXT: return self.implicitProp;{{$}} +// CHECK-NEXT: }{{[[:space:]].*}} +// CHECK-NEXT: - (void)allowGetterExtraction { +// CHECK-NEXT: self.item; +// CHECK-NEXT: extracted(); + +- (void)prohibitSetterExtraction { + /*range prohibit_setter=->+0:45*/self.item = 0; + /*range prohibit_setter=->+0:55*/self.implicitSetter = 0; +} +// CHECK: 2 'prohibit_setter' results: +// CHECK: the selected expression can't be extracted + +@end |