1ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===--- TextPathDiagnostics.cpp - Text Diagnostics for Paths ---*- C++ -*-===//
2ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//
3ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//                     The LLVM Compiler Infrastructure
4ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//
5ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// This file is distributed under the University of Illinois Open Source
6ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis// License. See LICENSE.TXT for details.
7ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//
8ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
9ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//
10ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//  This file defines the TextPathDiagnostics object.
11ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//
12ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis//===----------------------------------------------------------------------===//
13ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
14f39d962cf84f46d2c0512157259ae1d41a1a5173David Blaikie#include "clang/StaticAnalyzer/Core/PathDiagnosticConsumers.h"
159b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek#include "clang/StaticAnalyzer/Core/BugReporter/PathDiagnostic.h"
16ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis#include "clang/Lex/Preprocessor.h"
17ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis#include "llvm/Support/raw_ostream.h"
18ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisusing namespace clang;
199ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenekusing namespace ento;
20ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisusing namespace llvm;
21ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
22ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidisnamespace {
23ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
24a599ae8826b01c0160a519b0fc5a4871f599bf04Argyrios Kyrtzidis/// \brief Simple path diagnostic client used for outputting as diagnostic notes
25ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis/// the sequence of events.
26ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikieclass TextPathDiagnostics : public PathDiagnosticConsumer {
27ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  const std::string OutputFile;
28d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  DiagnosticsEngine &Diag;
29ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
30ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidispublic:
31d6471f7c1921c7802804ce3ff6fe9768310f72b9David Blaikie  TextPathDiagnostics(const std::string& output, DiagnosticsEngine &diag)
32ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis    : OutputFile(output), Diag(diag) {}
33ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
34bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek  void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *> &Diags,
35bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek                            SmallVectorImpl<std::string> *FilesMade);
36ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
375f9e272e632e951b1efe824cd16acb4d96077930Chris Lattner  virtual StringRef getName() const {
38ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis    return "TextPathDiagnostics";
39ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  }
40ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
41774dfbb046c5087a3b82790833d0604bf4c3be6cArgyrios Kyrtzidis  PathGenerationScheme getGenerationScheme() const { return Minimal; }
42ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  bool supportsLogicalOpControlFlow() const { return true; }
43ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  bool supportsAllBlockEdges() const { return true; }
44ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  virtual bool useVerboseDescription() const { return true; }
45ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis};
46ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
47ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis} // end anonymous namespace
48ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
49ef3643fbbbf66247c5e205497fae0f46e240c143David BlaikiePathDiagnosticConsumer*
50ef3643fbbbf66247c5e205497fae0f46e240c143David Blaikieento::createTextPathDiagnosticConsumer(const std::string& out,
519ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek                                     const Preprocessor &PP) {
52ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  return new TextPathDiagnostics(out, PP.getDiagnostics());
53ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis}
54ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis
55bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenekvoid TextPathDiagnostics::FlushDiagnosticsImpl(
56bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek                              std::vector<const PathDiagnostic *> &Diags,
57bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek                              SmallVectorImpl<std::string> *FilesMade) {
58bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek  for (std::vector<const PathDiagnostic *>::iterator it = Diags.begin(),
59bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek       et = Diags.end(); it != et; ++it) {
60bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek    const PathDiagnostic *D = *it;
61802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek    for (PathPieces::const_iterator I = D->path.begin(), E = D->path.end();
62802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek         I != E; ++I) {
63bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek      unsigned diagID =
64bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek        Diag.getDiagnosticIDs()->getCustomDiagID(DiagnosticIDs::Note,
65802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek                                                 (*I)->getString());
66802e02463b880f53a6e645bde78cc412481ce9e0Ted Kremenek      Diag.Report((*I)->getLocation().asLocation(), diagID);
67bac341346f3c8e713a8f165120fd54b500ee3189Ted Kremenek    }
68ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis  }
69ebd4f52093b93fed57dcab6fa3a9033e3850ca4bArgyrios Kyrtzidis}
70