1*dda28197Spatrick //===-- DiagnosticManager.cpp ---------------------------------------------===//
2061da546Spatrick //
3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6061da546Spatrick //
7061da546Spatrick //===----------------------------------------------------------------------===//
8061da546Spatrick
9061da546Spatrick #include "lldb/Expression/DiagnosticManager.h"
10061da546Spatrick
11061da546Spatrick #include "llvm/Support/ErrorHandling.h"
12061da546Spatrick
13061da546Spatrick #include "lldb/Utility/Log.h"
14061da546Spatrick #include "lldb/Utility/StreamString.h"
15061da546Spatrick
16061da546Spatrick using namespace lldb_private;
17061da546Spatrick
Dump(Log * log)18061da546Spatrick void DiagnosticManager::Dump(Log *log) {
19061da546Spatrick if (!log)
20061da546Spatrick return;
21061da546Spatrick
22061da546Spatrick std::string str = GetString();
23061da546Spatrick
24061da546Spatrick // GetString() puts a separator after each diagnostic. We want to remove the
25061da546Spatrick // last '\n' because log->PutCString will add one for us.
26061da546Spatrick
27061da546Spatrick if (str.size() && str.back() == '\n') {
28061da546Spatrick str.pop_back();
29061da546Spatrick }
30061da546Spatrick
31061da546Spatrick log->PutCString(str.c_str());
32061da546Spatrick }
33061da546Spatrick
StringForSeverity(DiagnosticSeverity severity)34061da546Spatrick static const char *StringForSeverity(DiagnosticSeverity severity) {
35061da546Spatrick switch (severity) {
36061da546Spatrick // this should be exhaustive
37061da546Spatrick case lldb_private::eDiagnosticSeverityError:
38061da546Spatrick return "error: ";
39061da546Spatrick case lldb_private::eDiagnosticSeverityWarning:
40061da546Spatrick return "warning: ";
41061da546Spatrick case lldb_private::eDiagnosticSeverityRemark:
42061da546Spatrick return "";
43061da546Spatrick }
44061da546Spatrick llvm_unreachable("switch needs another case for DiagnosticSeverity enum");
45061da546Spatrick }
46061da546Spatrick
GetString(char separator)47061da546Spatrick std::string DiagnosticManager::GetString(char separator) {
48061da546Spatrick std::string ret;
49061da546Spatrick
50061da546Spatrick for (const auto &diagnostic : Diagnostics()) {
51061da546Spatrick ret.append(StringForSeverity(diagnostic->GetSeverity()));
52*dda28197Spatrick ret.append(std::string(diagnostic->GetMessage()));
53061da546Spatrick ret.push_back(separator);
54061da546Spatrick }
55061da546Spatrick
56061da546Spatrick return ret;
57061da546Spatrick }
58061da546Spatrick
Printf(DiagnosticSeverity severity,const char * format,...)59061da546Spatrick size_t DiagnosticManager::Printf(DiagnosticSeverity severity,
60061da546Spatrick const char *format, ...) {
61061da546Spatrick StreamString ss;
62061da546Spatrick
63061da546Spatrick va_list args;
64061da546Spatrick va_start(args, format);
65061da546Spatrick size_t result = ss.PrintfVarArg(format, args);
66061da546Spatrick va_end(args);
67061da546Spatrick
68061da546Spatrick AddDiagnostic(ss.GetString(), severity, eDiagnosticOriginLLDB);
69061da546Spatrick
70061da546Spatrick return result;
71061da546Spatrick }
72061da546Spatrick
PutString(DiagnosticSeverity severity,llvm::StringRef str)73061da546Spatrick void DiagnosticManager::PutString(DiagnosticSeverity severity,
74061da546Spatrick llvm::StringRef str) {
75061da546Spatrick if (str.empty())
76061da546Spatrick return;
77061da546Spatrick AddDiagnostic(str, severity, eDiagnosticOriginLLDB);
78061da546Spatrick }
79