[clang-tools-extra] c11c2f5 - [clangd] Drop stale macro and mark ranges
Kadir Cetinkaya via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 14 05:23:36 PDT 2023
Author: Kadir Cetinkaya
Date: 2023-03-14T13:18:16+01:00
New Revision: c11c2f5f6548a5303517c89ba6629bbfa7fae0d9
URL: https://github.com/llvm/llvm-project/commit/c11c2f5f6548a5303517c89ba6629bbfa7fae0d9
DIFF: https://github.com/llvm/llvm-project/commit/c11c2f5f6548a5303517c89ba6629bbfa7fae0d9.diff
LOG: [clangd] Drop stale macro and mark ranges
I'll follow up with patching of those ranges, this is to stop bleeding
mentioned in https://github.com/clangd/clangd/issues/1537.
Differential Revision: https://reviews.llvm.org/D146024
Added:
Modified:
clang-tools-extra/clangd/ParsedAST.cpp
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/ParsedAST.cpp b/clang-tools-extra/clangd/ParsedAST.cpp
index 640b112ebe715..1671eec133b6e 100644
--- a/clang-tools-extra/clangd/ParsedAST.cpp
+++ b/clang-tools-extra/clangd/ParsedAST.cpp
@@ -605,16 +605,15 @@ ParsedAST::build(llvm::StringRef Filename, const ParseInputs &Inputs,
// Copy over the macros in the preamble region of the main file, and combine
// with non-preamble macros below.
MainFileMacros Macros;
- if (Preamble)
- Macros = Preamble->Macros;
+ std::vector<PragmaMark> Marks;
+ if (Preamble) {
+ Macros = Patch->mainFileMacros();
+ Marks = Patch->marks();
+ }
Clang->getPreprocessor().addPPCallbacks(
std::make_unique<CollectMainFileMacros>(Clang->getSourceManager(),
Macros));
- std::vector<PragmaMark> Marks;
- // FIXME: We need to patch the marks for stale preambles.
- if (Preamble)
- Marks = Preamble->Marks;
Clang->getPreprocessor().addPPCallbacks(
collectPragmaMarksCallback(Clang->getSourceManager(), Marks));
diff --git a/clang-tools-extra/clangd/Preamble.cpp b/clang-tools-extra/clangd/Preamble.cpp
index eca7f0e6e6e07..94e6839a7f49d 100644
--- a/clang-tools-extra/clangd/Preamble.cpp
+++ b/clang-tools-extra/clangd/Preamble.cpp
@@ -7,6 +7,7 @@
//===----------------------------------------------------------------------===//
#include "Preamble.h"
+#include "CollectMacros.h"
#include "Compiler.h"
#include "Config.h"
#include "Diagnostics.h"
@@ -765,6 +766,7 @@ PreamblePatch PreamblePatch::create(llvm::StringRef FileName,
return PreamblePatch::unmodified(Baseline);
PreamblePatch PP;
+ PP.Baseline = &Baseline;
// This shouldn't coincide with any real file name.
llvm::SmallString<128> PatchName;
llvm::sys::path::append(PatchName, llvm::sys::path::parent_path(FileName),
@@ -886,6 +888,7 @@ std::vector<Inclusion> PreamblePatch::preambleIncludes() const {
PreamblePatch PreamblePatch::unmodified(const PreambleData &Preamble) {
PreamblePatch PP;
+ PP.Baseline = &Preamble;
PP.PreambleIncludes = Preamble.Includes.MainFileIncludes;
PP.ModifiedBounds = Preamble.Preamble.getBounds();
PP.PatchedDiags = Preamble.Diags;
@@ -896,5 +899,18 @@ bool PreamblePatch::preserveDiagnostics() const {
return PatchContents.empty() ||
Config::current().Diagnostics.AllowStalePreamble;
}
+llvm::ArrayRef<PragmaMark> PreamblePatch::marks() const {
+ if (PatchContents.empty())
+ return Baseline->Marks;
+ // FIXME: Patch pragma marks.
+ return {};
+}
+
+MainFileMacros PreamblePatch::mainFileMacros() const {
+ if (PatchContents.empty())
+ return Baseline->Macros;
+ // FIXME: Patch main file macros.
+ return MainFileMacros();
+}
} // namespace clangd
} // namespace clang
diff --git a/clang-tools-extra/clangd/Preamble.h b/clang-tools-extra/clangd/Preamble.h
index b5a5c107ab48a..c0cccebd487af 100644
--- a/clang-tools-extra/clangd/Preamble.h
+++ b/clang-tools-extra/clangd/Preamble.h
@@ -163,6 +163,9 @@ class PreamblePatch {
static constexpr llvm::StringLiteral HeaderName = "__preamble_patch__.h";
+ llvm::ArrayRef<PragmaMark> marks() const;
+ MainFileMacros mainFileMacros() const;
+
private:
static PreamblePatch create(llvm::StringRef FileName,
const ParseInputs &Modified,
@@ -178,6 +181,7 @@ class PreamblePatch {
// Diags that were attached to a line preserved in Modified contents.
std::vector<Diag> PatchedDiags;
PreambleBounds ModifiedBounds = {0, false};
+ const PreambleData *Baseline = nullptr;
};
} // namespace clangd
diff --git a/clang-tools-extra/clangd/unittests/PreambleTests.cpp b/clang-tools-extra/clangd/unittests/PreambleTests.cpp
index 29ebcb35a88c8..bc32671e6a975 100644
--- a/clang-tools-extra/clangd/unittests/PreambleTests.cpp
+++ b/clang-tools-extra/clangd/unittests/PreambleTests.cpp
@@ -19,6 +19,7 @@
#include "TestFS.h"
#include "TestTU.h"
#include "XRefs.h"
+#include "support/Context.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Format/Format.h"
#include "clang/Frontend/FrontendActions.h"
@@ -36,6 +37,7 @@
#include <memory>
#include <optional>
#include <string>
+#include <utility>
#include <vector>
using testing::AllOf;
@@ -826,6 +828,35 @@ x>)");
EXPECT_THAT(*AST->getDiagnostics(), IsEmpty());
}
}
+
+TEST(PreamblePatch, MacroAndMarkHandling) {
+ Config Cfg;
+ Cfg.Diagnostics.AllowStalePreamble = true;
+ WithContextValue WithCfg(Config::Key, std::move(Cfg));
+
+ {
+ Annotations Code(R"cpp(
+#ifndef FOO
+#define FOO
+// Some comments
+#pragma mark XX
+#define BAR
+
+#endif)cpp");
+ Annotations NewCode(R"cpp(
+#ifndef FOO
+#define FOO
+#define BAR
+#pragma mark XX
+
+#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->getMarks(), IsEmpty());
+ }
+}
+
} // namespace
} // namespace clangd
} // namespace clang
More information about the cfe-commits
mailing list