[PATCH] D69263: [clangd] Implement cross-file rename.
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Nov 6 05:23:44 PST 2019
ilya-biryukov added a comment.
Thanks, this is in a good shape!
The only concern I have is the racy way to get dirty buffers, please see the corresponding comment.
================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:764
+ /*WantFormat=*/true,
+ [this](PathRef File) { return DraftMgr.getDraft(File); },
+ [File, Params, Reply = std::move(Reply),
----------------
We should probably get a snapshot of all dirty buffers here instead.
A racy way (rename is run on a separate thread, new files updates might come in in the meantime) to get contents of the file looks like a bad idea, this will lead to hard-to-debug failures...
Note that `ClangdServer` also has access to all contents of all the files, they are stored in `TUScheduler`, so we don't need to pass `GetDirtyBuffer` callback up until the final run of `rename`
================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:317
+ if (!Range)
+ // Return null if the "rename" is not valid at the position.
+ return CB(llvm::None);
----------------
NIT: comment could be shortened to
```
/// "rename" is not valid at the position.
```
Or even removed.
Both would allow saving a line (if we put the comment on the same line as `return`
================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:320
+ if (CrossFileRename)
+ return CB(*Range); // FIXME: assueme cross-file rename always succeeds.
+
----------------
NIT: s/assueme/assume
also, in FIXME we normally give the final state, so it should probably be
```
/// FIXME: do not assume cross-file rename always succeeds
```
================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:340
void ClangdServer::rename(PathRef File, Position Pos, llvm::StringRef NewName,
- bool WantFormat, Callback<std::vector<TextEdit>> CB) {
+ bool WantFormat, DirtyBufferGetter GetDirtyBuffer,
+ Callback<FileEdits> CB) {
----------------
`ClangdServer` can obtain the dirty buffers via `TUScheduler::getContents`
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D69263/new/
https://reviews.llvm.org/D69263
More information about the cfe-commits
mailing list