[PATCH] D89936: [clang-tidy] adding "--config-file=<file-path>" to specify custom config file.
Hiral via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Oct 30 03:05:23 PDT 2020
Hiralo updated this revision to Diff 301845.
Hiralo added a comment.
clang-tidy: adding "--config-file=<file-path>" to specify custom config file.
Let clang-tidy to read config from specified file.
This option internally works exactly the same way as --config option
after reading specified config file.
This option works as helper for --config in following few cases:
- when there is shell limitation to read file content to the command line,
- when there is limitation to command line length,
- setting right build dependencies, and
- others
--config-file and --config options are made mutually exclusive.
Example usage:
$ clang-tidy --config-file=/some/path/myTidyConfigFile --dump-config --
...this will read config from /some/path/myTidyConfigFile and
avoid searching '.clang-tidy' in parent-dirs.
May speed-up tidy runtime since now it will just look-up <file-path>
instead of searching ".clang-tidy" in parent-dirs.
Reviewed By: DmitryPolukhin, njames93
Differential Revision: https://reviews.llvm.org/D89936
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D89936/new/
https://reviews.llvm.org/D89936
Files:
clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-file/config-file
clang-tools-extra/test/clang-tidy/infrastructure/config-file.cpp
Index: clang-tools-extra/test/clang-tidy/infrastructure/config-file.cpp
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/config-file.cpp
@@ -0,0 +1,2 @@
+// RUN: clang-tidy -config-file=%S/Inputs/config-file/config-file -dump-config -- | FileCheck %s -check-prefix=CHECK-BASE
+// CHECK-BASE: Checks: {{.*}}hicpp-uppercase-literal-suffix
Index: clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-file/config-file
===================================================================
--- /dev/null
+++ clang-tools-extra/test/clang-tidy/infrastructure/Inputs/config-file/config-file
@@ -0,0 +1 @@
+Checks: "-*,hicpp-uppercase-literal-suffix"
Index: clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
===================================================================
--- clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
+++ clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
@@ -168,6 +168,16 @@
)"),
cl::init(""), cl::cat(ClangTidyCategory));
+static cl::opt<std::string> ConfigFile("config-file", cl::desc(R"(
+Specify the path of .clang-tidy or custom config file:
+ e.g. --config-file=/some/path/myTidyConfigFile
+This option internally works exactly the same way as
+ --config option after reading specified config file.
+Use either --config-file or --config, not both.
+)"),
+ cl::init(""),
+ cl::cat(ClangTidyCategory));
+
static cl::opt<bool> DumpConfig("dump-config", cl::desc(R"(
Dumps configuration in the YAML format to
stdout. This option can be used along with a
@@ -302,19 +312,41 @@
if (UseColor.getNumOccurrences() > 0)
OverrideOptions.UseColor = UseColor;
- if (!Config.empty()) {
- if (llvm::ErrorOr<ClangTidyOptions> ParsedConfig =
- parseConfiguration(Config)) {
+ auto LoadConfig = [&](StringRef Configuration)
+ -> std::unique_ptr<ClangTidyOptionsProvider> {
+ llvm::ErrorOr<ClangTidyOptions> ParsedConfig =
+ parseConfiguration(Configuration);
+ if (ParsedConfig)
return std::make_unique<ConfigOptionsProvider>(
GlobalOptions,
ClangTidyOptions::getDefaults().mergeWith(DefaultOptions, 0),
*ParsedConfig, OverrideOptions, std::move(FS));
- } else {
- llvm::errs() << "Error: invalid configuration specified.\n"
- << ParsedConfig.getError().message() << "\n";
+ llvm::errs() << "Error: invalid configuration specified.\n"
+ << ParsedConfig.getError().message() << "\n";
+ return nullptr;
+ };
+
+ if (!ConfigFile.empty()) {
+ if (!Config.empty()) {
+ llvm::errs() << "Error: --config-file and --config are "
+ "mutually exclusive. Specify only one.\n";
return nullptr;
}
+
+ llvm::ErrorOr<std::unique_ptr<llvm::MemoryBuffer>> Text =
+ llvm::MemoryBuffer::getFile(ConfigFile.c_str());
+ if (std::error_code EC = Text.getError()) {
+ llvm::errs() << "Error: can't read config-file '" << ConfigFile
+ << "': " << EC.message() << "\n";
+ return nullptr;
+ }
+
+ return LoadConfig((*Text)->getBuffer());
}
+
+ if (!Config.empty())
+ return LoadConfig(Config);
+
return std::make_unique<FileOptionsProvider>(GlobalOptions, DefaultOptions,
OverrideOptions, std::move(FS));
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D89936.301845.patch
Type: text/x-patch
Size: 3489 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20201030/9642f03b/attachment.bin>
More information about the cfe-commits
mailing list