aboutsummaryrefslogtreecommitdiff
path: root/clang-tidy/tool/ClangTidyMain.cpp
diff options
context:
space:
mode:
authorAlexander Kornienko <alexfh@google.com>2014-09-26 11:42:29 +0000
committerAlexander Kornienko <alexfh@google.com>2014-09-26 11:42:29 +0000
commit63013fd608c527ad6310310a578f4b3cbfcbde41 (patch)
treecacc10f839220e3c6226f21a7775a24af5f76175 /clang-tidy/tool/ClangTidyMain.cpp
parentba3eff09de1ac5df82bb56889047f51f2cd44ecb (diff)
[clang-tidy] Add a -config={YAML} option.
Summary: Add -config option to allow specifying configuration in YAML/JSON format on the command line. Reviewers: klimek Reviewed By: klimek Subscribers: curdeius, cfe-commits Differential Revision: http://reviews.llvm.org/D5501 git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@218511 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'clang-tidy/tool/ClangTidyMain.cpp')
-rw-r--r--clang-tidy/tool/ClangTidyMain.cpp41
1 files changed, 35 insertions, 6 deletions
diff --git a/clang-tidy/tool/ClangTidyMain.cpp b/clang-tidy/tool/ClangTidyMain.cpp
index a9b29f68..a69ba178 100644
--- a/clang-tidy/tool/ClangTidyMain.cpp
+++ b/clang-tidy/tool/ClangTidyMain.cpp
@@ -84,6 +84,15 @@ ListChecks("list-checks",
"-checks='*' to list all available checks."),
cl::init(false), cl::cat(ClangTidyCategory));
+static cl::opt<std::string> Config(
+ "config",
+ cl::desc("Specifies a configuration in YAML/JSON format:\n"
+ " -config=\"{Checks: '*', CheckOptions: {key: x, value: y}}\"\n"
+ "When the value is empty, clang-tidy will attempt to find\n"
+ "a file named .clang-tidy for each sorce file in its parent\n"
+ "directories."),
+ cl::init(""), cl::cat(ClangTidyCategory));
+
static cl::opt<bool>
DumpConfig("dump-config",
cl::desc("Dumps configuration in the YAML format to stdout."),
@@ -134,14 +143,12 @@ static void printStats(const ClangTidyStats &Stats) {
}
}
-int clangTidyMain(int argc, const char **argv) {
- CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory);
-
+std::unique_ptr<ClangTidyOptionsProvider> createOptionsProvider() {
ClangTidyGlobalOptions GlobalOptions;
if (std::error_code Err = parseLineFilter(LineFilter, GlobalOptions)) {
llvm::errs() << "Invalid LineFilter: " << Err.message() << "\n\nUsage:\n";
llvm::cl::PrintHelpMessage(/*Hidden=*/false, /*Categorized=*/true);
- return 1;
+ return nullptr;
}
ClangTidyOptions DefaultOptions;
@@ -161,8 +168,30 @@ int clangTidyMain(int argc, const char **argv) {
if (AnalyzeTemporaryDtors.getNumOccurrences() > 0)
OverrideOptions.AnalyzeTemporaryDtors = AnalyzeTemporaryDtors;
- auto OptionsProvider = llvm::make_unique<FileOptionsProvider>(
- GlobalOptions, DefaultOptions, OverrideOptions);
+ if (!Config.empty()) {
+ if (llvm::ErrorOr<ClangTidyOptions> ParsedConfig =
+ parseConfiguration(Config)) {
+ return llvm::make_unique<DefaultOptionsProvider>(
+ GlobalOptions, ClangTidyOptions::getDefaults()
+ .mergeWith(DefaultOptions)
+ .mergeWith(*ParsedConfig)
+ .mergeWith(OverrideOptions));
+ } else {
+ llvm::errs() << "Error: invalid configuration specified.\n"
+ << ParsedConfig.getError().message() << "\n";
+ return nullptr;
+ }
+ }
+ return llvm::make_unique<FileOptionsProvider>(GlobalOptions, DefaultOptions,
+ OverrideOptions);
+}
+
+int clangTidyMain(int argc, const char **argv) {
+ CommonOptionsParser OptionsParser(argc, argv, ClangTidyCategory);
+
+ auto OptionsProvider = createOptionsProvider();
+ if (!OptionsProvider)
+ return 1;
std::string FileName = OptionsParser.getSourcePathList().front();
ClangTidyOptions EffectiveOptions = OptionsProvider->getOptions(FileName);