import lldb


class jasSynthProvider:
    def __init__(self, valobj, dict):
        self.valobj = valobj

    def num_children(self):
        return 2

    def get_child_at_index(self, index):
        child = None
        if index == 0:
            child = self.valobj.GetChildMemberWithName("A")
        if index == 1:
            child = self.valobj.CreateValueFromExpression("X", "(int)1")
        return child

    def get_child_index(self, name):
        if name == "A":
            return 0
        if name == "X":
            return 1
        return None


def ccc_summary(sbvalue, internal_dict):
    sbvalue = sbvalue.GetNonSyntheticValue()
    # This tests that the SBValue.GetNonSyntheticValue() actually returns a
    # non-synthetic value. If it does not, then sbvalue.GetChildMemberWithName("a")
    # in the following statement will call the 'get_child_index' method of the
    # synthetic child provider CCCSynthProvider below (which raises an
    # exception).
    return "CCC object with leading value " + str(sbvalue.GetChildMemberWithName("a"))


class CCCSynthProvider(object):
    def __init__(self, sbvalue, internal_dict):
        self._sbvalue = sbvalue

    def num_children(self):
        return 3

    def get_child_index(self, name):
        raise RuntimeError("I don't want to be called!")

    def get_child_at_index(self, index):
        if index == 0:
            return self._sbvalue.GetChildMemberWithName("a")
        if index == 1:
            return self._sbvalue.GetChildMemberWithName("b")
        if index == 2:
            return self._sbvalue.GetChildMemberWithName("c")


def empty1_summary(sbvalue, internal_dict):
    return "I am an empty Empty1"


class Empty1SynthProvider(object):
    def __init__(self, sbvalue, internal_dict):
        self._sbvalue = sbvalue

    def num_children(self):
        return 0

    def get_child_at_index(self, index):
        return None


def empty2_summary(sbvalue, internal_dict):
    return "I am an empty Empty2"


class Empty2SynthProvider(object):
    def __init__(self, sbvalue, internal_dict):
        self._sbvalue = sbvalue

    def num_children(self):
        return 0

    def get_child_at_index(self, index):
        return None


def __lldb_init_module(debugger, dict):
    debugger.CreateCategory("JASSynth").AddTypeSynthetic(
        lldb.SBTypeNameSpecifier("JustAStruct"),
        lldb.SBTypeSynthetic.CreateWithClassName("synth.jasSynthProvider"),
    )
    cat = debugger.CreateCategory("CCCSynth")
    cat.AddTypeSynthetic(
        lldb.SBTypeNameSpecifier("CCC"),
        lldb.SBTypeSynthetic.CreateWithClassName(
            "synth.CCCSynthProvider", lldb.eTypeOptionCascade
        ),
    )
    cat.AddTypeSummary(
        lldb.SBTypeNameSpecifier("CCC"),
        lldb.SBTypeSummary.CreateWithFunctionName(
            "synth.ccc_summary", lldb.eTypeOptionCascade
        ),
    )
    cat.AddTypeSynthetic(
        lldb.SBTypeNameSpecifier("Empty1"),
        lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty1SynthProvider"),
    )
    cat.AddTypeSummary(
        lldb.SBTypeNameSpecifier("Empty1"),
        lldb.SBTypeSummary.CreateWithFunctionName("synth.empty1_summary"),
    )
    cat.AddTypeSynthetic(
        lldb.SBTypeNameSpecifier("Empty2"),
        lldb.SBTypeSynthetic.CreateWithClassName("synth.Empty2SynthProvider"),
    )
    cat.AddTypeSummary(
        lldb.SBTypeNameSpecifier("Empty2"),
        lldb.SBTypeSummary.CreateWithFunctionName(
            "synth.empty2_summary", lldb.eTypeOptionHideEmptyAggregates
        ),
    )
