[PATCH] D105177: [clangd] Implemented indexing of standard library

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Aug 17 06:15:26 PDT 2021


sammccall added inline comments.


================
Comment at: clang-tools-extra/clangd/FS.h:77
 
+/// Get a virtual root node for the filesystem depending on the OS
+inline const llvm::StringLiteral virtualRoot() {
----------------
"node" doesn't mean anything here.


================
Comment at: clang-tools-extra/clangd/FS.h:79
+inline const llvm::StringLiteral virtualRoot() {
+#ifdef _WIN32
+  return "\\";
----------------
this should be defined out-of-line unless it's performance-critical for some reason.

Conditional compilation in inline bodies is a magnet for ODR violations. `_WIN32` is probably fine but no reason to scare the reader :-)


================
Comment at: clang-tools-extra/clangd/FS.h:80
+#ifdef _WIN32
+  return "\\";
+#else
----------------
This is a (drive-)relative path, we have various places we need absolute paths and may want to reuse this there. Does `C:\virtual` work?


================
Comment at: clang-tools-extra/clangd/FS.h:80
+#ifdef _WIN32
+  return "\\";
+#else
----------------
sammccall wrote:
> This is a (drive-)relative path, we have various places we need absolute paths and may want to reuse this there. Does `C:\virtual` work?
as mentioned this should ideally include some clue that it's a virtual path


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:40
+    const ThreadsafeFS &TFS, StandardLibraryVersion LibraryVersion)
+    : VirtualUmbrellaHeaderFileName(virtualRoot().str() + "UmbrellaHeader.hpp"),
+      TFS(TFS), LibraryVersion(LibraryVersion) {}
----------------
llvm::sys::path::append


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:40
+    const ThreadsafeFS &TFS, StandardLibraryVersion LibraryVersion)
+    : VirtualUmbrellaHeaderFileName(virtualRoot().str() + "UmbrellaHeader.hpp"),
+      TFS(TFS), LibraryVersion(LibraryVersion) {}
----------------
sammccall wrote:
> llvm::sys::path::append
don't use .hpp and rely on the driver picking the right language & version, this won't generalize. Instead, insert the flags "-xc++-header" and "-std=c++14" based on the StandardLibraryVersion


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:48
+  // bild the string only once and cache the results in `*Once`.
+  static std::string Once = [] {
+    std::vector<llvm::StringLiteral> Headers;
----------------
the static variable must be a `string*` rather than `string` to avoid global destructors.


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:72
+  Inputs.TFS = &TFS;
+  // TODO: can we get a real compile command from somewhere?
+  Inputs.CompileCommand.Directory = virtualRoot().str();
----------------
I'm not sure what this means, I don't think there's anything better to do here.


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:86
+      HeaderSources, VirtualUmbrellaHeaderFileName,
+      /*RequiresNullTerminator=*/false);
+  assert(Buffer && Buffer->getBufferSize() > 0);
----------------
why false? the default (true) is what clang's parser needs


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:97
+
+  // we only care about the symbols, so not storing the other attributes
+  auto Action = createStaticIndexingAction(
----------------
pass the default nullptr instead of a no-op lambda, it allows the indexer to skip work


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:110
+
+  assert(IndexSlabs.Symbols && "Symbols must be set.");
+
----------------
this assertion message doesn't say anything vs the assertion itself, either drop it or say why instead


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:34
+// FIXME: add feature to detect this version somehow (magically).
+enum StandardLibraryVersion { cxx14 = 0 };
+
----------------
nit: enum class to avoid polluting namespace.

llvm style capitalizes variables: `CXX14`


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:34
+// FIXME: add feature to detect this version somehow (magically).
+enum StandardLibraryVersion { cxx14 = 0 };
+
----------------
sammccall wrote:
> nit: enum class to avoid polluting namespace.
> 
> llvm style capitalizes variables: `CXX14`
nit: "variant" rather than version to avoid confusion with language version?
(since this will cover c also)


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:36
+
+// external interface for getting a standard library index.
+Expected<std::unique_ptr<SymbolIndex>>
----------------
The comment should be aimed at users of this module, not implementers of it :-)
This is the main API comment...


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:37
+// external interface for getting a standard library index.
+Expected<std::unique_ptr<SymbolIndex>>
+indexStandardLibrary(const ThreadsafeFS &TFS,
----------------
I think I agree with your comment elsewhere that it's sufficient to return unique_ptr, indicate it might be null, and log errors.


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:39
+indexStandardLibrary(const ThreadsafeFS &TFS,
+                     const StandardLibraryVersion LibraryVersion =
+                         StandardLibraryVersion::cxx14);
----------------
if introducing the enum i'd remove the default, this policy is best expressed at the call site


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:42
+
+class StandardLibraryIndex {
+  // Implementation for generating the index.
----------------
This class doesn't need to be public and I don't think it needs to exist.

generateIncludeHeader is a pure function of StandardLibraryVersion, it can be a free function.

This leaves only indexHeaders, which can also be a free function of StandardLibraryVersion and TFS.
(VirtualUmbrellaHeaderFileName is purely transient state, and isn't used by any tests)


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:60
+  /* generate header containing #includes for all standard library headers */
+  llvm::StringRef generateIncludeHeader();
+
----------------
as mentioned, umbrella header


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:64
+  llvm::IntrusiveRefCntPtr<llvm::vfs::InMemoryFileSystem>
+  buildFilesystem(std::string HeaderSources);
+};
----------------
this is gone


Repository:
  rG LLVM Github Monorepo

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

https://reviews.llvm.org/D105177



More information about the cfe-commits mailing list