//===-- Declaration.cpp ---------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#include "lldb/Core/Declaration.h"
#include "lldb/Utility/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);
    if (m_column != LLDB_INVALID_COLUMN_NUMBER)
      s->Printf(":%u", m_column);
  } else {
    if (m_line > 0) {
      s->Printf(", line = %u", m_line);
      if (m_column != LLDB_INVALID_COLUMN_NUMBER)
        s->Printf(":%u", m_column);
    } else if (m_column != LLDB_INVALID_COLUMN_NUMBER)
      s->Printf(", column = %u", m_column);
  }
}

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

    if (m_line > 0)
      s->Printf(":%u", m_line);
    if (m_column != LLDB_INVALID_COLUMN_NUMBER)
      s->Printf(":%u", m_column);
    return true;
  } else if (m_line > 0) {
    s->Printf(" line %u", m_line);
    if (m_column != LLDB_INVALID_COLUMN_NUMBER)
      s->Printf(":%u", m_column);
    return true;
  }
  return false;
}

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;
  if (a.m_column < b.m_column)
    return -1;
  else if (a.m_column > b.m_column)
    return 1;
  return 0;
}

bool Declaration::FileAndLineEqual(const Declaration &declaration,
                                   bool full) const {
  int file_compare = FileSpec::Compare(this->m_file, declaration.m_file, full);
  return file_compare == 0 && this->m_line == declaration.m_line;
}

bool lldb_private::operator==(const Declaration &lhs, const Declaration &rhs) {
  if (lhs.GetColumn() != rhs.GetColumn())
    return false;

  return lhs.GetLine() == rhs.GetLine() && lhs.GetFile() == rhs.GetFile();
}
