Index: clang-tools-extra/clang-tidy/ClangTidyOptions.h =================================================================== --- clang-tools-extra/clang-tidy/ClangTidyOptions.h +++ clang-tools-extra/clang-tidy/ClangTidyOptions.h @@ -65,7 +65,7 @@ llvm::Optional Checks; /// Clang-tidy-config - llvm::Optional ClangTidyConfig; + llvm::Optional ConfigFile; /// WarningsAsErrors filter. llvm::Optional WarningsAsErrors; @@ -230,8 +230,10 @@ /// Try to read configuration files from \p Directory using registered /// \c ConfigHandlers. llvm::Optional tryReadConfigFile(llvm::StringRef Directory); - llvm::Optional tryReadConfigFile(llvm::StringRef Path, - bool IsFile); + + /// Try to read configuration files using registered + /// \c ConfigHandlers. + llvm::Optional readConfigFile(llvm::StringRef Path); llvm::StringMap CachedOptions; ClangTidyOptions OverrideOptions; Index: clang-tools-extra/clang-tidy/ClangTidyOptions.cpp =================================================================== --- clang-tools-extra/clang-tidy/ClangTidyOptions.cpp +++ clang-tools-extra/clang-tidy/ClangTidyOptions.cpp @@ -109,7 +109,7 @@ ClangTidyOptions ClangTidyOptions::getDefaults() { ClangTidyOptions Options; Options.Checks = ""; - Options.ClangTidyConfig = ""; + Options.ConfigFile = ""; Options.WarningsAsErrors = ""; Options.HeaderFilterRegex = ""; Options.SystemHeaders = false; @@ -307,42 +307,19 @@ << "...\n"); assert(FS && "FS must be set."); - llvm::SmallString<1024> AbsoluteFilePath(FileName); - if (!OverrideOptions.ClangTidyConfig.getValue().empty()) { - AbsoluteFilePath.assign(OverrideOptions.ClangTidyConfig.getValue()); - if (FS->makeAbsolute(AbsoluteFilePath)) { - std::string Msg; - llvm::raw_string_ostream ErrStream(Msg); - ErrStream << " reading configuration from <" << AbsoluteFilePath - << "> can't make absolute path.\n"; - llvm::report_fatal_error(ErrStream.str()); - } - bool IsFile = false; - bool IsLink = false; - llvm::sys::fs::is_regular_file(Twine(AbsoluteFilePath), IsFile); - llvm::sys::fs::is_symlink_file(Twine(AbsoluteFilePath), IsLink); - if (!(IsFile || IsLink)) { - std::string Msg; - llvm::raw_string_ostream ErrStream(Msg); - ErrStream << " reading configuration from <" << AbsoluteFilePath - << "> file doesn't exist or not regular/symlink file.\n"; - llvm::report_fatal_error(ErrStream.str()); - } - - std::vector RawOptions = - DefaultOptionsProvider::getRawOptions(AbsoluteFilePath.str()); - OptionsSource CommandLineOptions(OverrideOptions, - OptionsSourceTypeCheckCommandLineOption); - + if (!OverrideOptions.ConfigFile.getValue().empty()) { + llvm::SmallString<1024> ConfigPath(OverrideOptions.ConfigFile.getValue()); + std::vector RawOptions; llvm::Optional Result; - Result = tryReadConfigFile(AbsoluteFilePath, true); + Result = readConfigFile(ConfigPath); if (Result) { RawOptions.push_back(*Result); } - RawOptions.push_back(CommandLineOptions); return RawOptions; } + llvm::SmallString<128> AbsoluteFilePath(FileName); + if (FS->makeAbsolute(AbsoluteFilePath)) return {}; @@ -404,15 +381,9 @@ } llvm::Optional -FileOptionsProvider::tryReadConfigFile(StringRef Path, bool IsFile) { - // llvm::outs() << "tryReadConfigFile IsFile<" << - // OverrideOptions.ClangTidyConfig << ">\n"; +FileOptionsProvider::readConfigFile(StringRef Path) { assert(!Path.empty()); - if (!IsFile) { - tryReadConfigFile(Path); - } - llvm::ErrorOr> Text = llvm::MemoryBuffer::getFile(Path); if (std::error_code EC = Text.getError()) { 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 @@ -73,12 +73,13 @@ )"), cl::init(""), cl::cat(ClangTidyCategory)); -static cl::opt ClangTidyConfig("clang-tidy-config", cl::desc(R"( -Specify full path of .clang-tidy config file. -For example, --clang-tidy-config=/some/path/myTidyConfig +static cl::opt ConfigFile("config-file", cl::desc(R"( +Specify full path of .clang-tidy or custom config file. +For example, --config-file=/some/path/myTidyConfig +Note: this option is mutually exclusive to --config and --checks options. )"), - cl::init(""), - cl::cat(ClangTidyCategory)); + cl::init(""), + cl::cat(ClangTidyCategory)); static cl::opt WarningsAsErrors("warnings-as-errors", cl::desc(R"( Upgrades warnings to errors. Same format as @@ -286,7 +287,7 @@ ClangTidyOptions DefaultOptions; DefaultOptions.Checks = DefaultChecks; - DefaultOptions.ClangTidyConfig = ""; + DefaultOptions.ConfigFile = ""; DefaultOptions.WarningsAsErrors = ""; DefaultOptions.HeaderFilterRegex = HeaderFilter; DefaultOptions.SystemHeaders = SystemHeaders; @@ -299,8 +300,8 @@ ClangTidyOptions OverrideOptions; if (Checks.getNumOccurrences() > 0) OverrideOptions.Checks = Checks; - if (ClangTidyConfig.getNumOccurrences() > 0) - OverrideOptions.ClangTidyConfig = ClangTidyConfig; + if (ConfigFile.getNumOccurrences() > 0) + OverrideOptions.ConfigFile = ConfigFile; if (WarningsAsErrors.getNumOccurrences() > 0) OverrideOptions.WarningsAsErrors = WarningsAsErrors; if (HeaderFilter.getNumOccurrences() > 0) @@ -312,6 +313,19 @@ if (UseColor.getNumOccurrences() > 0) OverrideOptions.UseColor = UseColor; + if (!ConfigFile.empty()) { + if (!Config.empty()) { + llvm::errs() << "Error: --config-file and --config are mutually " + "exclusive. Specify only one.\n"; + return nullptr; + } + if (!Checks.empty()) { + llvm::errs() << "Error: --config-file and --checks are mutually " + "exclusive. Specify only one.\n"; + return nullptr; + } + } + if (!Config.empty()) { if (llvm::ErrorOr ParsedConfig = parseConfiguration(Config)) {