diff --git a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp --- a/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp +++ b/clang-tools-extra/clang-tidy/ClangTidyDiagnosticConsumer.cpp @@ -205,7 +205,7 @@ ClangTidyOptions ClangTidyContext::getOptionsForFile(StringRef File) const { // Merge options on top of getDefaults() as a safeguard against options with // unset values. - return ClangTidyOptions::getDefaults().mergeWith( + return ClangTidyOptions::getDefaults().merge( OptionsProvider->getOptions(File), 0); } 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 @@ -55,11 +55,15 @@ /// of each registered \c ClangTidyModule. static ClangTidyOptions getDefaults(); + /// Overwrites all fields in here by the fields of \p Other that have a value. + /// \p Order specifies precedence of \p Other option. + ClangTidyOptions &mergeWith(const ClangTidyOptions &Other, unsigned Order); + /// Creates a new \c ClangTidyOptions instance combined from all fields /// of this instance overridden by the fields of \p Other that have a value. /// \p Order specifies precedence of \p Other option. - ClangTidyOptions mergeWith(const ClangTidyOptions &Other, - unsigned Order) const; + LLVM_NODISCARD ClangTidyOptions merge(const ClangTidyOptions &Other, + unsigned Order) const; /// Checks filter. llvm::Optional Checks; 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 @@ -16,6 +16,7 @@ #include "llvm/Support/Path.h" #include "llvm/Support/YAMLTraits.h" #include "llvm/Support/raw_ostream.h" +#include #include #define DEBUG_TYPE "clang-tidy-options" @@ -116,7 +117,7 @@ Options.User = llvm::None; for (const ClangTidyModuleRegistry::entry &Module : ClangTidyModuleRegistry::entries()) - Options = Options.mergeWith(Module.instantiate()->getModuleOptions(), 0); + Options.mergeWith(Module.instantiate()->getModuleOptions(), 0); return Options; } @@ -142,27 +143,31 @@ Dest = Src; } -ClangTidyOptions ClangTidyOptions::mergeWith(const ClangTidyOptions &Other, - unsigned Priority) const { - ClangTidyOptions Result = *this; - - mergeCommaSeparatedLists(Result.Checks, Other.Checks); - mergeCommaSeparatedLists(Result.WarningsAsErrors, Other.WarningsAsErrors); - overrideValue(Result.HeaderFilterRegex, Other.HeaderFilterRegex); - overrideValue(Result.SystemHeaders, Other.SystemHeaders); - overrideValue(Result.FormatStyle, Other.FormatStyle); - overrideValue(Result.User, Other.User); - overrideValue(Result.UseColor, Other.UseColor); - mergeVectors(Result.ExtraArgs, Other.ExtraArgs); - mergeVectors(Result.ExtraArgsBefore, Other.ExtraArgsBefore); +ClangTidyOptions &ClangTidyOptions::mergeWith(const ClangTidyOptions &Other, + unsigned Order) { + mergeCommaSeparatedLists(Checks, Other.Checks); + mergeCommaSeparatedLists(WarningsAsErrors, Other.WarningsAsErrors); + overrideValue(HeaderFilterRegex, Other.HeaderFilterRegex); + overrideValue(SystemHeaders, Other.SystemHeaders); + overrideValue(FormatStyle, Other.FormatStyle); + overrideValue(User, Other.User); + overrideValue(UseColor, Other.UseColor); + mergeVectors(ExtraArgs, Other.ExtraArgs); + mergeVectors(ExtraArgsBefore, Other.ExtraArgsBefore); for (const auto &KeyValue : Other.CheckOptions) { - Result.CheckOptions.insert_or_assign( + CheckOptions.insert_or_assign( KeyValue.getKey(), ClangTidyValue(KeyValue.getValue().Value, - KeyValue.getValue().Priority + Priority)); + KeyValue.getValue().Priority + Order)); } + return *this; +} +ClangTidyOptions ClangTidyOptions::merge(const ClangTidyOptions &Other, + unsigned Order) const { + ClangTidyOptions Result = *this; + Result.mergeWith(Other, Order); return Result; } @@ -178,8 +183,8 @@ ClangTidyOptionsProvider::getOptions(llvm::StringRef FileName) { ClangTidyOptions Result; unsigned Priority = 0; - for (const auto &Source : getRawOptions(FileName)) - Result = Result.mergeWith(Source.first, ++Priority); + for (auto &Source : getRawOptions(FileName)) + Result.mergeWith(Source.first, ++Priority); return Result; } diff --git a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp --- a/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp +++ b/clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp @@ -319,7 +319,7 @@ if (ParsedConfig) return std::make_unique( GlobalOptions, - ClangTidyOptions::getDefaults().mergeWith(DefaultOptions, 0), + ClangTidyOptions::getDefaults().merge(DefaultOptions, 0), *ParsedConfig, OverrideOptions, std::move(FS)); llvm::errs() << "Error: invalid configuration specified.\n" << ParsedConfig.getError().message() << "\n"; @@ -455,9 +455,8 @@ if (DumpConfig) { EffectiveOptions.CheckOptions = getCheckOptions(EffectiveOptions, AllowEnablingAnalyzerAlphaCheckers); - llvm::outs() << configurationAsText( - ClangTidyOptions::getDefaults().mergeWith( - EffectiveOptions, 0)) + llvm::outs() << configurationAsText(ClangTidyOptions::getDefaults().merge( + EffectiveOptions, 0)) << "\n"; return 0; } diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp @@ -103,7 +103,7 @@ UseColor: true )"); ASSERT_TRUE(!!Options2); - ClangTidyOptions Options = Options1->mergeWith(*Options2, 0); + ClangTidyOptions Options = Options1->merge(*Options2, 0); EXPECT_EQ("check1,check2,check3,check4", *Options.Checks); EXPECT_EQ("filter2", *Options.HeaderFilterRegex); EXPECT_EQ("user2", *Options.User);