clang  3.7.0
PlistReporter.cpp
Go to the documentation of this file.
1 //===--- PlistReporter.cpp - ARC Migrate Tool Plist Reporter ----*- 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 #include "Internals.h"
14 #include "clang/Lex/Lexer.h"
15 using namespace clang;
16 using namespace arcmt;
17 using namespace markup;
18 
20  switch (Level) {
22  llvm_unreachable("ignored");
24  return "note";
27  return "warning";
30  return "error";
31  }
32  llvm_unreachable("Invalid DiagnosticsEngine level!");
33 }
34 
35 void arcmt::writeARCDiagsToPlist(const std::string &outPath,
38  const LangOptions &LangOpts) {
39  DiagnosticIDs DiagIDs;
40 
41  // Build up a set of FIDs that we use by scanning the locations and
42  // ranges of the diagnostics.
43  FIDMap FM;
45 
47  I = diags.begin(), E = diags.end(); I != E; ++I) {
48  const StoredDiagnostic &D = *I;
49 
50  AddFID(FM, Fids, SM, D.getLocation());
51 
53  RI = D.range_begin(), RE = D.range_end(); RI != RE; ++RI) {
54  AddFID(FM, Fids, SM, RI->getBegin());
55  AddFID(FM, Fids, SM, RI->getEnd());
56  }
57  }
58 
59  std::error_code EC;
60  llvm::raw_fd_ostream o(outPath, EC, llvm::sys::fs::F_Text);
61  if (EC) {
62  llvm::errs() << "error: could not create file: " << outPath << '\n';
63  return;
64  }
65 
66  EmitPlistHeader(o);
67 
68  // Write the root object: a <dict> containing...
69  // - "files", an <array> mapping from FIDs to file names
70  // - "diagnostics", an <array> containing the diagnostics
71  o << "<dict>\n"
72  " <key>files</key>\n"
73  " <array>\n";
74 
75  for (FileID FID : Fids)
76  EmitString(o << " ", SM.getFileEntryForID(FID)->getName()) << '\n';
77 
78  o << " </array>\n"
79  " <key>diagnostics</key>\n"
80  " <array>\n";
81 
83  DI = diags.begin(), DE = diags.end(); DI != DE; ++DI) {
84 
85  const StoredDiagnostic &D = *DI;
86 
88  continue;
89 
90  o << " <dict>\n";
91 
92  // Output the diagnostic.
93  o << " <key>description</key>";
94  EmitString(o, D.getMessage()) << '\n';
95  o << " <key>category</key>";
97  DiagIDs.getCategoryNumberForDiag(D.getID()))) << '\n';
98  o << " <key>type</key>";
99  EmitString(o, getLevelName(D.getLevel())) << '\n';
100 
101  // Output the location of the bug.
102  o << " <key>location</key>\n";
103  EmitLocation(o, SM, D.getLocation(), FM, 2);
104 
105  // Output the ranges (if any).
106  if (!D.getRanges().empty()) {
107  o << " <key>ranges</key>\n";
108  o << " <array>\n";
109  for (auto &R : D.getRanges()) {
110  CharSourceRange ExpansionRange(SM.getExpansionRange(R.getAsRange()),
111  R.isTokenRange());
112  EmitRange(o, SM, Lexer::getAsCharRange(ExpansionRange, SM, LangOpts),
113  FM, 4);
114  }
115  o << " </array>\n";
116  }
117 
118  // Close up the entry.
119  o << " </dict>\n";
120  }
121 
122  o << " </array>\n";
123 
124  // Finish.
125  o << "</dict>\n</plist>";
126 }
static unsigned getCategoryNumberForDiag(unsigned DiagID)
Return the category number that a specified DiagID belongs to, or 0 if no category.
void AddFID(FIDMap &FIDs, SmallVectorImpl< FileID > &V, const SourceManager &SM, SourceLocation L)
Definition: PlistSupport.h:21
std::vector< CharSourceRange >::const_iterator range_iterator
Definition: Diagnostic.h:1287
void EmitLocation(raw_ostream &o, const SourceManager &SM, SourceLocation L, const FIDMap &FM, unsigned indent)
Definition: PlistSupport.h:90
Defines the clang::FileManager interface and associated types.
Defines the SourceManager interface.
StringRef getMessage() const
Definition: Diagnostic.h:1283
Represents a diagnostic in a form that can be retained until its corresponding source manager is dest...
Definition: Diagnostic.h:1258
const FullSourceLoc & getLocation() const
Definition: Diagnostic.h:1282
static StringRef getCategoryNameFromID(unsigned CategoryID)
Given a category ID, return the name of the category.
std::pair< SourceLocation, SourceLocation > getExpansionRange(SourceLocation Loc) const
Given a SourceLocation object, return the range of tokens covered by the expansion in the ultimate fi...
Keeps track of the various options that can be enabled, which controls the dialect of C or C++ that i...
Definition: LangOptions.h:48
unsigned getID() const
Definition: Diagnostic.h:1280
const FileEntry * getFileEntryForID(FileID FID) const
Returns the FileEntry record for the provided FileID.
SourceManager & SM
static StringRef getLevelName(DiagnosticsEngine::Level Level)
Represents a character-granular source range.
range_iterator range_begin() const
Definition: Diagnostic.h:1288
void writeARCDiagsToPlist(const std::string &outPath, ArrayRef< StoredDiagnostic > diags, SourceManager &SM, const LangOptions &LangOpts)
const char * getName() const
Definition: FileManager.h:84
llvm::DenseMap< FileID, unsigned > FIDMap
Definition: PlistSupport.h:19
raw_ostream & EmitPlistHeader(raw_ostream &o)
Definition: PlistSupport.h:45
An opaque identifier used by SourceManager which refers to a source file (MemoryBuffer) along with it...
range_iterator range_end() const
Definition: Diagnostic.h:1289
Used for handling and querying diagnostic IDs.
void EmitRange(raw_ostream &o, const SourceManager &SM, CharSourceRange R, const FIDMap &FM, unsigned indent)
Definition: PlistSupport.h:106
static CharSourceRange getAsCharRange(SourceRange Range, const SourceManager &SM, const LangOptions &LangOpts)
Given a token range, produce a corresponding CharSourceRange that is not a token range. This allows the source range to be used by components that don't have access to the lexer and thus can't find the end of the range for themselves.
Definition: Lexer.h:330
ArrayRef< CharSourceRange > getRanges() const
Definition: Diagnostic.h:1292
raw_ostream & EmitString(raw_ostream &o, StringRef s)
Definition: PlistSupport.h:61
Level
The level of the diagnostic, after it has been through mapping.
Definition: Diagnostic.h:141
DiagnosticsEngine::Level getLevel() const
Definition: Diagnostic.h:1281
This class handles loading and caching of source files into memory.