Author: Kadir Cetinkaya Date: 2023-03-15T09:00:15+01:00 New Revision: 82c8bf8fcc91eda75e47856b34a1d68cedd2b46e
URL: https://github.com/llvm/llvm-project/commit/82c8bf8fcc91eda75e47856b34a1d68cedd2b46e DIFF: https://github.com/llvm/llvm-project/commit/82c8bf8fcc91eda75e47856b34a1d68cedd2b46e.diff LOG: [clangd] Patch main file macros in preamble Depends on D146026 Fixes https://github.com/clangd/clangd/issues/1537. Differential Revision: https://reviews.llvm.org/D146028 Added: Modified: clang-tools-extra/clangd/Preamble.cpp clang-tools-extra/clangd/Preamble.h clang-tools-extra/clangd/unittests/PreambleTests.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp index 85138eeae783..3b0af0ab50a6 100644 --- a/clang-tools-extra/clangd/Preamble.cpp +++ b/clang-tools-extra/clangd/Preamble.cpp @@ -325,6 +325,7 @@ struct ScannedPreamble { std::vector<llvm::StringRef> Lines; PreambleBounds Bounds = {0, false}; std::vector<PragmaMark> Marks; + MainFileMacros Macros; }; /// Scans the preprocessor directives in the preamble section of the file by @@ -373,14 +374,15 @@ scanPreamble(llvm::StringRef Contents, const tooling::CompileCommand &Cmd) { 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<DirectiveCollector>(PP, SP.TextualDirectives)); - PP.addPPCallbacks( - collectPragmaMarksCallback(PP.getSourceManager(), SP.Marks)); + PP.addPPCallbacks(collectPragmaMarksCallback(SM, SP.Marks)); + PP.addPPCallbacks(std::make_unique<CollectMainFileMacros>(SM, SP.Macros)); if (llvm::Error Err = Action.Execute()) return std::move(Err); Action.EndSourceFile(); @@ -859,6 +861,7 @@ PreamblePatch PreamblePatch::create(llvm::StringRef FileName, 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 @@ llvm::ArrayRef<PragmaMark> PreamblePatch::marks() const { 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/Preamble.h b/clang-tools-extra/clangd/Preamble.h index 6b189777b4d5..a16f497737aa 100644 --- a/clang-tools-extra/clangd/Preamble.h +++ b/clang-tools-extra/clangd/Preamble.h @@ -164,7 +164,7 @@ class PreamblePatch { static constexpr llvm::StringLiteral HeaderName = "__preamble_patch__.h"; llvm::ArrayRef<PragmaMark> marks() const; - MainFileMacros mainFileMacros() const; + const MainFileMacros &mainFileMacros() const; private: static PreamblePatch create(llvm::StringRef FileName, @@ -183,6 +183,7 @@ class PreamblePatch { PreambleBounds ModifiedBounds = {0, false}; const PreambleData *Baseline = nullptr; std::vector<PragmaMark> PatchedMarks; + MainFileMacros PatchedMacros; }; } // namespace clangd diff --git a/clang-tools-extra/clangd/unittests/PreambleTests.cpp b/clang-tools-extra/clangd/unittests/PreambleTests.cpp index fd094fa93881..903d9ef123ee 100644 --- 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 @@ TEST(PreamblePatch, MacroAndMarkHandling) { ]] #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"))); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits