r317062 - [refactor][extract] code extracted from inline method should be placed
Alex Lorenz via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 31 18:12:56 PDT 2017
Author: arphaman
Date: Tue Oct 31 18:12:56 2017
New Revision: 317062
URL: http://llvm.org/viewvc/llvm-project?rev=317062&view=rev
Log:
[refactor][extract] code extracted from inline method should be placed
in a function defined before the outer class
Added:
cfe/trunk/test/Refactor/Extract/FromMethodToFunction.cpp
Modified:
cfe/trunk/lib/Tooling/Refactoring/Extract.cpp
Modified: cfe/trunk/lib/Tooling/Refactoring/Extract.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Tooling/Refactoring/Extract.cpp?rev=317062&r1=317061&r2=317062&view=diff
==============================================================================
--- cfe/trunk/lib/Tooling/Refactoring/Extract.cpp (original)
+++ cfe/trunk/lib/Tooling/Refactoring/Extract.cpp Tue Oct 31 18:12:56 2017
@@ -15,6 +15,7 @@
#include "clang/Tooling/Refactoring/Extract/Extract.h"
#include "clang/AST/ASTContext.h"
+#include "clang/AST/DeclCXX.h"
#include "clang/AST/Expr.h"
#include "clang/AST/ExprObjC.h"
#include "clang/Rewrite/Core/Rewriter.h"
@@ -44,8 +45,12 @@ bool isSimpleExpression(const Expr *E) {
}
SourceLocation computeFunctionExtractionLocation(const Decl *D) {
- // FIXME (Alex L): Method -> function extraction should place function before
- // C++ record if the method is defined inside the record.
+ if (isa<CXXMethodDecl>(D)) {
+ // Code from method that is defined in class body should be extracted to a
+ // function defined just before the class.
+ while (const auto *RD = dyn_cast<CXXRecordDecl>(D->getLexicalDeclContext()))
+ D = RD;
+ }
return D->getLocStart();
}
Added: cfe/trunk/test/Refactor/Extract/FromMethodToFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Refactor/Extract/FromMethodToFunction.cpp?rev=317062&view=auto
==============================================================================
--- cfe/trunk/test/Refactor/Extract/FromMethodToFunction.cpp (added)
+++ cfe/trunk/test/Refactor/Extract/FromMethodToFunction.cpp Tue Oct 31 18:12:56 2017
@@ -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
More information about the cfe-commits
mailing list