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() {
339207a2e495c8363606861e4f034504ec5c153dabLogan Chien}
349207a2e495c8363606861e4f034504ec5c153dabLogan Chien
359207a2e495c8363606861e4f034504ec5c153dabLogan Chienvoid DiagnosticBuffer::HandleDiagnostic(
36e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines    clang::DiagnosticsEngine::Level DiagLevel,
37e67239de8d94975e7e2216ee6860ae2e6cb8b15aStephen Hines    clang::Diagnostic const &Info) {
389207a2e495c8363606861e4f034504ec5c153dabLogan Chien  clang::SourceLocation const &SrcLoc = Info.getLocation();
399207a2e495c8363606861e4f034504ec5c153dabLogan Chien
405309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  std::string Message;
415309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::raw_string_ostream stream(Message);
429ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
43be27482cdeaf08576bc39b72a15d35d13014a636Logan  if (SrcLoc.isValid()) {
445309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    SrcLoc.print(stream, Info.getSourceManager());
455309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    stream << ": ";
469ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
479ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao
489ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  switch (DiagLevel) {
499207a2e495c8363606861e4f034504ec5c153dabLogan Chien    case clang::DiagnosticsEngine::Note: {
505309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      stream << "note: ";
519ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
52462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
539207a2e495c8363606861e4f034504ec5c153dabLogan Chien    case clang::DiagnosticsEngine::Warning: {
545309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      stream << "warning: ";
559ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
569ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
579207a2e495c8363606861e4f034504ec5c153dabLogan Chien    case clang::DiagnosticsEngine::Error: {
585309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      stream << "error: ";
599ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
609ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
619207a2e495c8363606861e4f034504ec5c153dabLogan Chien    case clang::DiagnosticsEngine::Fatal: {
625309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet      stream << "fatal: ";
639ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao      break;
64462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao    }
659ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    default: {
666e6578a360497f78a181e63d7783422a9c9bfb15Stephen Hines      slangAssert(0 && "Diagnostic not handled during diagnostic buffering!");
679ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao    }
689ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  }
695309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  // 100 is enough for storing general diagnosis Message
705309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  llvm::SmallString<100> Buf;
719ef2f785e0cc490af678dfd685995dec787321ffShih-wei Liao  Info.FormatDiagnostic(Buf);
725309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  stream << Buf.str() << '\n';
735309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  stream.flush();
74462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao
755309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  if (mIncludedMessages.find(Message) == mIncludedMessages.end()) {
765309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    mIncludedMessages.insert(Message);
775309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet    (*mSOS) << Message;
785309b0cbeda2c75eedf6627e06f4471c77f98f83Jean-Luc Brouillet  }
79462aefd62cc646d2ff753c1d003ef3cd7bbea26Shih-wei Liao}
80e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines
81e639eb5caa2c386b4a60659a4929e8a6141a2cbeStephen Hines}  // namespace slang
82