[PATCH] D95229: [clangd] Treat optional field type mismatches as soft failures

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Mon Jan 25 09:38:33 PST 2021


sammccall added a comment.

This is basically the reverse of D89128 <https://reviews.llvm.org/D89128> + D89131 <https://reviews.llvm.org/D89131>.

I'm not sure if I like it, but I might be biased :-)
It was put in place after I screwed up the type of a protocol message and we didn't detect it until someone reported that some setting wasn't respected in VSCode.
A log message would have made it easier to debug, and *may* have led to us catching it, unsure.

I'd probably lean toward fixing https://github.com/clangd/vscode-clangd/issues/134 where we *know* of bad clients, but not based on the possibility alone. WDYT?



================
Comment at: clang-tools-extra/clangd/Protocol.cpp:33
+template <typename T>
+bool mapOptionalOrLog(llvm::json::ObjectMapper &O, llvm::StringLiteral Prop,
+                      T &Out) {
----------------
I would call this tryMap for brevity


================
Comment at: clang-tools-extra/clangd/Protocol.cpp:36
+  if (!O.mapOptional(Prop, Out)) {
+    elog("Unexpected value for optional field '{0}', ignoring", Prop);
+    Out = T{}; // Default-initialize Out to ensure we don't have a
----------------
On the one hand, logging a message seems better than doing this silently.
On the other, if clients have this issue, these messages are likely to be frequent (at least every message) and not so helpful: unlike the current messages they don't include the context.


================
Comment at: clang-tools-extra/clangd/Protocol.cpp:37
+    elog("Unexpected value for optional field '{0}', ignoring", Prop);
+    Out = T{}; // Default-initialize Out to ensure we don't have a
+               // half-constructed object.
----------------
this isn't necessarily the *field* default though! e.g. if we had `KeepFingerAttachedToHand = true` then setting it to 1 would result in `false`.
I think this coincides for all the concrete callsites here. But i'm nervous we add a pattern that could bite us later.

We could do something weird like default-allocate a T and swap it if things succeed.


================
Comment at: clang-tools-extra/clangd/Protocol.cpp:40
+  }
+  return true;
+}
----------------
not sure if returning always-true for chaining is helpful or misleading...


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D95229



More information about the cfe-commits mailing list