//===----------------------------------------------------------------------===//
//
// 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_SCRIPTEDFRAMEPYTHONINTERFACE_H
#define LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPYTHONINTERFACE_H

#include "ScriptedPythonInterface.h"
#include "lldb/Interpreter/Interfaces/ScriptedFrameInterface.h"
#include <optional>

namespace lldb_private {
class ScriptedFramePythonInterface : public ScriptedFrameInterface,
                                     public ScriptedPythonInterface,
                                     public PluginInterface {
public:
  ScriptedFramePythonInterface(ScriptInterpreterPythonImpl &interpreter);

  llvm::Expected<StructuredData::GenericSP>
  CreatePluginObject(llvm::StringRef class_name, ExecutionContext &exe_ctx,
                     StructuredData::DictionarySP args_sp,
                     StructuredData::Generic *script_obj = nullptr) override;

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

  llvm::SmallVector<llvm::StringLiteral> GetOptionalMethods() const override {
    return {"get_plan_spec_for_step_type"};
  }

  lldb::user_id_t GetID() override;

  lldb::addr_t GetPC() override;

  lldb::addr_t GetCFA() override;

  std::optional<SymbolContext> GetSymbolContext() override;

  std::optional<std::string> GetFunctionName() override;

  std::optional<std::string> GetDisplayFunctionName() override;

  bool IsInlined() override;

  bool IsArtificial() override;

  bool IsHidden() override;

  StructuredData::DictionarySP GetRegisterInfo() override;

  std::optional<std::string> GetRegisterContext() override;

  lldb::ValueObjectListSP GetVariables() override;

  std::optional<lldb::ValueType>
  GetValueTypeForVariable(lldb::ValueObjectSP value) override;

  lldb::ValueObjectSP
  GetValueObjectForVariableExpression(llvm::StringRef expr, uint32_t options,
                                      Status &status) override;
  llvm::Expected<ScriptedMetadata>
  GetThreadPlanMetadataForStepType(lldb::StepType step_type) override;

  static void Initialize();

  static void Terminate();

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

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

#endif // LLDB_SOURCE_PLUGINS_SCRIPTINTERPRETER_PYTHON_INTERFACES_SCRIPTEDFRAMEPYTHONINTERFACE_H
