//===-- DebugMacros.cpp -----------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Symbol/DebugMacros.h"

#include "lldb/Symbol/CompileUnit.h"

using namespace lldb_private;

DebugMacroEntry::DebugMacroEntry(EntryType type,
                                 uint32_t line,
                                 uint32_t debug_line_file_idx,
                                 const char *str)
    : m_type(type),
      m_line(line),
      m_debug_line_file_idx(debug_line_file_idx),
      m_str(str)
{ }

DebugMacroEntry::DebugMacroEntry(EntryType type,
                                 const DebugMacrosSP &debug_macros_sp)
    : m_type(type), m_line(0), m_debug_line_file_idx(0), m_debug_macros_sp(debug_macros_sp)
{ }

const FileSpec&
DebugMacroEntry::GetFileSpec(CompileUnit *comp_unit) const
{
    return comp_unit->GetSupportFiles().GetFileSpecAtIndex(m_debug_line_file_idx);
}

DebugMacroEntry
DebugMacroEntry::CreateDefineEntry(uint32_t line, const char *str)
{
    return DebugMacroEntry(DebugMacroEntry::DEFINE, line, 0, str);
}

DebugMacroEntry
DebugMacroEntry::CreateUndefEntry(uint32_t line, const char *str)
{
    return DebugMacroEntry(DebugMacroEntry::UNDEF, line, 0, str);
}

DebugMacroEntry
DebugMacroEntry::CreateStartFileEntry(uint32_t line, uint32_t debug_line_file_idx)
{
    return DebugMacroEntry(DebugMacroEntry::START_FILE, line, debug_line_file_idx, nullptr);
}

DebugMacroEntry
DebugMacroEntry::CreateEndFileEntry()
{
    return DebugMacroEntry(DebugMacroEntry::END_FILE, 0, 0, nullptr);
}

DebugMacroEntry
DebugMacroEntry::CreateIndirectEntry(const DebugMacrosSP &debug_macros_sp)
{
    return DebugMacroEntry(DebugMacroEntry::INDIRECT, debug_macros_sp);
}
