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