diff --git a/clang-tools-extra/clangd/Diagnostics.h b/clang-tools-extra/clangd/Diagnostics.h --- a/clang-tools-extra/clangd/Diagnostics.h +++ b/clang-tools-extra/clangd/Diagnostics.h @@ -24,6 +24,7 @@ #include "llvm/Support/JSON.h" #include "llvm/Support/SourceMgr.h" #include +#include #include #include #include @@ -110,6 +111,8 @@ std::vector Notes; /// *Alternative* fixes for this diagnostic, one should be chosen. std::vector Fixes; + /// Number of fixes available that are different than fixes above. + std::size_t DelayedFixCount = 0; }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Diag &D); diff --git a/clang-tools-extra/clangd/Diagnostics.cpp b/clang-tools-extra/clangd/Diagnostics.cpp --- a/clang-tools-extra/clangd/Diagnostics.cpp +++ b/clang-tools-extra/clangd/Diagnostics.cpp @@ -297,8 +297,9 @@ std::string Result; llvm::raw_string_ostream OS(Result); OS << D.Message; - if (Opts.DisplayFixesCount && !D.Fixes.empty()) - OS << " (" << (D.Fixes.size() > 1 ? "fixes" : "fix") << " available)"; + auto TotalFixCount = D.Fixes.size() + D.DelayedFixCount; + if (Opts.DisplayFixesCount && TotalFixCount > 0) + OS << " (" << (TotalFixCount > 1 ? "fixes" : "fix") << " available)"; // If notes aren't emitted as structured info, add them to the message. if (!Opts.EmitRelatedLocations) for (auto &Note : D.Notes) { diff --git a/clang-tools-extra/clangd/unittests/ClangdLSPServerTests.cpp b/clang-tools-extra/clangd/unittests/ClangdLSPServerTests.cpp --- a/clang-tools-extra/clangd/unittests/ClangdLSPServerTests.cpp +++ b/clang-tools-extra/clangd/unittests/ClangdLSPServerTests.cpp @@ -371,6 +371,7 @@ struct DiagHooks : public ParseASTHooks { void sawDiagnostic(const clang::Diagnostic &, clangd::Diag &D) override { D.Message = DiagMsg.str(); + ++D.DelayedFixCount; } }; @@ -384,7 +385,8 @@ auto &Client = start(); Client.didOpen("foo.cpp", "test;"); EXPECT_THAT(Client.diagnostics("foo.cpp"), - llvm::ValueIs(testing::ElementsAre(DiagMessage(DiagMsg)))); + llvm::ValueIs(testing::ElementsAre( + DiagMessage(DiagMsg.str() + " (fix available)")))); } } // namespace } // namespace clangd