//===-- Declaration.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/Declaration.h"
#include "lldb/Core/Stream.h"

using namespace lldb_private;

void
Declaration::Dump(Stream *s, bool show_fullpaths) const
{
    if (m_file)
    {
        *s << ", decl = ";
        if (show_fullpaths)
            *s << m_file;
        else
            *s << m_file.GetFilename();
        if (m_line > 0)
            s->Printf(":%u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
    }
    else
    {
        if (m_line > 0)
        {
            s->Printf(", line = %u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
            if (m_column > 0)
                s->Printf(":%u", m_column);
#endif
        }
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        else if (m_column > 0)
            s->Printf(", column = %u", m_column);
#endif
    }
}

void
Declaration::DumpStopContext (Stream *s, bool show_fullpaths) const
{
    if (m_file)
    {
        if (show_fullpaths || s->GetVerbose())
            *s << m_file;
        else
            m_file.GetFilename().Dump(s);

        if (m_line > 0)
            s->Printf(":%u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
    }
    else
    {
        s->Printf(" line %u", m_line);
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
        if (m_column > 0)
            s->Printf(":%u", m_column);
#endif
    }
}

size_t
Declaration::MemorySize() const
{
    return sizeof(Declaration);
}

int
Declaration::Compare(const Declaration& a, const Declaration& b)
{
    int result = FileSpec::Compare(a.m_file, b.m_file, true);
    if (result)
        return result;
    if (a.m_line < b.m_line)
        return -1;
    else if (a.m_line > b.m_line)
        return 1;
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
    if (a.m_column < b.m_column)
        return -1;
    else if (a.m_column > b.m_column)
        return 1;
#endif
    return 0;
}

bool
lldb_private::operator == (const Declaration &lhs, const Declaration &rhs)
{
#ifdef LLDB_ENABLE_DECLARATION_COLUMNS
    if (lhs.GetColumn () == rhs.GetColumn ())
        if (lhs.GetLine () == rhs.GetLine ())
            return lhs.GetFile() == rhs.GetFile();
#else
    if (lhs.GetLine () == rhs.GetLine ())
        return lhs.GetFile() == rhs.GetFile();
#endif
    return false;
}

