123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- /*
- * 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() {
- }
- void DiagnosticBuffer::HandleDiagnostic(
- clang::DiagnosticsEngine::Level DiagLevel,
- clang::Diagnostic const &Info) {
- clang::SourceLocation const &SrcLoc = Info.getLocation();
- std::string Message;
- llvm::raw_string_ostream stream(Message);
- if (SrcLoc.isValid()) {
- SrcLoc.print(stream, Info.getSourceManager());
- stream << ": ";
- }
- switch (DiagLevel) {
- case clang::DiagnosticsEngine::Note: {
- stream << "note: ";
- break;
- }
- case clang::DiagnosticsEngine::Warning: {
- stream << "warning: ";
- break;
- }
- case clang::DiagnosticsEngine::Error: {
- stream << "error: ";
- break;
- }
- case clang::DiagnosticsEngine::Fatal: {
- stream << "fatal: ";
- break;
- }
- default: {
- slangAssert(0 && "Diagnostic not handled during diagnostic buffering!");
- }
- }
- // 100 is enough for storing general diagnosis Message
- llvm::SmallString<100> Buf;
- Info.FormatDiagnostic(Buf);
- stream << Buf.str() << '\n';
- stream.flush();
- if (mIncludedMessages.find(Message) == mIncludedMessages.end()) {
- mIncludedMessages.insert(Message);
- (*mSOS) << Message;
- }
- }
- } // namespace slang
|