blob: 9ca378f2d410a0c28926f7fc71d28fe03c4bf518 [file] [log] [blame]
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +00001//===--- TextPathDiagnostics.cpp - Text Diagnostics for Paths ---*- C++ -*-===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines the TextPathDiagnostics object.
11//
12//===----------------------------------------------------------------------===//
13
Ted Kremenek21142582010-12-23 19:38:26 +000014#include "clang/StaticAnalyzer/PathDiagnosticClients.h"
15#include "clang/StaticAnalyzer/BugReporter/PathDiagnostic.h"
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000016#include "clang/Lex/Preprocessor.h"
17#include "llvm/Support/raw_ostream.h"
18using namespace clang;
Ted Kremenek9ef65372010-12-23 07:20:52 +000019using namespace ento;
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000020using namespace llvm;
21
22namespace {
23
Argyrios Kyrtzidisa599ae82010-12-03 01:17:19 +000024/// \brief Simple path diagnostic client used for outputting as diagnostic notes
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000025/// the sequence of events.
26class TextPathDiagnostics : public PathDiagnosticClient {
27 const std::string OutputFile;
28 Diagnostic &Diag;
29
30public:
31 TextPathDiagnostics(const std::string& output, Diagnostic &diag)
32 : OutputFile(output), Diag(diag) {}
33
34 void HandlePathDiagnostic(const PathDiagnostic* D);
35
36 void FlushDiagnostics(llvm::SmallVectorImpl<std::string> *FilesMade) { }
37
38 virtual llvm::StringRef getName() const {
39 return "TextPathDiagnostics";
40 }
41
Argyrios Kyrtzidis774dfbb2010-12-03 02:03:26 +000042 PathGenerationScheme getGenerationScheme() const { return Minimal; }
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000043 bool supportsLogicalOpControlFlow() const { return true; }
44 bool supportsAllBlockEdges() const { return true; }
45 virtual bool useVerboseDescription() const { return true; }
46};
47
48} // end anonymous namespace
49
50PathDiagnosticClient*
Ted Kremenek9ef65372010-12-23 07:20:52 +000051ento::createTextPathDiagnosticClient(const std::string& out,
52 const Preprocessor &PP) {
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000053 return new TextPathDiagnostics(out, PP.getDiagnostics());
54}
55
56void TextPathDiagnostics::HandlePathDiagnostic(const PathDiagnostic* D) {
57 if (!D)
58 return;
59
60 if (D->empty()) {
61 delete D;
62 return;
63 }
64
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000065 for (PathDiagnostic::const_iterator I=D->begin(), E=D->end(); I != E; ++I) {
Argyrios Kyrtzidis774dfbb2010-12-03 02:03:26 +000066 unsigned diagID = Diag.getDiagnosticIDs()->getCustomDiagID(
67 DiagnosticIDs::Note, I->getString());
68 Diag.Report(I->getLocation().asLocation(), diagID);
Argyrios Kyrtzidisebd4f522010-12-03 00:58:14 +000069 }
70}