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