sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.

I think we should go ahead and land this. The only points that I'd really like 
to see fixed is `shared_ptr`, mostly because it's a strong signal there's 
something complicated going on and I don't think (or hope) there is!



================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:326
+std::string spellType(QualType TypeInfo) {
+  return TypeInfo.getUnqualifiedType().getNonReferenceType().getAsString();
+};
----------------
sammccall wrote:
> use `printType` from AST.h?
> 
> (You'll want to drop qualifiers/refs before calling that, but it's not at all 
> obvious from the function name here that they're dropped, so that should be 
> at the callsite anyway)
Second half is not done: the suggestion is that it's really confusing where 
spellType is called that it drops qualifiers, so just I'd inline this into the 
callsite.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:332
+  if (WithTypeAndQualifiers) {
+    if (IsConst)
+      Result += "const ";
----------------
SureYeaah wrote:
> kadircet wrote:
> > why don't we infer this const from QualType ?
> In a future patch we will want to use heuristics like has the variable been 
> assigned, was it passed as a non-const reference, was its address taken, etc. 
I think the point is that the QualType in parameter could/should represent the 
*parameter* type, not the type of the variable being captured.
e.g. it could be  `const std::string&` even if the original variable was just 
`std::string`.

This seems the more natural model (the struct is called Parameter, not 
CapturedVariable or Argument) but there may be reasons not to do this.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:547
+private:
+  std::shared_ptr<ExtractionZone> ExtZone;
+};
----------------
SureYeaah wrote:
> kadircet wrote:
> > why do you need a shared_ptr here?
> getExtractionZone creates an Optional<ExtractionZone> which needs to persist 
> from prepare to apply. Is there a better way to store a reference to the 
> ExtractionZone instance inside ExtractFunction?
shared ownership is less common and harder to reason about than exclusive 
ownership

Generally we prefer deciding where ownership should reside (T or Optional<T> or 
unique_ptr<T>), and where you should have an unowned reference (T& or T*).

In this case, findExtractionZone() should ideally return 
`Optional<ExtractionZone>`, after prepare() the ExtractFunction class should 
own it (as a Optional<ExtractionZone>), and apply should pass it around as a 
const ExtractionZone&.

If it turns out ExtractionZone isn't a movable type, then 
`Optional<ExtractionZone>` won't work and you'll need 
`unique_ptr<ExtractionZone>` instead. But shared_ptr shouldn't be needed 
regardless.


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:119
+  case SelectionTree::Selection::Partial:
+    // Treat Partially selected VarDecl as completely selected since
+    // SelectionTree doesn't always select VarDecls correctly.
----------------
D66872 has the fix if you'd rather avoid these workarounds


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:146
+  SourceRange EnclosingFuncRange;
+  std::set<const Stmt *> RootStmts;
+  SourceLocation getInsertionPoint() const {
----------------
llvm::DenseSet<const Stmt*>

std::set is a pretty terrible data structure unless you really really need 
order.
(Lots of allocations, lots of pointer-chasing)


================
Comment at: clang-tools-extra/clangd/refactor/tweaks/ExtractFunction.cpp:238
+  // Convert RootStmt Nodes to Stmts and insert in RootStmts.
+  llvm::transform(ExtZone->Parent->Children,
+                  std::inserter(ExtZone->RootStmts, 
ExtZone->RootStmts.begin()),
----------------
this is also:
```
for (const SelectionTree::Node *N)
  ExtZone->RootStmts.insert(N->ASTNode.get<Stmt>());
```
which is shorter and (I think) less obfuscated


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D65526



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to