//===--- Diagnostic.h - Framework for clang diagnostics tools --*- 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 // //===----------------------------------------------------------------------===// // // \file // Structures supporting diagnostics and refactorings that span multiple // translation units. Indicate diagnostics reports and replacements // suggestions for the analyzed sources. // //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_TOOLING_CORE_DIAGNOSTIC_H #define LLVM_CLANG_TOOLING_CORE_DIAGNOSTIC_H #include "Replacement.h" #include "clang/Basic/Diagnostic.h" #include "llvm/ADT/SmallVector.h" #include "llvm/ADT/StringMap.h" #include "llvm/ADT/StringRef.h" #include namespace clang { namespace tooling { /// Represents a range within a specific source file. struct FileByteRange { FileByteRange() = default; FileByteRange(const SourceManager &Sources, CharSourceRange Range); std::string FilePath; unsigned FileOffset; unsigned Length; }; /// Represents the diagnostic message with the error message associated /// and the information on the location of the problem. struct DiagnosticMessage { DiagnosticMessage(llvm::StringRef Message = ""); /// Constructs a diagnostic message with anoffset to the diagnostic /// within the file where the problem occurred. /// /// \param Loc Should be a file location, it is not meaningful for a macro /// location. /// DiagnosticMessage(llvm::StringRef Message, const SourceManager &Sources, SourceLocation Loc); std::string Message; std::string FilePath; unsigned FileOffset; /// Fixes for this diagnostic, grouped by file path. llvm::StringMap Fix; /// Extra source ranges associated with the note, in addition to the location /// of the Message itself. llvm::SmallVector Ranges; }; /// Represents the diagnostic with the level of severity and possible /// fixes to be applied. struct Diagnostic { enum Level { Remark = DiagnosticsEngine::Remark, Warning = DiagnosticsEngine::Warning, Error = DiagnosticsEngine::Error }; Diagnostic() = default; Diagnostic(llvm::StringRef DiagnosticName, Level DiagLevel, StringRef BuildDirectory); Diagnostic(llvm::StringRef DiagnosticName, const DiagnosticMessage &Message, const SmallVector &Notes, Level DiagLevel, llvm::StringRef BuildDirectory); /// Name identifying the Diagnostic. std::string DiagnosticName; /// Message associated to the diagnostic. DiagnosticMessage Message; /// Potential notes about the diagnostic. SmallVector Notes; /// Diagnostic level. Can indicate either an error or a warning. Level DiagLevel; /// A build directory of the diagnostic source file. /// /// It's an absolute path which is `directory` field of the source file in /// compilation database. If users don't specify the compilation database /// directory, it is the current directory where clang-tidy runs. /// /// Note: it is empty in unittest. std::string BuildDirectory; }; /// Collection of Diagnostics generated from a single translation unit. struct TranslationUnitDiagnostics { /// Name of the main source for the translation unit. std::string MainSourceFile; std::vector Diagnostics; }; /// Get the first fix to apply for this diagnostic. /// \returns nullptr if no fixes are attached to the diagnostic. const llvm::StringMap *selectFirstFix(const Diagnostic& D); } // end namespace tooling } // end namespace clang #endif // LLVM_CLANG_TOOLING_CORE_DIAGNOSTIC_H