[PATCH] D148783: [clangd] Add support TextDocumentEdit.

Kadir Cetinkaya via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Apr 20 03:54:52 PDT 2023


kadircet added a comment.

can you also have a version of the clang-tools-extra/clangd/test/fixits-command.test with `documentChanges` support? it's unlikely to have clients in that configuration but i believe the deserialization issue i mentioned above would be discoverable by such a test.



================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1722
                [&](clangd::Diagnostic Diag, llvm::ArrayRef<Fix> Fixes) {
+                 if (DiagOpts.EmbedFixesInDiagnostics && !Fixes.empty()) {
+                   Diag.codeActions.emplace();
----------------
hokein wrote:
> This part of code is moved from the `toLSPDiags`, we can keep it unchanged then we have to pass the `Version` and `SupportsDocumentChanges` to `toLSPDiags` which makes the API ugly. Open for ideas.
no i think it makes more sense in LSP layer, as it's an LSP extension. I believe we had it in the guts because i believe we were using it internally with a client that doesn't use LSPServer at some point.

it would be better to drop the extension but i see that qt-creator & sourcekit-lsp has mentions of this :/ so as I mentioned above, we can convert the fixes to CodeActions here unconditionally (it's not more expensive than the copy we perform today). afterwards we only make copying those CodeActions into the Diag conditioned on the capability.


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.h:201
   void bindMethods(LSPBinder &, const ClientCapabilities &Caps);
-  std::vector<Fix> getFixes(StringRef File, const clangd::Diagnostic &D);
+  std::pair<std::optional<int64_t>, std::vector<Fix>>
+  getFixes(StringRef File, const clangd::Diagnostic &D);
----------------
instead of a pair maybe a:
```
struct VersionedFixes {
  std::optional<int64_t> DocumentVersion;
  std::vector<Fix> Fixes;
};
```


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.h:236
   std::mutex FixItsMutex;
   typedef std::map<clangd::Diagnostic, std::vector<Fix>, LSPDiagnosticCompare>
       DiagnosticToReplacementMap;
----------------
can we instead have a:
```
std::map<clangd::Diagnostic, std::vector<CodeAction>, LSPDiagnosticCompare> Fixes;
```

We'll make sure we store code actions with necessary version information.
That way `FixItsMap` can stay the same, and rest of the code will look more uniform; we'll do the conversion from Fixes to CodeActions during `onDiagnosticsReady`


================
Comment at: clang-tools-extra/clangd/Diagnostics.cpp:426
 
-CodeAction toCodeAction(const Fix &F, const URIForFile &File) {
+CodeAction toCodeAction(const Fix &F, const URIForFile &File,
+                        const std::optional<int64_t> &Version,
----------------
we can now move this into clangdlsperver.cpp


================
Comment at: clang-tools-extra/clangd/Protocol.cpp:735
   llvm::json::ObjectMapper O(Params, P);
-  return O && O.map("changes", R.changes);
+  return O && O.map("changes", R.changes) && O.map("documentChanges", R.documentChanges);
 }
----------------
we actually want `O.mapOptional` for both "changes" and "documentChanges".


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D148783



More information about the cfe-commits mailing list