[clang-tools-extra] 82c8bf8 - [clangd] Patch main file macros in preamble
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Wed Mar 15 01:06:19 PDT 2023
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")));
More information about the cfe-commits
mailing list