#include "clang/AST/Decl.h"
#include "clang/AST/DeclBase.h"
#include "clang/AST/Stmt.h"
#include "clang/Analysis/IssueHash.h"
#include "clang/Analysis/MacroExpansionContext.h"
#include "clang/Analysis/PathDiagnostic.h"
#include "clang/Basic/FileManager.h"
#include "clang/Basic/LLVM.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/Lexer.h"
#include "clang/Lex/Preprocessor.h"
#include "clang/Lex/Token.h"
#include "clang/Rewrite/Core/HTMLRewrite.h"
#include "clang/Rewrite/Core/Rewriter.h"
#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
#include "llvm/ADT/ArrayRef.h"
#include "llvm/ADT/RewriteBuffer.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/Sequence.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/Support/Casting.h"
#include "llvm/Support/Errc.h"
#include "llvm/Support/ErrorHandling.h"
#include "llvm/Support/FileSystem.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <algorithm>
#include <cassert>
#include <map>
#include <memory>
#include <set>
#include <sstream>
#include <string>
#include <system_error>
#include <utility>
#include <vector>
usingnamespaceclang;
usingnamespaceento;
RewriteBuffer;
namespace {
class ArrowMap;
class HTMLDiagnostics : public PathDiagnosticConsumer { … };
bool isArrowPiece(const PathDiagnosticPiece &P) { … }
unsigned getPathSizeWithoutArrows(const PathPieces &Path) { … }
class ArrowMap : public std::vector<unsigned> { … };
llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const ArrowMap &Indices) { … }
}
void ento::createHTMLDiagnosticConsumer(
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
const std::string &OutputDir, const Preprocessor &PP,
const cross_tu::CrossTranslationUnitContext &CTU,
const MacroExpansionContext &MacroExpansions) { … }
void ento::createHTMLSingleFileDiagnosticConsumer(
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
const std::string &OutputDir, const Preprocessor &PP,
const cross_tu::CrossTranslationUnitContext &CTU,
const clang::MacroExpansionContext &MacroExpansions) { … }
void ento::createPlistHTMLDiagnosticConsumer(
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
const std::string &prefix, const Preprocessor &PP,
const cross_tu::CrossTranslationUnitContext &CTU,
const MacroExpansionContext &MacroExpansions) { … }
void ento::createSarifHTMLDiagnosticConsumer(
PathDiagnosticConsumerOptions DiagOpts, PathDiagnosticConsumers &C,
const std::string &sarif_file, const Preprocessor &PP,
const cross_tu::CrossTranslationUnitContext &CTU,
const MacroExpansionContext &MacroExpansions) { … }
void HTMLDiagnostics::FlushDiagnosticsImpl(
std::vector<const PathDiagnostic *> &Diags,
FilesMade *filesMade) { … }
static llvm::SmallString<32> getIssueHash(const PathDiagnostic &D,
const Preprocessor &PP) { … }
void HTMLDiagnostics::ReportDiag(const PathDiagnostic& D,
FilesMade *filesMade) { … }
std::string HTMLDiagnostics::GenerateHTML(const PathDiagnostic& D, Rewriter &R,
const SourceManager& SMgr, const PathPieces& path, const char *declName) { … }
void HTMLDiagnostics::dumpCoverageData(
const PathDiagnostic &D,
const PathPieces &path,
llvm::raw_string_ostream &os) { … }
std::string HTMLDiagnostics::showRelevantLinesJavascript(
const PathDiagnostic &D, const PathPieces &path) { … }
void HTMLDiagnostics::FinalizeHTML(const PathDiagnostic &D, Rewriter &R,
const SourceManager &SMgr,
const PathPieces &path, FileID FID,
FileEntryRef Entry, const char *declName) { … }
StringRef HTMLDiagnostics::showHelpJavascript() { … }
static bool shouldDisplayPopUpRange(const SourceRange &Range) { … }
static void
HandlePopUpPieceStartTag(Rewriter &R,
const std::vector<SourceRange> &PopUpRanges) { … }
static void HandlePopUpPieceEndTag(Rewriter &R,
const PathDiagnosticPopUpPiece &Piece,
std::vector<SourceRange> &PopUpRanges,
unsigned int LastReportedPieceIndex,
unsigned int PopUpPieceIndex) { … }
void HTMLDiagnostics::RewriteFile(Rewriter &R, const PathPieces &path,
FileID FID) { … }
void HTMLDiagnostics::HandlePiece(Rewriter &R, FileID BugFileID,
const PathDiagnosticPiece &P,
const std::vector<SourceRange> &PopUpRanges,
unsigned num, unsigned max) { … }
static void EmitAlphaCounter(raw_ostream &os, unsigned n) { … }
unsigned HTMLDiagnostics::ProcessMacroPiece(raw_ostream &os,
const PathDiagnosticMacroPiece& P,
unsigned num) { … }
void HTMLDiagnostics::addArrowSVGs(Rewriter &R, FileID BugFileID,
const ArrowMap &ArrowIndices) { … }
static std::string getSpanBeginForControl(const char *ClassName,
unsigned Index) { … }
static std::string getSpanBeginForControlStart(unsigned Index) { … }
static std::string getSpanBeginForControlEnd(unsigned Index) { … }
unsigned HTMLDiagnostics::ProcessControlFlowPiece(
Rewriter &R, FileID BugFileID, const PathDiagnosticControlFlowPiece &P,
unsigned Number) { … }
void HTMLDiagnostics::HighlightRange(Rewriter& R, FileID BugFileID,
SourceRange Range,
const char *HighlightStart,
const char *HighlightEnd) { … }
StringRef HTMLDiagnostics::generateKeyboardNavigationJavascript() { … }
StringRef HTMLDiagnostics::generateArrowDrawingJavascript() { … }