[PATCH] D68245: [Clangd] ExtractFunction: Don't extract body of enclosing function.
Shaurya Gupta via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Oct 2 06:51:25 PDT 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rL373472: [Clangd] ExtractFunction: Don't extract body of enclosing function. (authored by SureYeaah, committed by ).
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
Changed prior to commit:
https://reviews.llvm.org/D68245?vs=222815&id=222823#toc
Repository:
rL LLVM
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D68245/new/
https://reviews.llvm.org/D68245
Files:
clang-tools-extra/trunk/clangd/refactor/tweaks/ExtractFunction.cpp
clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp
Index: clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp
+++ clang-tools-extra/trunk/clangd/unittests/TweakTests.cpp
@@ -632,6 +632,13 @@
// Shouldn't crash.
EXPECT_EQ(apply("void f([[int a]]);"), "unavailable");
+ // Don't extract if we select the entire function body (CompoundStmt).
+ std::string CompoundFailInput = R"cpp(
+ void f() [[{
+ int a;
+ }]]
+ )cpp";
+ EXPECT_EQ(apply(CompoundFailInput), "unavailable");
}
TEST_F(ExtractFunctionTest, ControlFlow) {
Index: clang-tools-extra/trunk/clangd/refactor/tweaks/ExtractFunction.cpp
===================================================================
--- clang-tools-extra/trunk/clangd/refactor/tweaks/ExtractFunction.cpp
+++ clang-tools-extra/trunk/clangd/refactor/tweaks/ExtractFunction.cpp
@@ -225,10 +225,24 @@
return toHalfOpenFileRange(SM, LangOpts, EnclosingFunction->getSourceRange());
}
+// returns true if Child can be a single RootStmt being extracted from
+// EnclosingFunc.
+bool validSingleChild(const Node *Child, const FunctionDecl *EnclosingFunc) {
+ // Don't extract expressions.
+ // FIXME: We should extract expressions that are "statements" i.e. not
+ // subexpressions
+ if (Child->ASTNode.get<Expr>())
+ return false;
+ // Extracting the body of EnclosingFunc would remove it's definition.
+ assert(EnclosingFunc->hasBody() &&
+ "We should always be extracting from a function body.");
+ if (Child->ASTNode.get<Stmt>() == EnclosingFunc->getBody())
+ return false;
+ return true;
+}
+
// FIXME: Check we're not extracting from the initializer/condition of a control
// flow structure.
-// FIXME: Check that we don't extract the compound statement of the
-// enclosingFunction.
llvm::Optional<ExtractionZone> findExtractionZone(const Node *CommonAnc,
const SourceManager &SM,
const LangOptions &LangOpts) {
@@ -236,15 +250,14 @@
ExtZone.Parent = getParentOfRootStmts(CommonAnc);
if (!ExtZone.Parent || ExtZone.Parent->Children.empty())
return llvm::None;
- // Don't extract expressions.
- // FIXME: We should extract expressions that are "statements" i.e. not
- // subexpressions
- if (ExtZone.Parent->Children.size() == 1 &&
- ExtZone.getLastRootStmt()->ASTNode.get<Expr>())
- return llvm::None;
ExtZone.EnclosingFunction = findEnclosingFunction(ExtZone.Parent);
if (!ExtZone.EnclosingFunction)
return llvm::None;
+ // When there is a single RootStmt, we must check if it's valid for
+ // extraction.
+ if (ExtZone.Parent->Children.size() == 1 &&
+ !validSingleChild(ExtZone.getLastRootStmt(), ExtZone.EnclosingFunction))
+ return llvm::None;
if (auto FuncRange =
computeEnclosingFuncRange(ExtZone.EnclosingFunction, SM, LangOpts))
ExtZone.EnclosingFuncRange = *FuncRange;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D68245.222823.patch
Type: text/x-patch
Size: 3009 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20191002/d553f434/attachment.bin>
More information about the llvm-commits
mailing list