xref: /openbsd-src/gnu/llvm/lldb/source/Expression/DiagnosticManager.cpp (revision dda2819751e49c83612958492e38917049128b41)
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