import traceback

class Symbol(object):
    def __init__(self, anchor, type, cppname):
        self.anchor = anchor
        self.type = type
        self.cppname = cppname
        #if anchor == 'ga586ebfb0a7fb604b35a23d85391329be':
        #    print(repr(self))
        #    traceback.print_stack()

    def __repr__(self):
        return '%s:%s@%s' % (self.type, self.cppname, self.anchor)

def add_to_file(files_dict, file, anchor):
    anchors = files_dict.setdefault(file, [])
    anchors.append(anchor)


def scan_namespace_constants(ns, ns_name, files_dict):
    constants = ns.findall("./member[@kind='enumvalue']")
    for c in constants:
        c_name = c.find("./name").text
        name = ns_name + '::' + c_name
        file = c.find("./anchorfile").text
        anchor = c.find("./anchor").text
        #print('    CONST: {} => {}#{}'.format(name, file, anchor))
        add_to_file(files_dict, file, Symbol(anchor, "const", name))

def scan_namespace_functions(ns, ns_name, files_dict):
    functions = ns.findall("./member[@kind='function']")
    for f in functions:
        f_name = f.find("./name").text
        name = ns_name + '::' + f_name
        file = f.find("./anchorfile").text
        anchor = f.find("./anchor").text
        #print('    FN: {} => {}#{}'.format(name, file, anchor))
        add_to_file(files_dict, file, Symbol(anchor, "fn", name))

def scan_class_methods(c, c_name, files_dict):
    methods = c.findall("./member[@kind='function']")
    for m in methods:
        m_name = m.find("./name").text
        name = c_name + '::' + m_name
        file = m.find("./anchorfile").text
        anchor = m.find("./anchor").text
        #print('    Method: {} => {}#{}'.format(name, file, anchor))
        add_to_file(files_dict, file, Symbol(anchor, "method", name))