[PATCH] D64717: [Clangd] Fixed ExtractVariable for MemberExprs and Assignment Exprs

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Jul 18 00:55:34 PDT 2019


kadircet added inline comments.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp:195
   Intent intent() const override { return Refactor; }
+  // Compute the extraction context for the Selection
+  void computeExtractionContext(const SelectionTree::Node *N,
----------------
comment seems to be repeating the code, instead lets comment about the assumptions, like not working on declrefexpr's etc.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp:208
   const SelectionTree::Node *N = Inputs.ASTSelection.commonAncestor();
-  if (!N)
-    return false;
-  Target = llvm::make_unique<ExtractionContext>(N, SM, Ctx);
-  return Target->isExtractable();
+  computeExtractionContext(N, SM, Ctx);
+  return Target && Target->InsertionPoint;
----------------
maybe instead of checking internals like `Target` just make `computeExtractionContext` return an `llvm::Error` and check for success?


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp:228
+const SelectionTree::Node *
+getParentExprOfType(const SelectionTree::Node *Node) {
+  for (auto *ParNode = Node->Parent; ParNode && ParNode->ASTNode.get<Expr>();
----------------
I don't think traversing the tree without any conditions is a good idea, for example:

```
struct Foo {
int bar(int);
int z;
};

void foo() {
Foo f;
f.bar([[f.z]]);
}
```

above selection is on a memberexpr, that has a parent membercallexpr but it is actually not related to selection at all but I believe we'll extract the whole thing in that case.
I don't think that is the intended behavior, could you also add a test case for that?


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp:270
+  // look for the call expr parent if the selected expr is a MemberExpr
+  if (dyn_cast_or_null<clang::MemberExpr>(SelectedExpr)) {
+    TargetNode = getParentExprOfType<CXXMemberCallExpr>(N);
----------------
nit: braces


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractVariable.cpp:273
+  }
+  if (TargetNode && canBeAssigned(TargetNode))
+    Target = llvm::make_unique<ExtractionContext>(TargetNode, SM, Ctx);
----------------
nit: instead of checking success check failure and bail out?

```
if(!TargetNode || !canBeass...)
  return;
```


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D64717/new/

https://reviews.llvm.org/D64717





More information about the cfe-commits mailing list