slang_diagnostic_buffer.cpp revision 3a9ca1f0d6bd8f12c2bb2adea51f95c255996180
1#include "slang_diagnostic_buffer.h"
2
3#include "llvm/ADT/SmallString.h"
4
5#include "clang/Basic/SourceManager.h"
6#include "clang/Basic/SourceLocation.h"
7
8using namespace slang;
9
10DiagnosticBuffer::DiagnosticBuffer() : mSOS(NULL) {
11  mSOS = new llvm::raw_string_ostream(mDiags);
12  return;
13}
14
15void DiagnosticBuffer::HandleDiagnostic(clang::Diagnostic::Level DiagLevel,
16                                        const clang::DiagnosticInfo &Info) {
17  const clang::FullSourceLoc &FSLoc = Info.getLocation();
18  // 100 is enough for storing general diagnosis message
19  llvm::SmallString<100> Buf;
20
21  if (FSLoc.isValid()) {
22    FSLoc.print(*mSOS, FSLoc.getManager());
23    (*mSOS) << ": ";
24  }
25
26  switch (DiagLevel) {
27    case clang::Diagnostic::Note: {
28      (*mSOS) << "note: ";
29      break;
30    }
31    case clang::Diagnostic::Warning: {
32      (*mSOS) << "warning: ";
33      break;
34    }
35    case clang::Diagnostic::Error: {
36      (*mSOS) << "error: ";
37      break;
38    }
39    case clang::Diagnostic::Fatal: {
40      (*mSOS) << "fatal: ";
41      break;
42    }
43    default: {
44      assert(0 && "Diagnostic not handled during diagnostic buffering!");
45    }
46  }
47
48
49  Info.FormatDiagnostic(Buf);
50  (*mSOS) << Buf.str() << '\n';
51
52  return;
53}
54
55DiagnosticBuffer::~DiagnosticBuffer() {
56  delete mSOS;
57  return;
58}
59