//===--- Diagnostics.h -------------------------------------------*- C++-*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_DIAGNOSTICS_H #define LLVM_CLANG_TOOLS_EXTRA_CLANGD_DIAGNOSTICS_H #include "Protocol.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/SmallVector.h" #include "llvm/ADT/StringSet.h" #include "llvm/Support/JSON.h" #include "llvm/Support/SourceMgr.h" #include <cassert> #include <functional> #include <memory> #include <optional> #include <string> #include <utility> #include <vector> namespace clang { namespace tidy { class ClangTidyContext; } // namespace tidy namespace clangd { struct ClangdDiagnosticOptions { … }; /// Contains basic information about a diagnostic. struct DiagBase { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const DiagBase &D); /// Represents a single fix-it that editor can apply to fix the error. struct Fix { … }; llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const Fix &F); /// Represents a note for the diagnostic. Severity of notes can only be 'note' /// or 'remark'. struct Note : DiagBase { … }; /// A top-level diagnostic that may have Notes and Fixes. struct Diag : DiagBase { … }; 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 /// file do not have a corresponding LSP diagnostic, but can still be included /// as part of their main diagnostic's message. void toLSPDiags( const Diag &D, const URIForFile &File, const ClangdDiagnosticOptions &Opts, llvm::function_ref<void(clangd::Diagnostic, llvm::ArrayRef<Fix>)> OutFn); /// Convert from clang diagnostic level to LSP severity. int getSeverity(DiagnosticsEngine::Level L); /// Returns a URI providing more information about a particular diagnostic. std::optional<std::string> getDiagnosticDocURI(Diag::DiagSource, unsigned ID, llvm::StringRef Name); /// StoreDiags collects the diagnostics that can later be reported by /// clangd. It groups all notes for a diagnostic into a single Diag /// and filters out diagnostics that don't mention the main file (i.e. neither /// the diag itself nor its notes are in the main file). class StoreDiags : public DiagnosticConsumer { … }; /// Determine whether a (non-clang-tidy) diagnostic is suppressed by config. bool isBuiltinDiagnosticSuppressed(unsigned ID, const llvm::StringSet<> &Suppressed, const LangOptions &); /// 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 #endif // LLVM_CLANG_TOOLS_EXTRA_CLANGD_DIAGNOSTICS_H