| /* |
| * Copyright 2010, The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "slang_diagnostic_buffer.h" |
| |
| #include "clang/Basic/SourceLocation.h" |
| #include "clang/Basic/SourceManager.h" |
| |
| #include "llvm/ADT/SmallString.h" |
| |
| #include "slang_assert.h" |
| |
| namespace slang { |
| |
| DiagnosticBuffer::DiagnosticBuffer() |
| : mSOS(new llvm::raw_string_ostream(mDiags)) { |
| } |
| |
| DiagnosticBuffer::DiagnosticBuffer(DiagnosticBuffer const &src) |
| : clang::DiagnosticConsumer(src), |
| mDiags(src.mDiags), |
| mSOS(new llvm::raw_string_ostream(mDiags)) { |
| } |
| |
| DiagnosticBuffer::~DiagnosticBuffer() { |
| } |
| |
| void DiagnosticBuffer::HandleDiagnostic( |
| clang::DiagnosticsEngine::Level DiagLevel, |
| clang::Diagnostic const &Info) { |
| clang::SourceLocation const &SrcLoc = Info.getLocation(); |
| |
| // 100 is enough for storing general diagnosis message |
| llvm::SmallString<100> Buf; |
| |
| if (SrcLoc.isValid()) { |
| SrcLoc.print(*mSOS, Info.getSourceManager()); |
| (*mSOS) << ": "; |
| } |
| |
| switch (DiagLevel) { |
| case clang::DiagnosticsEngine::Note: { |
| (*mSOS) << "note: "; |
| break; |
| } |
| case clang::DiagnosticsEngine::Warning: { |
| (*mSOS) << "warning: "; |
| break; |
| } |
| case clang::DiagnosticsEngine::Error: { |
| (*mSOS) << "error: "; |
| break; |
| } |
| case clang::DiagnosticsEngine::Fatal: { |
| (*mSOS) << "fatal: "; |
| break; |
| } |
| default: { |
| slangAssert(0 && "Diagnostic not handled during diagnostic buffering!"); |
| } |
| } |
| |
| Info.FormatDiagnostic(Buf); |
| (*mSOS) << Buf.str() << '\n'; |
| } |
| |
| clang::DiagnosticConsumer * |
| DiagnosticBuffer::clone(clang::DiagnosticsEngine &Diags) const { |
| return new DiagnosticBuffer(*this); |
| } |
| |
| } // namespace slang |