//===-- ScriptedBreakpointPythonInterface.h -----------------------*- 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
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDBREAKPOINTPYTHONINTERFACE_H
#define LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDBREAKPOINTPYTHONINTERFACE_H

#include "lldb/Interpreter/Interfaces/ScriptedBreakpointInterface.h"

#include "ScriptedPythonInterface.h"
namespace lldb_private {

class ScriptedBreakpointPythonInterface : public ScriptedBreakpointInterface,
                                          public ScriptedPythonInterface,
                                          public PluginInterface {
public:
  ScriptedBreakpointPythonInterface(ScriptInterpreterPythonImpl &interpreter);

  llvm::Expected<StructuredData::GenericSP>
  CreatePluginObject(const ScriptedMetadata &scripted_metadata,
                     lldb::BreakpointSP break_sp) override;

  llvm::SmallVector<AbstractMethodRequirement>
  GetAbstractMethodRequirements() const override {
    return llvm::SmallVector<AbstractMethodRequirement>({{"__callback__", 2}});
  }

  bool OverridesResolver(Target &target,
                         StructuredDataImpl &resolver_data) override;
  void SetBreakpoint(lldb::BreakpointSP break_sp) override;

  bool ResolverCallback(SymbolContext sym_ctx) override;
  lldb::SearchDepth GetDepth() override;
  std::optional<std::string> GetShortHelp() override;
  lldb::BreakpointLocationSP
  WasHit(lldb::StackFrameSP frame_sp,
         lldb::BreakpointLocationSP bp_loc_sp) override;
  virtual std::optional<std::string>
  GetLocationDescription(lldb::BreakpointLocationSP bp_loc_sp,
                         lldb::DescriptionLevel level) override;

  static void Initialize();

  static void Terminate();

  static llvm::StringRef GetPluginNameStatic() {
    return "ScriptedBreakpointPythonInterface";
  }

  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
};
} // namespace lldb_private

#endif // LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDBREAKPOINTPYTHONINTERFACE_H
