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