//===- LookupResult.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 "llvm/DebugInfo/GSYM/LookupResult.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Format.h"
#include "llvm/Support/Path.h"
#include "llvm/Support/raw_ostream.h"
#include <ciso646>

using namespace llvm;
using namespace gsym;

std::string LookupResult::getSourceFile(uint32_t Index) const {
  std::string Fullpath;
  if (Index < Locations.size()) {
    if (!Locations[Index].Dir.empty()) {
      if (Locations[Index].Base.empty()) {
        Fullpath = Locations[Index].Dir;
      } else {
        llvm::SmallString<64> Storage;
        llvm::sys::path::append(Storage, Locations[Index].Dir,
                                Locations[Index].Base);
        Fullpath.assign(Storage.begin(), Storage.end());
      }
    } else if (!Locations[Index].Base.empty())
      Fullpath = Locations[Index].Base;
  }
  return Fullpath;
}

raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const SourceLocation &SL) {
  OS << SL.Name << " @ ";
  if (!SL.Dir.empty()) {
    OS << SL.Dir;
    if (SL.Dir.contains('\\') and not SL.Dir.contains('/'))
      OS << '\\';
    else
      OS << '/';
  }
  if (SL.Base.empty())
    OS << "<invalid-file>";
  else
    OS << SL.Base;
  OS << ':' << SL.Line;
  return OS;
}

raw_ostream &llvm::gsym::operator<<(raw_ostream &OS, const LookupResult &LR) {
  OS << HEX64(LR.LookupAddr) << ": ";
  auto NumLocations = LR.Locations.size();
  for (size_t I = 0; I < NumLocations; ++I) {
    if (I > 0) {
      OS << '\n';
      OS.indent(20);
    }
    const bool IsInlined = I + 1 != NumLocations;
    OS << LR.Locations[I];
    if (IsInlined)
      OS << " [inlined]";
  }
  OS << '\n';
  return OS;
}
