[PATCH] D89277: [clangd] Add $/dumpMemoryTree LSP extension

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 16 02:28:23 PDT 2020


sammccall added a comment.

This looks really nice!



================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:615
             {"workspaceSymbolProvider", true},
             {"referencesProvider", true},
             {"executeCommandProvider",
----------------
can you add `{"memoryTreeProvider", true} // clangd extension`?

I'd like to add client support in VSCode and it's useful if the command is only visible with versions of clangd that support it.


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1389
 
+void ClangdLSPServer::onDumpMemoryTree(const NoParams &,
+                                       Callback<llvm::json::Value> Reply) {
----------------
Putting the serialization code inline is a tempting option here because it's (mostly) just a map.
It's not something we do often though, so it does bury the protocol details in an unexpected place.

A couple of alternatives to consider:
 - map to a `struct UsageTree { unsigned Self; unsigned Total; Map<string, UsageTree> Children; }` defined in protocol.h, and define marshalling in the usual way
 - skip the struct and use MemoryTree as the type, providing a toJSON(const MemoryTree&) function in protocol.h

I lean towards the last alternative because it provides a bit more regularity without adding much more redundancy, but this is up to you.


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1391
+                                       Callback<llvm::json::Value> Reply) {
+  llvm::BumpPtrAllocator Alloc;
+  MemoryTree MT(&Alloc);
----------------
nit: Alloc -> DetailAlloc


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.cpp:1458
   MsgHandler->bind("textDocument/semanticTokens/full/delta", &ClangdLSPServer::onSemanticTokensDelta);
+  MsgHandler->bind("$/dumpMemoryTree", &ClangdLSPServer::onDumpMemoryTree);
   if (Opts.FoldingRanges)
----------------
I think "dump" is a bit casual and also redundant - LSP methods to obtain information tend to have noun names. (executeCommand is the exception that proves the rule - it's used for side effects).

I went through the same question with the AST-dumping and landed on textDocument/ast as my preferred option, for what it's worth.


================
Comment at: clang-tools-extra/clangd/ClangdLSPServer.h:145
                              Callback<SemanticTokensOrDelta>);
+  /// This is a clangd extension. Provides a json tree representing memory usage
+  /// hierarchy. Keys starting with an underscore(_) represent leaves, e.g.
----------------
(if you decide to move toJSON to protocol.h, then the second sentence onward probably belongs there)


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D89277



More information about the cfe-commits mailing list