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

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 20 02:26:03 PDT 2021


sammccall accepted this revision.
sammccall added a comment.
This revision is now accepted and ready to land.

Remainder is just nits, looks good!



================
Comment at: clang-tools-extra/clangd/FS.cpp:126
+  // safely assume to exist is "/".
+  return "/";
+#endif
----------------
"/virtual/"


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:79
+  // FIXME: add flags more language variants
+  if (LibraryVariant == StandardLibrarVariant::CXX14) {
+    Inputs.CompileCommand.CommandLine.push_back("-xc++-header");
----------------
nit: the unhandled case can't dynamically happen. This should probably be a switch, and the `default:` case should be llvm_unreachable("Unhandled language variant")


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:104
+  if (!Clang) {
+    elog("tandard Library Index: Couldn't build compiler instance");
+    return nullptr;
----------------
tandard -> Standard


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:117
+  if (!Action->BeginSourceFile(*Clang, Input)) {
+    elog("Standard Library Index:BeginSourceFile() failed");
+    return nullptr;
----------------
missing space after colon


================
Comment at: clang-tools-extra/clangd/index/StdLib.cpp:122
+  if (llvm::Error Err = Action->Execute()) {
+    elog(toString(std::move(Err)).c_str());
+    return nullptr;
----------------
elog("Standard Library Index: {0}", std::move(Err));


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:34
+// 14, 17) of the standard library.
+// FIXME: add heuristic to detect this version somehow (magically).
+enum class StandardLibrarVariant { CXX14 = 0 };
----------------
The somehow/magically is by looking at the clang::LangOptions of the file being parsed :-)
This can happen if/when we move the triggering into TUScheduler which obtains and parses the command line flags.

Concretely I'd expect to resolve this FIXME by adding some function like `Optional<StandardLibraryVariant> chooseStandardLibrary(const LangOptions&)`

If this makes sense to you, you might want to make the comment a bit less hand-wavy


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:35
+// FIXME: add heuristic to detect this version somehow (magically).
+enum class StandardLibrarVariant { CXX14 = 0 };
+
----------------
librarVariant ->libraryVariant


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:38
+/// Generate a index of the standard library index for a given variant of
+/// the standard library. This index can be included if the translation unit
+/// does not (yet) contain any standard library headers.
----------------
I'd say rather "this index allows completion of standard library symbols whose headers have not been included yet".

The current text implies that we'd turn this off once we see `#include <vector>`, thus breaking completion of e.g `unordered_map`. I don't think we want to.


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:40
+/// does not (yet) contain any standard library headers.
+std::unique_ptr<SymbolIndex> indexStandardLibrary(const ThreadsafeFS &TFS);
+
----------------
Sorry, I think I wasn't clear: the language variant should still be a parameter here, it just shouldn't have a default value. Instead the caller should pass it explicitly, this makes it obvious at the callsite that there's an imperfect assumption being made.


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:45
+std::unique_ptr<SymbolIndex>
+indexUmbrellaHeaders(llvm::StringRef HeaderSources, const ThreadsafeFS &TFS,
+                     const StandardLibrarVariant &LibraryVariant);
----------------
nit: umbrellaHeader singular. (The umbrella is the file mapped to HeaderSources, the headers it includes are not umbrella headers for our purposes)


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:46
+indexUmbrellaHeaders(llvm::StringRef HeaderSources, const ThreadsafeFS &TFS,
+                     const StandardLibrarVariant &LibraryVariant);
+
----------------
enums are passed by value, not const reference
(and below)


================
Comment at: clang-tools-extra/clangd/index/StdLib.h:48
+
+/// generate header containing #includes for all standard library headers
+llvm::StringRef
----------------
nit: capitalization


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