#!/usr/bin/python

import lldb
import shlex

@lldb.command("shadow")
def check_shadow_command(debugger, command, exe_ctx, result, dict):
    '''Check the currently selected stack frame for shadowed variables'''
    process = exe_ctx.GetProcess()
    state = process.GetState()
    if state != lldb.eStateStopped:
        print >>result, "process must be stopped, state is %s" % lldb.SBDebugger.StateAsCString(state)
        return        
    frame = exe_ctx.GetFrame()
    if not frame:
        print >>result, "invalid frame"
        return
    # Parse command line args
    command_args = shlex.split(command)
    # TODO: add support for using arguments that are passed to this command...
    
    # Make a dictionary of variable name to "SBBlock and SBValue"
    shadow_dict = {}
    
    num_shadowed_variables = 0
    # Get the deepest most block from the current frame
    block = frame.GetBlock()
    # Iterate through the block and all of its parents
    while block.IsValid():
        # Get block variables from the current block only
        block_vars = block.GetVariables(frame, True, True, True, 0)
        # Iterate through all variables in the current block
        for block_var in block_vars:
            # Since we can have multiple shadowed variables, we our variable
            # name dictionary to have an array or "block + variable" pairs so
            # We can correctly print out all shadowed variables and whow which
            # blocks they come from
            block_var_name = block_var.GetName()
            if block_var_name in shadow_dict:
                shadow_dict[block_var_name].append(block_var)
            else:
                shadow_dict[block_var_name] = [block_var]
        # Get the parent block and continue 
        block = block.GetParent()

    num_shadowed_variables = 0
    if shadow_dict:
        for name in shadow_dict.keys():
            shadow_vars = shadow_dict[name]
            if len(shadow_vars) > 1:
                print '"%s" is shadowed by the following declarations:' % (name)
                num_shadowed_variables += 1
                for shadow_var in shadow_vars:
                    print >>result, str(shadow_var.GetDeclaration())
    if num_shadowed_variables == 0:
        print >>result, 'no variables are shadowed'

