slang_diagnostic_buffer.cpp revision 462aefd62cc646d2ff753c1d003ef3cd7bbea26
1462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "slang_diagnostic_buffer.hpp" 2462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 3462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "llvm/ADT/SmallString.h" /* for llvm::SmallString */ 4462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 5462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Basic/SourceManager.h" /* for class clang::SourceManager */ 6462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao#include "clang/Basic/SourceLocation.h" /* for class clang::SourceLocation, class clang::FullSourceLoc and class clang::PresumedLoc */ 7462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 8462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaonamespace slang { 9462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 10462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoDiagnosticBuffer::DiagnosticBuffer() : mSOS(NULL) { 11462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao mSOS = new llvm::raw_string_ostream(mDiags); 12462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 13462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 14462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 15462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liaovoid DiagnosticBuffer::HandleDiagnostic(Diagnostic::Level DiagLevel, const DiagnosticInfo &Info) { 16462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao const FullSourceLoc& FSLoc = Info.getLocation(); 17462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao llvm::SmallString<100> Buf; /* 100 is enough for storing general diagnosis message */ 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 19462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(FSLoc.isValid()) { 20462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao /* This is a diagnosis for a source code */ 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao PresumedLoc PLoc = FSLoc.getManager().getPresumedLoc(FSLoc); 22462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << FSLoc.getManager().getBufferName(FSLoc) << ':' << PLoc.getLine() << ':' << PLoc.getColumn() << ": "; 23462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 24462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 25462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao switch(DiagLevel) { 26462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Diagnostic::Note: 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << "note: "; 28462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 29462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Diagnostic::Warning: 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << "warning: "; 32462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 33462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 34462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Diagnostic::Error: 35462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << "error: "; 36462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 37462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 38462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao case Diagnostic::Fatal: 39462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << "fatal: "; 40462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 41462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 42462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao default: 43462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao assert(0 && "Diagnostic not handled during diagnostic buffering!"); 44462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao break; 45462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 46462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 47462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 48462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao Info.FormatDiagnostic(Buf); 49462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao (*mSOS) << Buf.str() << '\n'; 50462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 51462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 53462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 54462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei LiaoDiagnosticBuffer::~DiagnosticBuffer() { 55462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao if(mSOS != NULL) 56462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao delete mSOS; 57462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao return; 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 59462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 60462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} /* namespace slang */ 61