sammccall accepted this revision.
sammccall added inline comments.
This revision is now accepted and ready to land.


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:393
         }}}};
+  if (Params.capabilities.RenamePrepareSupport)
+    Result["renameProvider"] = llvm::json::Object{{"prepareProvider", true}};
----------------
hokein wrote:
> sammccall wrote:
> > why set this only if the client advertised support?
> The LSP says
> ```     
>  /**
>        * The server provides rename support. RenameOptions may only be
>        * specified if the client states that it supports
>        * `prepareSupport` in its initial `initialize` request.
>        */
>       renameProvider?: boolean | RenameOptions;
> ```
> 
> so we only send `RenameOptions` when the client declares it supports 
> prepareRename.
Ah, OK. this should be documented.

Could we put this logic above instead, for less data structure wrangling?
```
llvm::json::Value RenameProvider = llvm::json::Object{{"prepareProvider", 
true}};
if (!Params.capabilities.RenamePrepareSupport) // Only boolean allowed per LSP
  RenameProvider = true;
...
{"renameProvider", std::move(RenameProvider)}
```



================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:581
+      Params.textDocument.uri.file(), Params.position,
+      Bind(
+          [](decltype(Reply) Reply, llvm::Expected<llvm::Optional<Range>> R) {
----------------
this appears to be the same as just passing std::move(Reply) to preparerename


================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:298
+    if (!Changes) {
+      // LSP clients may emit a hard-coded error message (e.g. "can't be
+      // renamed" in VSCode) if we returns null, we use the interl error 
message
----------------
There's some context missing here - you're explaining *why* we're going against 
LSP, but you haven't explained that we're doing so!

"LSP says to return null on failure, but that will result in a generic failure 
message. If we send an LSP error response, clients can surface the message to 
users (VSCode does)"

("will" not "may", because there's no way it can result in a detailed message)


================
Comment at: clang-tools-extra/clangd/ClangdServer.cpp:296
+    // Return null if the "rename" is not valid at the position.
+    auto Changes = renameWithinFile(AST, File, Pos, "dummy", Index);
+    if (!Changes) {
----------------
sammccall wrote:
> High level comment indicating why we use rename to implement preparerename?
> (i.e. why isn't it too expensive)
can you say something like "Performing the rename isn't substantially more 
expensive than an AST-based check, so we just rename and throw away the 
results. We may have to revisit this when we support cross-file rename"


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D63126



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

Reply via email to