forked from OSchip/llvm-project
[clang-tidy] adding "--config-file=<file-path>" to specify custom config file.
Let clang-tidy to read config from specified file. Example: $ clang-tidy --config-file=/some/path/myTidyConfig --list-checks -- ...this will read config from '/some/path/myTidyConfig'. ClangTidyMain.cpp reads ConfigFile into string and then assigned read data to 'Config' i.e. makes like '--config' code flow internally. May speed-up tidy runtime since now it will just look-up <file-path> instead of searching ".clang-tidy" in parent-dir(s). Directly specifying config path helps setting build dependencies. Thanks to @DmitryPolukhin for valuable suggestion. This patch now propose change only in ClangTidyMain.cpp. Reviewed By: DmitryPolukhin Differential Revision: https://reviews.llvm.org/D89936
This commit is contained in:
parent
1c068a0103
commit
d6a468d622
|
@ -168,6 +168,16 @@ each source file in its parent directories.
|
|||
)"),
|
||||
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 @@ static std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider(
|
|||
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";
|
||||
return nullptr;
|
||||
};
|
||||
|
||||
if (ConfigFile.getNumOccurrences() > 0) {
|
||||
if (Config.getNumOccurrences() > 0) {
|
||||
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.getNumOccurrences() > 0)
|
||||
return LoadConfig(Config);
|
||||
|
||||
return std::make_unique<FileOptionsProvider>(GlobalOptions, DefaultOptions,
|
||||
OverrideOptions, std::move(FS));
|
||||
}
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
Checks: "-*,hicpp-uppercase-literal-suffix"
|
|
@ -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
|
Loading…
Reference in New Issue