From 64fe0458866d7bcadacb776a1fa7d827ba8ab916 Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Thu, 16 Sep 2021 11:30:55 +0200 Subject: [PATCH] [clangd] PreamblePatch should be no-op if includes arent patched Don't create a useless functional patch with only filename in it when there is only include directives to be patched but they're not requested. Differential Revision: https://reviews.llvm.org/D109880 --- clang-tools-extra/clangd/Preamble.cpp | 3 ++- clang-tools-extra/clangd/unittests/PreambleTests.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp index 72a53b2..0feb401 100644 --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -459,7 +459,8 @@ PreamblePatch PreamblePatch::create(llvm::StringRef FileName, bool IncludesChanged = BaselineScan->Includes != ModifiedScan->Includes; bool DirectivesChanged = BaselineScan->TextualDirectives != ModifiedScan->TextualDirectives; - if (!IncludesChanged && !DirectivesChanged) + if ((PatchType == PatchType::MacroDirectives || !IncludesChanged) && + !DirectivesChanged) return PreamblePatch::unmodified(Baseline); PreamblePatch PP; diff --git a/clang-tools-extra/clangd/unittests/PreambleTests.cpp b/clang-tools-extra/clangd/unittests/PreambleTests.cpp index bd9f989..6001533 100644 --- a/clang-tools-extra/clangd/unittests/PreambleTests.cpp +++ b/clang-tools-extra/clangd/unittests/PreambleTests.cpp @@ -554,6 +554,20 @@ TEST(PreamblePatch, MacroLoc) { auto AST = createPatchedAST(Baseline, Modified); ASSERT_TRUE(AST); } + +TEST(PreamblePatch, NoopWhenNotRequested) { + llvm::StringLiteral Baseline = "#define M\nint num = M;"; + llvm::StringLiteral Modified = "#define M\n#include \nint num = M;"; + auto TU = TestTU::withCode(Baseline); + auto BaselinePreamble = TU.preamble(); + ASSERT_TRUE(BaselinePreamble); + + TU.Code = Modified.str(); + MockFS FS; + auto PP = PreamblePatch::createMacroPatch(testPath(TU.Filename), + TU.inputs(FS), *BaselinePreamble); + EXPECT_TRUE(PP.text().empty()); +} } // namespace } // namespace clangd } // namespace clang -- 2.7.4