//===-- ExceptionBreakpoint.cpp ---------------------------------*- C++ -*-===//
//
// 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 "ExceptionBreakpoint.h"
#include "BreakpointBase.h"
#include "VSCode.h"

namespace lldb_vscode {

void ExceptionBreakpoint::SetBreakpoint() {
  if (bp.IsValid())
    return;
  bool catch_value = filter.find("_catch") != std::string::npos;
  bool throw_value = filter.find("_throw") != std::string::npos;
  bp = g_vsc.target.BreakpointCreateForException(language, catch_value,
                                                 throw_value);
  // See comments in BreakpointBase::GetBreakpointLabel() for details of why
  // we add a label to our breakpoints.
  bp.AddName(BreakpointBase::GetBreakpointLabel());
}

void ExceptionBreakpoint::ClearBreakpoint() {
  if (!bp.IsValid())
    return;
  g_vsc.target.BreakpointDelete(bp.GetID());
  bp = lldb::SBBreakpoint();
}

} // namespace lldb_vscode
