
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
