sammccall added inline comments.

================
Comment at: clang-tools-extra/clangd/Protocol.cpp:383
+
+llvm::json::Value toJSON(const WorkDoneProgressBegin &P) {
+  llvm::json::Object Result{
----------------
kadircet wrote:
> why not  have a single struct with that has a required `kind` field and a 
> bunch of optional fields.
> Later on we can assert on the existence of fields depending on the kind, I 
> think it would simplify the implementation.
Yeah, this was my first thought/attempt. It's possible but I think not ideal in 
the end.

The main downsides:
 - this would diverge from LSP and so make it harder to cross-reference things
 - this would diverge from LSP and usually we don't, so it's surprising
 - the semantics of the "same" field across different events are sometimes 
subtly different. e.g. Begin.cancellable is whether a cancel button is shown 
(and in VSCode, the overall UI!) whereas End.cancellable controls its 
enablement.
 - between replicating the LSP docs, documenting divergence, documenting varied 
optionality, and documenting varying semantics, the merged struct is really 
hard to document well
 - it's a bit harder to see the structure of the messages clangd sends this 
way: e.g. we always send message in report, but never in begin/end, how we 
handle percentage etc

Mostly I think following LSP closely is a good thing, but it sucks when the 
spec is a mess :-(


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D73218



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

Reply via email to