Author: hokein Date: Wed Mar 6 02:51:38 2019 New Revision: 355493 URL: http://llvm.org/viewvc/llvm-project?rev=355493&view=rev Log: [clangd] Add Source to clangd::Diagnostic.
Summary: clangd embedder can distinguish diagnostics from clang or clang-tidy. Reviewers: ilya-biryukov Subscribers: ioeric, MaskRay, jkorous, arphaman, kadircet, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D58600 Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp clang-tools-extra/trunk/clangd/Diagnostics.cpp clang-tools-extra/trunk/clangd/Diagnostics.h clang-tools-extra/trunk/unittests/clangd/DiagnosticsTests.cpp Modified: clang-tools-extra/trunk/clangd/ClangdUnit.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/ClangdUnit.cpp?rev=355493&r1=355492&r2=355493&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/ClangdUnit.cpp (original) +++ clang-tools-extra/trunk/clangd/ClangdUnit.cpp Wed Mar 6 02:51:38 2019 @@ -372,6 +372,10 @@ ParsedAST::build(std::unique_ptr<Compile Clang->getPreprocessor().EndSourceFile(); std::vector<Diag> Diags = ASTDiags.take(); + // Populate diagnostic source. + for (auto &D : Diags) + D.S = + !CTContext->getCheckName(D.ID).empty() ? Diag::ClangTidy : Diag::Clang; // Add diagnostics from the preamble, if any. if (Preamble) Diags.insert(Diags.begin(), Preamble->Diags.begin(), Preamble->Diags.end()); @@ -539,8 +543,11 @@ buildPreamble(PathRef FileName, Compiler if (BuiltPreamble) { vlog("Built preamble of size {0} for file {1}", BuiltPreamble->getSize(), FileName); + std::vector<Diag> Diags = PreambleDiagnostics.take(); + for (auto &Diag : Diags) + Diag.S = Diag::Clang; return std::make_shared<PreambleData>( - std::move(*BuiltPreamble), PreambleDiagnostics.take(), + std::move(*BuiltPreamble), std::move(Diags), SerializedDeclsCollector.takeIncludes(), std::move(StatCache), SerializedDeclsCollector.takeCanonicalIncludes()); } else { Modified: clang-tools-extra/trunk/clangd/Diagnostics.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Diagnostics.cpp?rev=355493&r1=355492&r2=355493&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Diagnostics.cpp (original) +++ clang-tools-extra/trunk/clangd/Diagnostics.cpp Wed Mar 6 02:51:38 2019 @@ -377,6 +377,7 @@ void StoreDiags::HandleDiagnostic(Diagno flushLastDiag(); LastDiag = Diag(); + LastDiag->ID = Info.getID(); FillDiagBase(*LastDiag); if (!Info.getFixItHints().empty()) Modified: clang-tools-extra/trunk/clangd/Diagnostics.h URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/clangd/Diagnostics.h?rev=355493&r1=355492&r2=355493&view=diff ============================================================================== --- clang-tools-extra/trunk/clangd/Diagnostics.h (original) +++ clang-tools-extra/trunk/clangd/Diagnostics.h Wed Mar 6 02:51:38 2019 @@ -68,6 +68,14 @@ struct Note : DiagBase {}; /// A top-level diagnostic that may have Notes and Fixes. struct Diag : DiagBase { + // Diagnostic enum ID. + unsigned ID; + // The source of this diagnostic. + enum Source { + Clang, + ClangTidy, + }; + Source S = Clang; /// Elaborate on the problem, usually pointing to a related piece of code. std::vector<Note> Notes; /// *Alternative* fixes for this diagnostic, one should be chosen. Modified: clang-tools-extra/trunk/unittests/clangd/DiagnosticsTests.cpp URL: http://llvm.org/viewvc/llvm-project/clang-tools-extra/trunk/unittests/clangd/DiagnosticsTests.cpp?rev=355493&r1=355492&r2=355493&view=diff ============================================================================== --- clang-tools-extra/trunk/unittests/clangd/DiagnosticsTests.cpp (original) +++ clang-tools-extra/trunk/unittests/clangd/DiagnosticsTests.cpp Wed Mar 6 02:51:38 2019 @@ -58,6 +58,8 @@ MATCHER_P(EqualToLSPDiag, LSPDiag, std::tie(LSPDiag.range, LSPDiag.severity, LSPDiag.message); } +MATCHER_P(DiagSource, Source, "") { return arg.S == Source; } + MATCHER_P(EqualToFix, Fix, "LSP fix " + llvm::to_string(Fix)) { if (arg.Message != Fix.Message) return false; @@ -102,6 +104,7 @@ o]](); // This range spans lines. AllOf(Diag(Test.range("typo"), "use of undeclared identifier 'goo'; did you mean 'foo'?"), + DiagSource(Diag::Clang), WithFix( Fix(Test.range("typo"), "foo", "change 'go\\ o' to 'foo'")), // This is a pretty normal range. @@ -137,6 +140,18 @@ TEST(DiagnosticsTest, FlagsMatter) { WithFix(Fix(Test.range(), "int", "change return type to 'int'"))))); } +TEST(DiagnosticsTest, DiagnosticPreamble) { + Annotations Test(R"cpp( + #include $[["not-found.h"]] + )cpp"); + + auto TU = TestTU::withCode(Test.code()); + EXPECT_THAT(TU.build().getDiagnostics(), + ElementsAre(testing::AllOf( + Diag(Test.range(), "'not-found.h' file not found"), + DiagSource(Diag::Clang)))); +} + TEST(DiagnosticsTest, ClangTidy) { Annotations Test(R"cpp( #include $deprecated[["assert.h"]] @@ -159,6 +174,7 @@ TEST(DiagnosticsTest, ClangTidy) { AllOf(Diag(Test.range("deprecated"), "inclusion of deprecated C++ header 'assert.h'; consider " "using 'cassert' instead [modernize-deprecated-headers]"), + DiagSource(Diag::ClangTidy), WithFix(Fix(Test.range("deprecated"), "<cassert>", "change '\"assert.h\"' to '<cassert>'"))), Diag(Test.range("doubled"), @@ -168,6 +184,7 @@ TEST(DiagnosticsTest, ClangTidy) { Diag(Test.range("macroarg"), "side effects in the 1st macro argument 'X' are repeated in " "macro expansion [bugprone-macro-repeated-side-effects]"), + DiagSource(Diag::ClangTidy), WithNote(Diag(Test.range("macrodef"), "macro 'SQUARE' defined here " "[bugprone-macro-repeated-side-effects]"))), _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits