1c383a500aa59423264811be3874461bf8adbfea0Zonr Chang/* 2c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Copyright 2010, The Android Open Source Project 3c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 4c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Licensed under the Apache License, Version 2.0 (the "License"); 5c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * you may not use this file except in compliance with the License. 6c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * You may obtain a copy of the License at 7c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 8c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * http://www.apache.org/licenses/LICENSE-2.0 9c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * 10c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * Unless required by applicable law or agreed to in writing, software 11c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * distributed under the License is distributed on an "AS IS" BASIS, 12c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * See the License for the specific language governing permissions and 14c383a500aa59423264811be3874461bf8adbfea0Zonr Chang * limitations under the License. 15c383a500aa59423264811be3874461bf8adbfea0Zonr Chang */ 16c383a500aa59423264811be3874461bf8adbfea0Zonr Chang 176315f76e3cc6ff2d012d1183a0b030d4ff0dc808zonr#include "slang_diagnostic_buffer.h" 18462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 199ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao#include "clang/Basic/SourceLocation.h" 20e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "clang/Basic/SourceManager.h" 21462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 22e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines#include "llvm/ADT/SmallString.h" 23e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 246e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines#include "slang_assert.h" 256e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines 26e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hinesnamespace slang { 27462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 289207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::DiagnosticBuffer() 29c86623eb960965b240bc5e929e760f6bbc1be544Logan Chien : mSOS(new llvm::raw_string_ostream(mDiags)) { 30462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 31462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 329207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::DiagnosticBuffer(DiagnosticBuffer const &src) 33c86623eb960965b240bc5e929e760f6bbc1be544Logan Chien : clang::DiagnosticConsumer(src), 34c86623eb960965b240bc5e929e760f6bbc1be544Logan Chien mDiags(src.mDiags), 35c86623eb960965b240bc5e929e760f6bbc1be544Logan Chien mSOS(new llvm::raw_string_ostream(mDiags)) { 369207a2e495c8363606861e4f034504ec5c153dabLogan Chien} 379207a2e495c8363606861e4f034504ec5c153dabLogan Chien 389207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::~DiagnosticBuffer() { 399207a2e495c8363606861e4f034504ec5c153dabLogan Chien} 409207a2e495c8363606861e4f034504ec5c153dabLogan Chien 419207a2e495c8363606861e4f034504ec5c153dabLogan Chienvoid DiagnosticBuffer::HandleDiagnostic( 42e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::DiagnosticsEngine::Level DiagLevel, 43e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines clang::Diagnostic const &Info) { 449207a2e495c8363606861e4f034504ec5c153dabLogan Chien clang::SourceLocation const &SrcLoc = Info.getLocation(); 459207a2e495c8363606861e4f034504ec5c153dabLogan Chien 469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao // 100 is enough for storing general diagnosis message 479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao llvm::SmallString<100> Buf; 489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 49be27482cdeaf08576bc39b72a15d35d13014a636Logan if (SrcLoc.isValid()) { 50be27482cdeaf08576bc39b72a15d35d13014a636Logan SrcLoc.print(*mSOS, Info.getSourceManager()); 519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << ": "; 529ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 539ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao 549ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao switch (DiagLevel) { 559207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Note: { 569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << "note: "; 579ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 58462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 599207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Warning: { 609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << "warning: "; 619ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 629ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 639207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Error: { 649ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << "error: "; 659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 669ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 679207a2e495c8363606861e4f034504ec5c153dabLogan Chien case clang::DiagnosticsEngine::Fatal: { 689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << "fatal: "; 699ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao break; 70462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao } 719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao default: { 726e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines slangAssert(0 && "Diagnostic not handled during diagnostic buffering!"); 739ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 749ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao } 75462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 769ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao Info.FormatDiagnostic(Buf); 779ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao (*mSOS) << Buf.str() << '\n'; 78462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao 809207a2e495c8363606861e4f034504ec5c153dabLogan Chienclang::DiagnosticConsumer * 819207a2e495c8363606861e4f034504ec5c153dabLogan ChienDiagnosticBuffer::clone(clang::DiagnosticsEngine &Diags) const { 829207a2e495c8363606861e4f034504ec5c153dabLogan Chien return new DiagnosticBuffer(*this); 83462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao} 84e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines 85e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines} // namespace slang 86