hokein added a comment.

In D69263#1718525 <https://reviews.llvm.org/D69263#1718525>, @ilya-biryukov 
wrote:

> In D69263#1717985 <https://reviews.llvm.org/D69263#1717985>, @hokein wrote:
>
> > Thinking more about this -- we have a dynamic index (for all opened files) 
> > which is overlaid on a static index (which is a background index in 
> > open-source world), so for all affected files, they are either in
> >
> > 1. an open state -- we can rely on the dynamic index, I think it is safe to 
> > assume that index always returns up-to-date results;
>
>
> Not sure that holds. What if the file in question is being rebuilt right now? 
> We do not wait until all ASTs are built (and the dynamic index gets the new 
> results).


I'm not sure this would happen quite often in practice (probably depends on 
users' behavior). but yes, patching ranges would mitigate this issue.

> Open files actually pose an interesting problem: their contents do not 
> correspond to the file contents on disk.
>  We should choose which of those we update on rename: dirty buffers or file 
> contents? (I believe we should do dirty buffers, but I believe @sammccall has 
> the opposite opinion, so we should sync on this)

I have the same feeling of using dirty buffers for open files, let's discuss 
offline.

>> 2. a non-open state -- rely on the background index, however background 
>> index has more chance to be stale (especially we don't detect file-change 
>> events at the moment), we could do a range patch heuristically to mitigate 
>> this stale issue. Failing that, we surface the error to users.
> 
> To summarize, I think files can be stale in both cases and we should patch 
> the ranges in both cases.





================
Comment at: clang-tools-extra/clangd/index/SymbolCollector.cpp:268
-  // decide to implement renaming with index support.
-  if ((Roles & static_cast<unsigned>(index::SymbolRole::NameReference)))
-    return true;
----------------
ilya-biryukov wrote:
> Not sure what was filtered out here.
> I suggest moving this to a separate change, with unit-tests clearly 
> describing the new symbols we do not filter out anymore and an explanation 
> why it's necessary.
> 
> WDYT?
Agreed. split it out.


================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:119
 
+llvm::Optional<ReasonToReject>
+renameableOutsideFile(const NamedDecl &RenameDecl, const SymbolIndex *Index) {
----------------
ilya-biryukov wrote:
> So `llvm::None` means we do not reject?
> Probably worth documenting that.
> 
> Maybe even add an enumerator `ReasonToReject::Accept`, indicating the symbol 
> should be accepted and get rid of `Optional` altogether.
> 
> Otherwise this leads to code like:
> ```
> auto R = renameableOutsideFile(N, I);
> if (!R) { // negative condition.
>  return doRename(N, I); // But we're running the rename anyway... WAT?
> }
> ``
yeah, returning `None` means that we accept the rename.

Adding `Accept` is not aligning with the mental model, `Accept` doesn't belong 
to `ReasonToReject` I think. I agree the above given code is misleading, but 
looking at the current code in this file, it doesn't seem too bad, I think?

```
 if (auto Reject = renameableOutsideFile(*RenameDecl, RInputs.Index))
    return makeError(*Reject);
```


================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:121
+renameableOutsideFile(const NamedDecl &RenameDecl, const SymbolIndex *Index) {
+  if (RenameDecl.getParentFunctionOrMethod())
+    return None; // function-local symbols
----------------
ilya-biryukov wrote:
> This function resembles `renamableWithinFile`.
> We should probably share implementation and pass an extra flag. Something 
> like `isRenamable(..., bool IsCrossFile)`.
> 
> WDYT?
though they look similar,  the logic is quite different, for example, we query 
the index in within-file rename to detect a symbol is used outside of the file 
which is not needed for cross-file rename, and cross-file rename allows fewer 
symbols (as our index doesn't support them), so I don't think we can share a 
lot of implementation.


================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:317
+  std::string OldName = RenameDecl->getNameAsString();
+  for (const auto &FileAndOccurrences : AffectedFiles) {
+    llvm::StringRef FilePath = FileAndOccurrences.first();
----------------
ilya-biryukov wrote:
> I feel this code is fundamental to the trade-offs we made for rename.
> Could we move this to a separate function and add unit-tests for it?
> 
> You probably want to have something that handles just a single file rather 
> than all edits in all files, to avoid mocking VFS in tests, etc.
> 
> 
Agree, especially when we start implementing complicated stuff, e.g. range 
patching heuristics.

 Moved it out, but note that I don't plan to add more stuff in this initial 
patch, so the logic is pretty straightforward, just assembling rename 
replacement from occurrences.



================
Comment at: clang-tools-extra/clangd/refactor/Rename.cpp:380
+    auto MainFileRenameEdit =
+        renameWithinFile(AST, RenameDecl, RInputs.NewName);
+    if (!MainFileRenameEdit)
----------------
ilya-biryukov wrote:
> Can we rely on the fact that dynamic index should not be stale for the 
> current file instead?
> Or don't we have this invariant?
> 
> We end up having two implementations now: index-based and AST-based. It'd be 
> nice to have just one.
> If that's not possible in the first revision, could you explain why?
> 
> Note that moving the current-file rename to index-based implementation is 
> independent of doing cross-file renames. Maybe we should start with it?
I think we can't get rid of the AST-based rename -- mainly for renaming local 
symbols (e.g. local variable in function body), as we don't index these 
symbols...


================
Comment at: clang-tools-extra/clangd/refactor/Rename.h:32
+
+  bool AllowCrossFile = false; // true if enable cross-file rename
+};
----------------
ilya-biryukov wrote:
> ilya-biryukov wrote:
> > Have we considered post-filtering instead?
> > Or are we concerned with performance implications of openning too many 
> > files to compute the corrected edit ranges?
> > 
> > Probably worth documenting why we need it.
> NIT: the comment is redundant
Performance is one of the concern. I think the main purpose of this flag is to 
avoid any regressions in our existing within-file rename while developing the 
new cross-file rename.


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D69263



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

Reply via email to