[PATCH] D40450: [clangd] Refactoring of GlobalCompilationDatabase
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon Nov 27 02:18:46 PST 2017
ilya-biryukov added inline comments.
================
Comment at: clangd/ClangdLSPServer.cpp:254
+ std::move(Primary), llvm::make_unique<FixedCompilationDatabase>(
+ ".", ArrayRef<std::string>{}));
+}
----------------
Clangd still changes working directory when running the parsing, so `"."` might end up being a different dir on multiple runs over the same file.
Maybe use file's parent for now?
================
Comment at: clangd/ClangdServer.cpp:178
+ // Create an owned version of CDB to use ArgumentsAdjustingCompilations.
+ struct OwnedCDB : public tooling::CompilationDatabase {
+ OwnedCDB(const tooling::CompilationDatabase &Ref) : Ref(Ref) {}
----------------
Maybe move this code out of `ClangdServer`? Arguably, it should be less confusing for clients of `ClangdServer` if they get exactly the compile commands returned by `CDB`.
This would also allow to get rid of `ResourceDir` parameter, which seems to be handled by `CompilationDatabase` now.
================
Comment at: clangd/ClangdServer.h:208
/// Various messages are logged using \p Logger.
- ClangdServer(GlobalCompilationDatabase &CDB,
+ ClangdServer(const tooling::CompilationDatabase &CDB,
DiagnosticsConsumer &DiagConsumer,
----------------
Are there any mutating methods in `CompilataionDatabase`? Why do we use `const &` instead of `&`?
================
Comment at: clangd/GlobalCompilationDatabase.cpp:57
+ for (auto &Cmd : Commands) {
+ assert(Cmd.CommandLine.size() >= 2 &&
+ "Expected at least the command and the filename");
----------------
IIRC, `Cmd` could come directly from `compile_commands.json`.
We should avoid crashing `clangd` if contents of `compile_commands.json` are invalid. Could we log the error instead and continue with other commands instead?
================
Comment at: clangd/GlobalCompilationDatabase.h:34
+ std::vector<tooling::CompileCommand>
+ getCompileCommands(PathRef File) const override;
----------------
It seems that this `const` means more trouble for implementations (i.e. using `mutable`, etc.) without providing any value.
Maybe we should consider removing it from the interface?
Am I missing the upsides of using `const` here?
================
Comment at: clangd/GlobalCompilationDatabase.h:61
+ llvm::StringMap<std::vector<std::string>> ExtraFlags;
+ std::unique_ptr<tooling::CompilationDatabase> Inner;
+};
----------------
Maybe we should consider using non-owning reference here?
It gives more flexibility, e.g. allowing to allocate on stack or store `CDB` directly inside the class fields, albeit it requires a bit more code to setup.
I'd say upsides of non-owning semantics outweigh a bit of added complexity
https://reviews.llvm.org/D40450
More information about the cfe-commits
mailing list