diff --git a/clang-tools-extra/clangd/IncludeCleaner.cpp b/clang-tools-extra/clangd/IncludeCleaner.cpp --- a/clang-tools-extra/clangd/IncludeCleaner.cpp +++ b/clang-tools-extra/clangd/IncludeCleaner.cpp @@ -506,6 +506,13 @@ D.Fixes.back().Edits.emplace_back(); D.Fixes.back().Edits.back().range.start.line = Inc->HashLine; D.Fixes.back().Edits.back().range.end.line = Inc->HashLine + 1; + // Add a fix to append IWYU pragma: keep + D.Fixes.emplace_back(); + D.Fixes.back().Message = "add pragma keep directive"; + D.Fixes.back().Edits.emplace_back(); + D.Fixes.back().Edits.back().newText = " // IWYU pragma: keep"; + D.Fixes.back().Edits.back().range.start = + D.Fixes.back().Edits.back().range.end = D.Range.end; D.InsideMainFile = true; Result.push_back(std::move(D)); } diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp --- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp +++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp @@ -1792,7 +1792,7 @@ TEST(DiagnosticsTest, IncludeCleaner) { Annotations Test(R"cpp( -$fix[[ $diag[[#include "unused.h"]] +$fix[[ $diag[[#include "unused.h"]]$insert[[]] ]] #include "used.h" @@ -1831,11 +1831,13 @@ auto AST = TU.build(); EXPECT_THAT( *AST.getDiagnostics(), - UnorderedElementsAre(AllOf( - Diag(Test.range("diag"), - "included header unused.h is not used directly"), - withTag(DiagnosticTag::Unnecessary), diagSource(Diag::Clangd), - withFix(Fix(Test.range("fix"), "", "remove #include directive"))))); + UnorderedElementsAre( + AllOf(Diag(Test.range("diag"), + "included header unused.h is not used directly"), + withTag(DiagnosticTag::Unnecessary), diagSource(Diag::Clangd), + withFix(Fix(Test.range("fix"), "", "remove #include directive"), + Fix(Test.range("insert"), " // IWYU pragma: keep", + "add pragma keep directive"))))); auto &Diag = AST.getDiagnostics()->front(); EXPECT_EQ(getDiagnosticDocURI(Diag.Source, Diag.ID, Diag.Name), std::string("https://clangd.llvm.org/guides/include-cleaner"));