diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.h b/clang-tools-extra/clang-tidy/ClangTidyOptions.h --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.h +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.h @@ -73,6 +73,9 @@ /// Output warnings from system headers matching \c HeaderFilterRegex. llvm::Optional SystemHeaders; + /// Clang tidy configurations files to import. + llvm::Optional> ConfigurationsFilesToImport; + /// Format code around applied fixes with clang-format using this /// style. /// diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp --- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp @@ -92,6 +92,7 @@ IO.mapOptional("CheckOptions", NOpts->Options); IO.mapOptional("ExtraArgs", Options.ExtraArgs); IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore); + IO.mapOptional("ConfigurationsFilesToImport", Options.ConfigurationsFilesToImport); } }; @@ -325,12 +326,34 @@ } llvm::ErrorOr parseConfiguration(StringRef Config) { - llvm::yaml::Input Input(Config); - ClangTidyOptions Options; - Input >> Options; - if (Input.error()) - return Input.error(); - return Options; + ClangTidyOptions Options; + llvm::yaml::Input Input(Config); + + Input >> Options; + if (Input.error()) + return Input.error(); + if (!Options.ConfigurationsFilesToImport.hasValue()) { + return Options; + } + for (const auto& file : *Options.ConfigurationsFilesToImport) + { + llvm::ErrorOr> Text = llvm::MemoryBuffer::getFile(file); + if (std::error_code EC = Text.getError()) { + llvm::errs() << "Can't read " << file << ": " << EC.message() + << "\n"; + return EC; + } + Config = Text->get()->getBuffer(); + auto ReturnedOptions = parseConfiguration(Config); + if (ReturnedOptions) + { + Options = ReturnedOptions->mergeWith(Options); + } + else { + return ReturnedOptions; + } + } + return Options; } std::string configurationAsText(const ClangTidyOptions &Options) { diff --git a/clang-tools-extra/docs/clang-tidy/index.rst b/clang-tools-extra/docs/clang-tidy/index.rst --- a/clang-tools-extra/docs/clang-tidy/index.rst +++ b/clang-tools-extra/docs/clang-tidy/index.rst @@ -242,7 +242,9 @@ Configuration files: clang-tidy attempts to read configuration for each source file from a .clang-tidy file located in the closest parent directory of the source - file. If any configuration options have a corresponding command-line + file. This file can also imports configuration from another configuration file, + using ConfigurationsFilesToImport option. + If any configuration options have a corresponding command-line option, command-line option takes precedence. The effective configuration can be inspected using -dump-config: @@ -251,6 +253,7 @@ Checks: '-*,some-check' WarningsAsErrors: '' HeaderFilterRegex: '' + ConfigurationsFilesToImport: ['yaml1FilePath', 'yaml2FilePath'] FormatStyle: none User: user CheckOptions: