| #include "slang_diagnostic_buffer.hpp" |
| |
| #include "llvm/ADT/SmallString.h" /* for llvm::SmallString */ |
| |
| #include "clang/Basic/SourceManager.h" /* for class clang::SourceManager */ |
| #include "clang/Basic/SourceLocation.h" /* for class clang::SourceLocation, class clang::FullSourceLoc and class clang::PresumedLoc */ |
| |
| namespace slang { |
| |
| DiagnosticBuffer::DiagnosticBuffer() : mSOS(NULL) { |
| mSOS = new llvm::raw_string_ostream(mDiags); |
| return; |
| } |
| |
| void DiagnosticBuffer::HandleDiagnostic(Diagnostic::Level DiagLevel, const DiagnosticInfo &Info) { |
| const FullSourceLoc& FSLoc = Info.getLocation(); |
| llvm::SmallString<100> Buf; /* 100 is enough for storing general diagnosis message */ |
| |
| if (FSLoc.isValid()) { |
| FSLoc.print(*mSOS, FSLoc.getManager()); |
| (*mSOS) << ": "; |
| } |
| |
| switch(DiagLevel) { |
| case Diagnostic::Note: |
| (*mSOS) << "note: "; |
| break; |
| |
| case Diagnostic::Warning: |
| (*mSOS) << "warning: "; |
| break; |
| |
| case Diagnostic::Error: |
| (*mSOS) << "error: "; |
| break; |
| |
| case Diagnostic::Fatal: |
| (*mSOS) << "fatal: "; |
| break; |
| |
| default: |
| assert(0 && "Diagnostic not handled during diagnostic buffering!"); |
| break; |
| } |
| |
| |
| Info.FormatDiagnostic(Buf); |
| (*mSOS) << Buf.str() << '\n'; |
| |
| return; |
| } |
| |
| DiagnosticBuffer::~DiagnosticBuffer() { |
| if(mSOS != NULL) |
| delete mSOS; |
| return; |
| } |
| |
| } /* namespace slang */ |