diff options
Diffstat (limited to 'source/Expression/DiagnosticManager.cpp')
| -rw-r--r-- | source/Expression/DiagnosticManager.cpp | 91 | 
1 files changed, 91 insertions, 0 deletions
diff --git a/source/Expression/DiagnosticManager.cpp b/source/Expression/DiagnosticManager.cpp new file mode 100644 index 000000000000..5156ee38a67b --- /dev/null +++ b/source/Expression/DiagnosticManager.cpp @@ -0,0 +1,91 @@ +//===-- DiagnosticManager.cpp -----------------------------------*- C++ -*-===// +// +//                     The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "lldb/Expression/DiagnosticManager.h" + +#include "llvm/Support/ErrorHandling.h" + +#include "lldb/Core/Log.h" +#include "lldb/Core/StreamString.h" + +using namespace lldb_private; + +void +DiagnosticManager::Dump(Log *log) +{ +    if (!log) +        return; + +    std::string str = GetString(); + +    // GetString() puts a separator after each diagnostic. +    // We want to remove the last '\n' because log->PutCString will add one for us. + +    if (str.size() && str.back() == '\n') +    { +        str.pop_back(); +    } + +    log->PutCString(str.c_str()); +} + +static const char * +StringForSeverity(DiagnosticSeverity severity) +{ +    switch (severity) +    { +        // this should be exhaustive +        case lldb_private::eDiagnosticSeverityError: +            return "error: "; +        case lldb_private::eDiagnosticSeverityWarning: +            return "warning: "; +        case lldb_private::eDiagnosticSeverityRemark: +            return ""; +    } +    llvm_unreachable("switch needs another case for DiagnosticSeverity enum"); +} + +std::string +DiagnosticManager::GetString(char separator) +{ +    std::string ret; + +    for (const Diagnostic *diagnostic : Diagnostics()) +    { +        ret.append(StringForSeverity(diagnostic->GetSeverity())); +        ret.append(diagnostic->GetMessage()); +        ret.push_back(separator); +    } + +    return ret; +} + +size_t +DiagnosticManager::Printf(DiagnosticSeverity severity, const char *format, ...) +{ +    StreamString ss; + +    va_list args; +    va_start(args, format); +    size_t result = ss.PrintfVarArg(format, args); +    va_end(args); + +    AddDiagnostic(ss.GetData(), severity, eDiagnosticOriginLLDB); + +    return result; +} + +size_t +DiagnosticManager::PutCString(DiagnosticSeverity severity, const char *cstr) +{ +    if (!cstr) +        return 0; +    AddDiagnostic(cstr, severity, eDiagnosticOriginLLDB); +    return strlen(cstr); +}  | 
