//===- DiagnosticEngine.cpp -----------------------------------------------===//
//
//                     The MCLinker Project
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#include <mcld/LD/DiagnosticEngine.h>
#include <mcld/LD/DiagnosticPrinter.h>
#include <mcld/LD/DiagnosticLineInfo.h>
#include <mcld/MC/MCLDInfo.h>

using namespace mcld;

//===----------------------------------------------------------------------===//
// DiagnosticEngine
//===----------------------------------------------------------------------===//
DiagnosticEngine::DiagnosticEngine()
  : m_pLDInfo(NULL), m_pLineInfo(NULL), m_pPrinter(NULL),
    m_pInfoMap(NULL), m_OwnPrinter(false) {
}

DiagnosticEngine::~DiagnosticEngine()
{
  if (m_OwnPrinter && m_pPrinter != NULL)
    delete m_pPrinter;
}

void DiagnosticEngine::reset(const MCLDInfo& pLDInfo)
{
  m_pLDInfo = &pLDInfo;
  m_pInfoMap = new DiagnosticInfos(*m_pLDInfo);
  m_State.reset();
}

void DiagnosticEngine::setLineInfo(DiagnosticLineInfo& pLineInfo)
{
  m_pLineInfo = &pLineInfo;
}

void DiagnosticEngine::setPrinter(DiagnosticPrinter& pPrinter,
                                  bool pShouldOwnPrinter)
{
  if (m_OwnPrinter && NULL != m_pPrinter)
    delete m_pPrinter;
  m_pPrinter = &pPrinter;
  m_OwnPrinter = pShouldOwnPrinter;
}

// emit - process current diagnostic.
bool DiagnosticEngine::emit()
{
  bool emitted = m_pInfoMap->process(*this);
  m_State.reset();
  return emitted;
}