Author: alexfh Date: Fri Sep 26 06:42:29 2014 New Revision: 218511 URL: http://llvm.org/viewvc/llvm-project?rev=218511&view=rev Log: [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 Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Modified: clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp?rev=218511&r1=218510&r2=218511&view=diff ============================================================================== --- clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp (original) +++ clang-tools-extra/trunk/clang-tidy/tool/ClangTidyMain.cpp Fri Sep 26 06:42:29 2014 @@ -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 ClangTidySt } } -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 * 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); _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
