diff options
Diffstat (limited to 'contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp')
-rw-r--r-- | contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp | 90 |
1 files changed, 39 insertions, 51 deletions
diff --git a/contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp b/contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp index 2189b86..19539e0 100644 --- a/contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp +++ b/contrib/llvm/tools/clang/lib/Frontend/LogDiagnosticPrinter.cpp @@ -10,16 +10,18 @@ #include "clang/Frontend/LogDiagnosticPrinter.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" +#include "clang/Basic/PlistSupport.h" #include "clang/Basic/SourceManager.h" #include "llvm/ADT/SmallString.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/raw_ostream.h" using namespace clang; +using namespace markup; LogDiagnosticPrinter::LogDiagnosticPrinter(raw_ostream &os, DiagnosticOptions *diags, bool _OwnsOutputStream) - : OS(os), LangOpts(0), DiagOpts(diags), + : OS(os), LangOpts(nullptr), DiagOpts(diags), OwnsOutputStream(_OwnsOutputStream) { } @@ -31,6 +33,7 @@ LogDiagnosticPrinter::~LogDiagnosticPrinter() { static StringRef getLevelName(DiagnosticsEngine::Level Level) { switch (Level) { case DiagnosticsEngine::Ignored: return "ignored"; + case DiagnosticsEngine::Remark: return "remark"; case DiagnosticsEngine::Note: return "note"; case DiagnosticsEngine::Warning: return "warning"; case DiagnosticsEngine::Error: return "error"; @@ -39,19 +42,34 @@ static StringRef getLevelName(DiagnosticsEngine::Level Level) { llvm_unreachable("Invalid DiagnosticsEngine level!"); } -// Escape XML characters inside the raw string. -static void emitString(llvm::raw_svector_ostream &OS, const StringRef Raw) { - for (StringRef::iterator I = Raw.begin(), E = Raw.end(); I != E; ++I) { - char c = *I; - switch (c) { - default: OS << c; break; - case '&': OS << "&"; break; - case '<': OS << "<"; break; - case '>': OS << ">"; break; - case '\'': OS << "'"; break; - case '\"': OS << """; break; - } +void +LogDiagnosticPrinter::EmitDiagEntry(llvm::raw_ostream &OS, + const LogDiagnosticPrinter::DiagEntry &DE) { + OS << " <dict>\n"; + OS << " <key>level</key>\n" + << " "; + EmitString(OS, getLevelName(DE.DiagnosticLevel)) << '\n'; + if (!DE.Filename.empty()) { + OS << " <key>filename</key>\n" + << " "; + EmitString(OS, DE.Filename) << '\n'; + } + if (DE.Line != 0) { + OS << " <key>line</key>\n" + << " "; + EmitInteger(OS, DE.Line) << '\n'; + } + if (DE.Column != 0) { + OS << " <key>column</key>\n" + << " "; + EmitInteger(OS, DE.Column) << '\n'; } + if (!DE.Message.empty()) { + OS << " <key>message</key>\n" + << " "; + EmitString(OS, DE.Message) << '\n'; + } + OS << " </dict>\n"; } void LogDiagnosticPrinter::EndSourceFile() { @@ -71,48 +89,18 @@ void LogDiagnosticPrinter::EndSourceFile() { OS << "<dict>\n"; if (!MainFilename.empty()) { OS << " <key>main-file</key>\n" - << " <string>"; - emitString(OS, MainFilename); - OS << "</string>\n"; + << " "; + EmitString(OS, MainFilename) << '\n'; } if (!DwarfDebugFlags.empty()) { OS << " <key>dwarf-debug-flags</key>\n" - << " <string>"; - emitString(OS, DwarfDebugFlags); - OS << "</string>\n"; + << " "; + EmitString(OS, DwarfDebugFlags) << '\n'; } OS << " <key>diagnostics</key>\n"; OS << " <array>\n"; - for (unsigned i = 0, e = Entries.size(); i != e; ++i) { - DiagEntry &DE = Entries[i]; - - OS << " <dict>\n"; - OS << " <key>level</key>\n" - << " <string>"; - emitString(OS, getLevelName(DE.DiagnosticLevel)); - OS << "</string>\n"; - if (!DE.Filename.empty()) { - OS << " <key>filename</key>\n" - << " <string>"; - emitString(OS, DE.Filename); - OS << "</string>\n"; - } - if (DE.Line != 0) { - OS << " <key>line</key>\n" - << " <integer>" << DE.Line << "</integer>\n"; - } - if (DE.Column != 0) { - OS << " <key>column</key>\n" - << " <integer>" << DE.Column << "</integer>\n"; - } - if (!DE.Message.empty()) { - OS << " <key>message</key>\n" - << " <string>"; - emitString(OS, DE.Message); - OS << "</string>\n"; - } - OS << " </dict>\n"; - } + for (auto &DE : Entries) + EmitDiagEntry(OS, DE); OS << " </array>\n"; OS << "</dict>\n"; @@ -130,7 +118,7 @@ void LogDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level, FileID FID = SM.getMainFileID(); if (!FID.isInvalid()) { const FileEntry *FE = SM.getFileEntryForID(FID); - if (FE && FE->getName()) + if (FE && FE->isValid()) MainFilename = FE->getName(); } } @@ -157,7 +145,7 @@ void LogDiagnosticPrinter::HandleDiagnostic(DiagnosticsEngine::Level Level, FileID FID = SM.getFileID(Info.getLocation()); if (!FID.isInvalid()) { const FileEntry *FE = SM.getFileEntryForID(FID); - if (FE && FE->getName()) + if (FE && FE->isValid()) DE.Filename = FE->getName(); } } else { |