
from __future__ import print_function

import lldb

# bunch of different kinds of python callables that should
# all work as commands.

def check(debugger, command, context, result, internal_dict):
    if (not isinstance(debugger, lldb.SBDebugger) or
        not isinstance(command, str) or
        not isinstance(result, lldb.SBCommandReturnObject) or
        not isinstance(internal_dict, dict) or
        (not context is None and
        not isinstance(context, lldb.SBExecutionContext))):
      raise Exception()
    result.AppendMessage("All good.")

def vfoobar(*args):
    check(*args)

def v5foobar(debugger, command, context, result, internal_dict, *args):
    check(debugger, command, context, result, internal_dict)

def foobar(debugger, command, context, result, internal_dict):
    check(debugger, command, context, result, internal_dict)

def foobar4(debugger, command, result, internal_dict):
    check(debugger, command, None, result, internal_dict)

class FooBar:
    @staticmethod
    def sfoobar(debugger, command, context, result, internal_dict):
      check(debugger, command, context, result, internal_dict)

    @classmethod
    def cfoobar(cls, debugger, command, context, result, internal_dict):
      check(debugger, command, context, result, internal_dict)

    def ifoobar(self, debugger, command, context, result, internal_dict):
      check(debugger, command, context, result, internal_dict)

    def __call__(self, debugger, command, context, result, internal_dict):
      check(debugger, command, context, result, internal_dict)

    @staticmethod
    def sfoobar4(debugger, command, result, internal_dict):
      check(debugger, command, None, result, internal_dict)

    @classmethod
    def cfoobar4(cls, debugger, command, result, internal_dict):
      check(debugger, command, None, result, internal_dict)

    def ifoobar4(self, debugger, command, result, internal_dict):
      check(debugger, command, None, result, internal_dict)

class FooBar4:
    def __call__(self, debugger, command, result, internal_dict):
      check(debugger, command, None, result, internal_dict)

FooBarObj = FooBar()

FooBar4Obj = FooBar4()