Mercurial > hg > CbC > CbC_llvm
diff clang-tools-extra/clangd/Diagnostics.h @ 221:79ff65ed7e25
LLVM12 Original
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 15 Jun 2021 19:15:29 +0900 |
parents | 0572611fdcc8 |
children | 5f17cb93ff66 |
line wrap: on
line diff
--- a/clang-tools-extra/clangd/Diagnostics.h Tue Jun 15 19:13:43 2021 +0900 +++ b/clang-tools-extra/clangd/Diagnostics.h Tue Jun 15 19:15:29 2021 +0900 @@ -13,14 +13,21 @@ #include "support/Path.h" #include "clang/Basic/Diagnostic.h" #include "clang/Basic/LangOptions.h" +#include "clang/Basic/SourceLocation.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/DenseSet.h" #include "llvm/ADT/None.h" #include "llvm/ADT/Optional.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/StringSet.h" +#include "llvm/Support/JSON.h" +#include "llvm/Support/SourceMgr.h" #include <cassert> +#include <functional> +#include <memory> #include <string> +#include <utility> +#include <vector> namespace clang { namespace tidy { @@ -64,6 +71,11 @@ // Since File is only descriptive, we store a separate flag to distinguish // diags from the main file. bool InsideMainFile = false; + unsigned ID; // e.g. member of clang::diag, or clang-tidy assigned ID. + // Feature modules can make use of this field to propagate data from a + // diagnostic to a CodeAction request. Each module should only append to the + // list. + llvm::json::Object OpaqueData; }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const DiagBase &D); @@ -82,13 +94,13 @@ /// A top-level diagnostic that may have Notes and Fixes. struct Diag : DiagBase { - unsigned ID; // e.g. member of clang::diag, or clang-tidy assigned ID. std::string Name; // if ID was recognized. // The source of this diagnostic. - enum { + enum DiagSource { Unknown, Clang, ClangTidy, + ClangdConfig, } Source = Unknown; /// Elaborate on the problem, usually pointing to a related piece of code. std::vector<Note> Notes; @@ -97,6 +109,8 @@ }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Diag &D); +Diag toDiag(const llvm::SMDiagnostic &, Diag::DiagSource Source); + /// Conversion to LSP diagnostics. Formats the error message of each diagnostic /// to include all its notes. Notes inside main file are also provided as /// separate diagnostics with their corresponding fixits. Notes outside main @@ -121,7 +135,8 @@ // The ClangTidyContext populates Source and Name for clang-tidy diagnostics. std::vector<Diag> take(const clang::tidy::ClangTidyContext *Tidy = nullptr); - void BeginSourceFile(const LangOptions &Opts, const Preprocessor *) override; + void BeginSourceFile(const LangOptions &Opts, + const Preprocessor *PP) override; void EndSourceFile() override; void HandleDiagnostic(DiagnosticsEngine::Level DiagLevel, const clang::Diagnostic &Info) override; @@ -130,27 +145,44 @@ const clang::Diagnostic &)>; using LevelAdjuster = std::function<DiagnosticsEngine::Level( DiagnosticsEngine::Level, const clang::Diagnostic &)>; + using DiagCallback = + std::function<void(const clang::Diagnostic &, clangd::Diag &)>; /// If set, possibly adds fixes for diagnostics using \p Fixer. void contributeFixes(DiagFixer Fixer) { this->Fixer = Fixer; } /// If set, this allows the client of this class to adjust the level of /// diagnostics, such as promoting warnings to errors, or ignoring /// diagnostics. void setLevelAdjuster(LevelAdjuster Adjuster) { this->Adjuster = Adjuster; } + /// Invokes a callback every time a diagnostics is completely formed. Handler + /// of the callback can also mutate the diagnostic. + void setDiagCallback(DiagCallback CB) { DiagCB = std::move(CB); } private: void flushLastDiag(); DiagFixer Fixer = nullptr; LevelAdjuster Adjuster = nullptr; + DiagCallback DiagCB = nullptr; std::vector<Diag> Output; llvm::Optional<LangOptions> LangOpts; llvm::Optional<Diag> LastDiag; - /// Set iff adjustDiagFromHeader resulted in changes to LastDiag. - bool LastDiagWasAdjusted = false; - llvm::DenseSet<int> IncludeLinesWithErrors; + llvm::Optional<FullSourceLoc> LastDiagLoc; // Valid only when LastDiag is set. + bool LastDiagOriginallyError = false; // Valid only when LastDiag is set. + SourceManager *OrigSrcMgr = nullptr; + + llvm::DenseSet<std::pair<unsigned, unsigned>> IncludedErrorLocations; bool LastPrimaryDiagnosticWasSuppressed = false; }; +/// Determine whether a (non-clang-tidy) diagnostic is suppressed by config. +bool isBuiltinDiagnosticSuppressed(unsigned ID, + const llvm::StringSet<> &Suppressed); +/// Take a user-specified diagnostic code, and convert it to a normalized form +/// stored in the config and consumed by isBuiltinDiagnosticsSuppressed. +/// +/// (This strips err_ and -W prefix so we can match with or without them.) +llvm::StringRef normalizeSuppressedCode(llvm::StringRef); + } // namespace clangd } // namespace clang