diff --git a/clang-tools-extra/clangd/Preamble.h b/clang-tools-extra/clangd/Preamble.h --- a/clang-tools-extra/clangd/Preamble.h +++ b/clang-tools-extra/clangd/Preamble.h @@ -164,7 +164,7 @@ static constexpr llvm::StringLiteral HeaderName = "__preamble_patch__.h"; llvm::ArrayRef marks() const; - MainFileMacros mainFileMacros() const; + const MainFileMacros &mainFileMacros() const; private: static PreamblePatch create(llvm::StringRef FileName, @@ -183,6 +183,7 @@ PreambleBounds ModifiedBounds = {0, false}; const PreambleData *Baseline = nullptr; std::vector PatchedMarks; + MainFileMacros PatchedMacros; }; } // namespace clangd diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -325,6 +325,7 @@ std::vector Lines; PreambleBounds Bounds = {0, false}; std::vector Marks; + MainFileMacros Macros; }; /// Scans the preprocessor directives in the preamble section of the file by @@ -373,14 +374,15 @@ if (!Action.BeginSourceFile(*Clang, Clang->getFrontendOpts().Inputs[0])) return error("failed BeginSourceFile"); Preprocessor &PP = Clang->getPreprocessor(); + const auto &SM = PP.getSourceManager(); IncludeStructure Includes; Includes.collect(*Clang); ScannedPreamble SP; SP.Bounds = Bounds; PP.addPPCallbacks( std::make_unique(PP, SP.TextualDirectives)); - PP.addPPCallbacks( - collectPragmaMarksCallback(PP.getSourceManager(), SP.Marks)); + PP.addPPCallbacks(collectPragmaMarksCallback(SM, SP.Marks)); + PP.addPPCallbacks(std::make_unique(SM, SP.Macros)); if (llvm::Error Err = Action.Execute()) return std::move(Err); Action.EndSourceFile(); @@ -859,6 +861,7 @@ PP.PatchedDiags = patchDiags(Baseline.Diags, *BaselineScan, *ModifiedScan); PP.PatchedMarks = std::move(ModifiedScan->Marks); + PP.PatchedMacros = std::move(ModifiedScan->Macros); dlog("Created preamble patch: {0}", Patch.str()); Patch.flush(); return PP; @@ -915,11 +918,10 @@ return PatchedMarks; } -MainFileMacros PreamblePatch::mainFileMacros() const { +const MainFileMacros &PreamblePatch::mainFileMacros() const { if (PatchContents.empty()) return Baseline->Macros; - // FIXME: Patch main file macros. - return MainFileMacros(); + return PatchedMacros; } } // namespace clangd } // namespace clang diff --git a/clang-tools-extra/clangd/unittests/PreambleTests.cpp b/clang-tools-extra/clangd/unittests/PreambleTests.cpp --- a/clang-tools-extra/clangd/unittests/PreambleTests.cpp +++ b/clang-tools-extra/clangd/unittests/PreambleTests.cpp @@ -30,7 +30,6 @@ #include "llvm/Support/MemoryBuffer.h" #include "llvm/Support/ScopedPrinter.h" #include "llvm/Support/VirtualFileSystem.h" -#include "llvm/Testing/Support/SupportHelpers.h" #include "gmock/gmock.h" #include "gtest/gtest-matchers.h" #include "gtest/gtest.h" @@ -855,11 +854,12 @@ ]] #pragma $y[[mark YY ]] +#define BAZ #endif)cpp"); auto AST = createPatchedAST(Code.code(), NewCode.code()); - // FIXME: Macros and marks have locations that need to be patched. - EXPECT_THAT(AST->getMacros().Names, IsEmpty()); + EXPECT_THAT(AST->getMacros().Names.keys(), + UnorderedElementsAreArray({"FOO", "BAR", "BAZ"})); EXPECT_THAT(AST->getMarks(), UnorderedElementsAre(Mark(NewCode.range("x"), " XX"), Mark(NewCode.range("y"), " YY")));