//===- 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/LD/MsgHandler.h>
#include <mcld/LinkerConfig.h>

#include <cassert>

using namespace mcld;

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

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

  delete m_pInfoMap;

  // FIXME: design the destructive relation of LineInfo.
  delete m_pLineInfo;
}

void DiagnosticEngine::reset(const LinkerConfig& pConfig)
{
  m_pConfig = &pConfig;
  delete m_pInfoMap;
  m_pInfoMap = new DiagnosticInfos(*m_pConfig);
  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()
{
  assert(NULL != m_pInfoMap);
  bool emitted = m_pInfoMap->process(*this);
  m_State.reset();
  return emitted;
}

MsgHandler
DiagnosticEngine::report(uint16_t pID, DiagnosticEngine::Severity pSeverity)
{
  m_State.ID = pID;
  m_State.severity = pSeverity;

  MsgHandler result(*this);
  return result;
}

