[PATCH] D37150: [clangd] Command line arg to specify compile_commands.json path
Ilya Biryukov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Sep 6 06:31:08 PDT 2017
ilya-biryukov added a comment.
See my comments.
Could you also `clang-format` the code please?
================
Comment at: clangd/ClangdServer.cpp:150
bool RunSynchronously,
+ std::string CompileCommands,
llvm::Optional<StringRef> ResourceDir)
----------------
Could you pass `llvm::Optional<Path>` instead (`Path` is just a descriptive typedef that we use in place of `std::string`) and check for empty string in `main()`?
================
Comment at: clangd/GlobalCompilationDatabase.cpp:30
+static cl::opt<std::string> CompileCommands("compileCommands",
+ cl::desc("Start with absolute path to compile_commands.json"));
+}
----------------
ilya-biryukov wrote:
> A description is somewhat vague. What is the intention of this flag?
> - Always look for `compile_commands.json` only inside specified directory?
> - First look inside specified directory, then proceed as normal (i.e. looking at the parent paths of each source file)?
>
> It looks like the code also looks at the parent directories of `compile-commands`. Is that the original intention? Maybe consider making it look only inside the directory itself and not its parents?
How about chaning semantics of the flag to **only** look inside `"--compile-commands-dir"` and not its parent paths?
I think it makes the behavior much less surprising. The whole point of looking in parent paths is that typically `compile_commands.json` is put inside the project root.
The flag that you propose seems to have a different purpose of providing `clangd` with custom compilation flags.
================
Comment at: clangd/GlobalCompilationDatabase.cpp:14
#include "llvm/Support/Path.h"
+#include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/StringExtras.h"
----------------
There are definitely unneeded includes here. Remove most of them and leave only the required ones?
================
Comment at: clangd/GlobalCompilationDatabase.cpp:93
+ namespace path = llvm::sys::path;
+ if (llvm::sys::fs::exists(CompileCommands))
+ File = CompileCommands;
----------------
Let's simply lookup **only** inside `CompileCommandsDir` if it was set.
Otherwise, fallback into looking at `parent_path`s of the file.
================
Comment at: clangd/GlobalCompilationDatabase.h:38
getCompileCommands(PathRef File) = 0;
+ std::string CompileCommands;
----------------
`GlobalCompilationDatabase` is an interface class and is designed specifically to not contain any fields.
Could you please do the following?
- Move this field into `DirectoryBasedGlobalCompilationDatabase`.
- Make it private and initialize it in constructor.
================
Comment at: clangd/tool/ClangdMain.cpp:29
+static llvm::cl::opt<std::string>
+ CompileCommands("compile-commands-dir",
----------------
Could you use descriptive `Path` typedef instead of `std::string` here and in other places?
================
Comment at: clangd/tool/ClangdMain.cpp:30
+static llvm::cl::opt<std::string>
+ CompileCommands("compile-commands-dir",
+ llvm::cl::desc("Specify a path to look for compile_commands.json. If path is invalid, clangd will look in the current directory and parent paths of each source file."));
----------------
Maybe rename this (and other occurences) to `CompileCommandsDir`?
================
Comment at: clangd/tool/ClangdMain.cpp:43
+ namespace path = llvm::sys::path;
+ if (!llvm::sys::path::is_absolute(CompileCommands) || CompileCommands.empty())
+ Logs << "Path specified for compilation database must be absolute. Verifying current folder instead.";
----------------
- `CompileCommands` is empty by default, don't show the error message in that case.
- If value of `CompileCommands` is not absolute or the path does not exist, set `CompileCommands` to empty string after reporting an error.
================
Comment at: clangd/tool/ClangdMain.cpp:44
+ if (!llvm::sys::path::is_absolute(CompileCommands) || CompileCommands.empty())
+ Logs << "Path specified for compilation database must be absolute. Verifying current folder instead.";
+
----------------
Maybe rephrase the message a little bit, mentioning the name of the flag. Something like:
`"Value of --compile-commands-dir must be an absolute path. The argument will be ignored."`
https://reviews.llvm.org/D37150
More information about the cfe-commits
mailing list