//===--- 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 <string>
 
 
 
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<Replacements> Fix;
 
 
 
  /// Extra source ranges associated with the note, in addition to the location
 
  /// of the Message itself.
 
  llvm::SmallVector<FileByteRange, 1> 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<DiagnosticMessage, 1> &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<DiagnosticMessage, 1> 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<Diagnostic> Diagnostics;
 
};
 
 
 
/// Get the first fix to apply for this diagnostic.
 
/// \returns nullptr if no fixes are attached to the diagnostic.
 
const llvm::StringMap<Replacements> *selectFirstFix(const Diagnostic& D);
 
 
 
} // end namespace tooling
 
} // end namespace clang
 
#endif // LLVM_CLANG_TOOLING_CORE_DIAGNOSTIC_H