#!/usr/bin/env python
from __future__ import print_function

import lldb
import shlex


def dump_module_sources(module, result):
    if module:
        print("Module: %s" % (module.file), file=result)
        for compile_unit in module.compile_units:
            if compile_unit.file:
                print("  %s" % (compile_unit.file), file=result)


def info_sources(debugger, command, result, dict):
    description = '''This command will dump all compile units in any modules that are listed as arguments, or for all modules if no arguments are supplied.'''
    module_names = shlex.split(command)
    target = debugger.GetSelectedTarget()
    if module_names:
        for module_name in module_names:
            dump_module_sources(target.module[module_name], result)
    else:
        for module in target.modules:
            dump_module_sources(module, result)


def __lldb_init_module(debugger, dict):
    # Add any commands contained in this module to LLDB
    debugger.HandleCommand(
        'command script add -f sources.info_sources info_sources')
    print('The "info_sources" command has been installed, type "help info_sources" or "info_sources --help" for detailed help.')
