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 @@ -192,7 +192,7 @@ // A pair of configuration file base name and a function parsing // configuration from text in the corresponding format. typedef std::pair( - llvm::StringRef)>> + llvm::MemoryBufferRef)>> ConfigFileHandler; /// Configuration file handlers listed in the order of priority. @@ -308,7 +308,8 @@ /// Parses configuration from JSON and returns \c ClangTidyOptions or an /// error. -llvm::ErrorOr parseConfiguration(llvm::StringRef Config); +llvm::ErrorOr +parseConfiguration(llvm::MemoryBufferRef Config); /// Serializes configuration to a YAML-encoded string. std::string configurationAsText(const ClangTidyOptions &Options); 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 @@ -360,7 +360,7 @@ if ((*Text)->getBuffer().empty()) continue; llvm::ErrorOr ParsedOptions = - ConfigHandler.second((*Text)->getBuffer()); + ConfigHandler.second({(*Text)->getBuffer(), ConfigFile}); if (!ParsedOptions) { if (ParsedOptions.getError()) llvm::errs() << "Error parsing " << ConfigFile << ": " @@ -380,7 +380,8 @@ return Input.error(); } -llvm::ErrorOr parseConfiguration(StringRef Config) { +llvm::ErrorOr +parseConfiguration(llvm::MemoryBufferRef Config) { llvm::yaml::Input Input(Config); ClangTidyOptions Options; Input >> Options; 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 @@ -312,10 +312,11 @@ if (UseColor.getNumOccurrences() > 0) OverrideOptions.UseColor = UseColor; - auto LoadConfig = [&](StringRef Configuration) - -> std::unique_ptr { + auto LoadConfig = + [&](StringRef Configuration, + StringRef Source) -> std::unique_ptr { llvm::ErrorOr ParsedConfig = - parseConfiguration(Configuration); + parseConfiguration(MemoryBufferRef(Configuration, Source)); if (ParsedConfig) return std::make_unique( std::move(GlobalOptions), @@ -334,18 +335,18 @@ } llvm::ErrorOr> Text = - llvm::MemoryBuffer::getFile(ConfigFile.c_str()); + llvm::MemoryBuffer::getFile(ConfigFile); if (std::error_code EC = Text.getError()) { llvm::errs() << "Error: can't read config-file '" << ConfigFile << "': " << EC.message() << "\n"; return nullptr; } - return LoadConfig((*Text)->getBuffer()); + return LoadConfig((*Text)->getBuffer(), ConfigFile); } if (Config.getNumOccurrences() > 0) - return LoadConfig(Config); + return LoadConfig(Config, ""); return std::make_unique( std::move(GlobalOptions), std::move(DefaultOptions), diff --git a/clang-tools-extra/clangd/TidyProvider.cpp b/clang-tools-extra/clangd/TidyProvider.cpp --- a/clang-tools-extra/clangd/TidyProvider.cpp +++ b/clang-tools-extra/clangd/TidyProvider.cpp @@ -41,7 +41,8 @@ [this](llvm::Optional Data) { Value.reset(); if (Data && !Data->empty()) { - if (auto Parsed = tidy::parseConfiguration(*Data)) + if (auto Parsed = tidy::parseConfiguration( + llvm::MemoryBufferRef(*Data, path()))) Value = std::make_shared( std::move(*Parsed)); else 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 @@ -72,10 +72,11 @@ TEST(ParseConfiguration, ValidConfiguration) { llvm::ErrorOr Options = - parseConfiguration("Checks: \"-*,misc-*\"\n" - "HeaderFilterRegex: \".*\"\n" - "AnalyzeTemporaryDtors: true\n" - "User: some.user"); + parseConfiguration(llvm::MemoryBufferRef("Checks: \"-*,misc-*\"\n" + "HeaderFilterRegex: \".*\"\n" + "AnalyzeTemporaryDtors: true\n" + "User: some.user", + "Options")); EXPECT_TRUE(!!Options); EXPECT_EQ("-*,misc-*", *Options->Checks); EXPECT_EQ(".*", *Options->HeaderFilterRegex); @@ -83,7 +84,8 @@ } TEST(ParseConfiguration, MergeConfigurations) { - llvm::ErrorOr Options1 = parseConfiguration(R"( + llvm::ErrorOr Options1 = + parseConfiguration(llvm::MemoryBufferRef(R"( Checks: "check1,check2" HeaderFilterRegex: "filter1" AnalyzeTemporaryDtors: true @@ -91,9 +93,11 @@ ExtraArgs: ['arg1', 'arg2'] ExtraArgsBefore: ['arg-before1', 'arg-before2'] UseColor: false - )"); + )", + "Options1")); ASSERT_TRUE(!!Options1); - llvm::ErrorOr Options2 = parseConfiguration(R"( + llvm::ErrorOr Options2 = + parseConfiguration(llvm::MemoryBufferRef(R"( Checks: "check3,check4" HeaderFilterRegex: "filter2" AnalyzeTemporaryDtors: false @@ -101,7 +105,8 @@ ExtraArgs: ['arg3', 'arg4'] ExtraArgsBefore: ['arg-before3', 'arg-before4'] UseColor: true - )"); + )", + "Options2")); ASSERT_TRUE(!!Options2); ClangTidyOptions Options = Options1->merge(*Options2, 0); EXPECT_EQ("check1,check2,check3,check4", *Options.Checks);