//===-- BreakpointName.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/Support/Casting.h"

#include "lldb/Breakpoint/Breakpoint.h"
#include "lldb/Breakpoint/BreakpointOptions.h"
#include "lldb/Breakpoint/BreakpointLocationCollection.h"
#include "lldb/Breakpoint/BreakpointResolver.h"
#include "lldb/Breakpoint/BreakpointResolverFileLine.h"
#include "lldb/Utility/Log.h"
#include "lldb/Utility/Stream.h"
#include "lldb/Utility/StreamString.h"

using namespace lldb;
using namespace lldb_private;

const Flags::ValueType BreakpointName::Permissions::permissions_mask
    [BreakpointName::Permissions::PermissionKinds::allPerms + 1] =  { 
      (1u << 0),
      (1u << 1),
      (1u << 2),
      (0x5u)
};

BreakpointName::BreakpointName(ConstString name, const Breakpoint &bkpt,
                 const char *help) :
      m_name(name), m_options(bkpt.GetOptions())
{
  SetHelp(help);
}

bool BreakpointName::Permissions::GetDescription(Stream *s,
                                                 lldb::DescriptionLevel level) {
    if (!AnySet())
      return false;
    s->IndentMore();
    s->Indent();
    if (IsSet(listPerm))
      s->Printf("list: %s", GetAllowList() ? "allowed" : "disallowed");
  
    if (IsSet(disablePerm))
      s->Printf("disable: %s", GetAllowDisable() ? "allowed" : "disallowed");
  
    if (IsSet(deletePerm))
      s->Printf("delete: %s", GetAllowDelete() ? "allowed" : "disallowed");
    s->IndentLess();
    return true;
}

bool BreakpointName::GetDescription(Stream *s, lldb::DescriptionLevel level) {
  bool printed_any = false;
  if (!m_help.empty())
    s->Printf("Help: %s\n", m_help.c_str());

  if (GetOptions().AnySet())
  {
    s->PutCString("Options: \n");
    s->IndentMore();
    s->Indent();
    GetOptions().GetDescription(s, level);
    printed_any = true;
    s->IndentLess();
  }
  if (GetPermissions().AnySet())
  {
    s->PutCString("Permissions: \n");
    s->IndentMore();
    s->Indent();
    GetPermissions().GetDescription(s, level);
    printed_any = true;
    s->IndentLess();
 }
  return printed_any;
}

void BreakpointName::ConfigureBreakpoint(lldb::BreakpointSP bp_sp)
{
  bp_sp->GetOptions().CopyOverSetOptions(GetOptions());
  bp_sp->GetPermissions().MergeInto(GetPermissions());
}
