blob: 84beaa87d6b8245992388997f10e82de4a6c6fd4 [file] [log] [blame]
void function(int x) {
int y = x * x;
}
class InitiateMethodExtraction {
public:
InitiateMethodExtraction() {
int x = constMethod(1);
}
// CHECK1: "void extracted() {\nint x = constMethod(1);\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted();" [[@LINE-3]]:5 -> [[@LINE-3]]:28
// CHECK2: "static void extracted(const InitiateMethodExtraction &object) {\nint x = object.constMethod(1);\n}\n\n"
// CHECK2-NEXT: "extracted(*this);"
;
~InitiateMethodExtraction() {
int x = constMethod(2);
}
// CHECK1: "void extracted() {\nint x = constMethod(2);\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted();" [[@LINE-3]]:5 -> [[@LINE-3]]:28
// CHECK2: "static void extracted(const InitiateMethodExtraction &object) {\nint x = object.constMethod(2);\n}\n\n"
// CHECK2-NEXT: "extracted(*this);"
;
void method() {
int x = constMethod(3);
}
// CHECK1: "void extracted() {\nint x = constMethod(3);\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted();" [[@LINE-3]]:5 -> [[@LINE-3]]:28
// CHECK2: "static void extracted(const InitiateMethodExtraction &object) {\nint x = object.constMethod(3);\n}\n\n"
// CHECK2-NEXT: "extracted(*this);"
;
int constMethod(int x) const {
return x + x * 2;
}
// CHECK1: "int extracted(int x) const {\nreturn x + x * 2;\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted(x);" [[@LINE-3]]:5 -> [[@LINE-3]]:22
// CHECK2: "static int extracted(int x) {\nreturn x + x * 2;\n}\n\n"
// CHECK2-NEXT: "extracted(x);"
;
int operator << (int x) {
return constMethod(x);
}
// CHECK1: "int extracted(int x) {\nreturn constMethod(x);\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted(x)" [[@LINE-3]]:12 -> [[@LINE-3]]:26
// CHECK2: "static int extracted(const InitiateMethodExtraction &object, int x) {\nreturn object.constMethod(x);\n}\n\n"
// CHECK2-NEXT: "extracted(*this, x)"
;
static void staticMethod(int x) {
int y = x * x;
}
// CHECK1: "static void extracted(int x) {\nint y = x * x;\n}\n\n" [[@LINE-3]]:3 -> [[@LINE-3]]:3
// CHECK1-NEXT: "extracted(x);" [[@LINE-3]]:5 -> [[@LINE-3]]:19
// CHECK2: "static void extracted(int x) {\nint y = x * x;\n}\n\n"
// CHECK2-NEXT: "extracted(x);"
;
void otherMethod();
};
void InitiateMethodExtraction::otherMethod() {
int x = constMethod(4);
}
// CHECK1: "void extracted();\n\n" [[@LINE-6]]:3 -> [[@LINE-6]]:3
// CHECK1-NEXT: "void InitiateMethodExtraction::extracted() {\nint x = constMethod(4);\n}\n\n" [[@LINE-4]]:1 -> [[@LINE-4]]:1
// CHECK1-NEXT: "extracted();" [[@LINE-4]]:3 -> [[@LINE-4]]:26
// CHECK2: "static void extracted(const InitiateMethodExtraction &object) {\nint x = object.constMethod(4);\n}\n\n"
// CHECK2-NEXT: "extracted(*this);"
// RUN: clang-refactor-test list-actions -at=%s:10:5 -selected=%s:10:5-10:27 %s | FileCheck --check-prefix=CHECK-METHOD %s
// CHECK-METHOD: Extract Function{{$}}
// CHECK-METHOD-NEXT: Extract Method{{$}}
// RUN: clang-refactor-test list-actions -at=%s:3:3 -selected=%s:3:3-3:16 %s | FileCheck --check-prefix=CHECK-FUNC %s
// CHECK-FUNC: Extract Function{{$}}
// CHECK-FUNC-NOT: Extract Method
// RUN: clang-refactor-test perform -action extract-method -selected=%s:10:5-10:27 -selected=%s:18:5-18:27 -selected=%s:26:5-26:27 -selected=%s:34:5-34:21 -selected=%s:42:12-42:26 -selected=%s:50:5-50:18 -selected=%s:61:3-61:25 %s | FileCheck --check-prefix=CHECK1 %s
// RUN: clang-refactor-test perform -action extract -selected=%s:10:5-10:27 -selected=%s:18:5-18:27 -selected=%s:26:5-26:27 -selected=%s:34:5-34:21 -selected=%s:42:12-42:26 -selected=%s:50:5-50:18 -selected=%s:61:3-61:25 %s | FileCheck --check-prefix=CHECK2 %s
namespace ns {
struct Outer {
struct Inner {
Inner(int x);
// comment
void method2(int x) const; // this stays!
int field;
};
};
}
ns::Outer::Inner::Inner(int x) {
int y = x + x;
}
// CHECK3: "void extracted(int x);\n\n" [[@LINE-11]]:7 -> [[@LINE-11]]:7
// CHECK3: "void ns::Outer::Inner::extracted(int x) {\nint y = x + x;\n}\n\n" [[@LINE-4]]:1 -> [[@LINE-4]]:1
// CHECK3: "extracted(x);" [[@LINE-4]]:3 -> [[@LINE-4]]:17
namespace ns {
// comment
void Outer::Inner::method2(int x) const {
if (x != 0)
int z = x * x;
else {
(void)x;
}
}
// CHECK3: "void extracted(int x) const;\n\n" [[@LINE-23]]:7 -> [[@LINE-23]]:7
// CHECK3: "void Outer::Inner::extracted(int x) const {\nif (x != 0)\n int z = x * x;\n else {\n (void)x;\n }\n}\n\n" [[@LINE-9]]:3 -> [[@LINE-9]]:3
// CHECK3: "extracted(x);" [[@LINE-8]]:5 -> [[@LINE-4]]:6
;
void Outer::Inner::methodNotDeclared(int x) {
int z = x * x;
}
}
// CHECK3: "\n\nvoid extracted(int x);\n" [[@LINE-30]]:48 -> [[@LINE-30]]:48
// CHECK3: "void Outer::Inner::extracted(int x) {\nint z = x * x;\n}\n\n" [[@LINE-5]]:3 -> [[@LINE-5]]:3
// CHECK3: "extracted(x);" [[@LINE-5]]:5 -> [[@LINE-5]]:19
struct Empty {
int field;
};
void Empty::method() {
field = 22;
}
// CHECK3: "void extracted();\n\n" [[@LINE-5]]:1 -> [[@LINE-5]]:1
// CHECK3: "void Empty::extracted() {\nfield = 22;\n}\n\n" [[@LINE-4]]:1 -> [[@LINE-4]]:1
// CHECK3: "extracted()" [[@LINE-4]]:3 -> [[@LINE-4]]:13
// RUN: clang-refactor-test perform -action extract-method -selected=%s:100:3-100:16 -selected=%s:110:5-114:4 -selected=%s:121:5-121:18 -selected=%s:133:3-133:13 %s | FileCheck --check-prefix=CHECK3 %s
template<typename T1, typename T2, int X>
struct TemplateExtraction {
void method(); // CHECK4: "void extracted();\n\n" [[@LINE]]:3 -> [[@LINE]]:3
};
template<typename T1, typename T2, int x> // CHECK4: "template <typename T1, typename T2, int x> \nvoid TemplateExtraction<T1, T2, x>::extracted() {\nint y = x;\n}\n\n" [[@LINE]]:1 -> [[@LINE]]:1
void TemplateExtraction<T1, T2, x>::method() {
// template-method-begin: +1:1
int y = x;
// template-method-end: +0:1
}
// RUN: clang-refactor-test perform -action extract-method -selected=template-method %s | FileCheck --check-prefix=CHECK4 %s