//===-- CommandObjectCrossref.cpp -------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "lldb/Interpreter/CommandObjectCrossref.h"

// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/Interpreter/CommandReturnObject.h"

using namespace lldb;
using namespace lldb_private;

//-------------------------------------------------------------------------
// CommandObjectCrossref
//-------------------------------------------------------------------------

CommandObjectCrossref::CommandObjectCrossref
(
    CommandInterpreter &interpreter,
    const char *name,
    const char *help,
    const char *syntax
) :
    CommandObject (interpreter, name, help, syntax),
    m_crossref_object_types()
{
}

CommandObjectCrossref::~CommandObjectCrossref ()
{
}

bool
CommandObjectCrossref::Execute
(
    Args& command,
    CommandReturnObject &result
)
{
    if (m_crossref_object_types.GetArgumentCount() == 0)
    {
        result.AppendErrorWithFormat ("There are no objects for which you can call '%s'.\n", GetCommandName());
        result.SetStatus (eReturnStatusFailed);
    }
    else
    {
        GenerateHelpText (result);
    }
    return result.Succeeded();
}

void
CommandObjectCrossref::AddObject (const char *obj_name)
{
    m_crossref_object_types.AppendArgument (obj_name);
}

const char **
CommandObjectCrossref::GetObjectTypes () const
{
    return m_crossref_object_types.GetConstArgumentVector();
}

void
CommandObjectCrossref::GenerateHelpText (CommandReturnObject &result)
{
    result.AppendMessage ("This command can be called on the following types of objects:");

    const size_t count = m_crossref_object_types.GetArgumentCount();
    for (size_t i = 0; i < count; ++i)
    {
        const char *obj_name = m_crossref_object_types.GetArgumentAtIndex(i);
        result.AppendMessageWithFormat ("    %s    (e.g.  '%s %s')\n", obj_name,
                                        obj_name, GetCommandName());
    }

    result.SetStatus (eReturnStatusSuccessFinishNoResult);
}

bool
CommandObjectCrossref::IsCrossRefObject ()
{
    return true;
}
