forked from OSchip/llvm-project
104 lines
3.4 KiB
C++
104 lines
3.4 KiB
C++
//===-- CommandObjectSyntax.cpp ---------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
// C Includes
|
|
// C++ Includes
|
|
// Other libraries and framework includes
|
|
// Project includes
|
|
#include "CommandObjectSyntax.h"
|
|
#include "CommandObjectHelp.h"
|
|
#include "lldb/Interpreter/Args.h"
|
|
#include "lldb/Interpreter/CommandInterpreter.h"
|
|
#include "lldb/Interpreter/CommandObjectMultiword.h"
|
|
#include "lldb/Interpreter/CommandReturnObject.h"
|
|
#include "lldb/Interpreter/Options.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
//-------------------------------------------------------------------------
|
|
// CommandObjectSyntax
|
|
//-------------------------------------------------------------------------
|
|
|
|
CommandObjectSyntax::CommandObjectSyntax(CommandInterpreter &interpreter)
|
|
: CommandObjectParsed(
|
|
interpreter, "syntax",
|
|
"Shows the correct syntax for a given debugger command.",
|
|
"syntax <command>") {
|
|
CommandArgumentEntry arg;
|
|
CommandArgumentData command_arg;
|
|
|
|
// Define the first (and only) variant of this arg.
|
|
command_arg.arg_type = eArgTypeCommandName;
|
|
command_arg.arg_repetition = eArgRepeatPlain;
|
|
|
|
// There is only one variant this argument could be; put it into the argument
|
|
// entry.
|
|
arg.push_back(command_arg);
|
|
|
|
// Push the data for the first argument into the m_arguments vector.
|
|
m_arguments.push_back(arg);
|
|
}
|
|
|
|
CommandObjectSyntax::~CommandObjectSyntax() = default;
|
|
|
|
bool CommandObjectSyntax::DoExecute(Args &command,
|
|
CommandReturnObject &result) {
|
|
CommandObject::CommandMap::iterator pos;
|
|
CommandObject *cmd_obj;
|
|
const size_t argc = command.GetArgumentCount();
|
|
|
|
if (argc == 0) {
|
|
result.AppendError("Must call 'syntax' with a valid command.");
|
|
result.SetStatus(eReturnStatusFailed);
|
|
return false;
|
|
}
|
|
|
|
cmd_obj = m_interpreter.GetCommandObject(command[0].ref);
|
|
bool all_okay = llvm::all_of(
|
|
command.entries().drop_front(), [&cmd_obj](const Args::ArgEntry &e) {
|
|
if (!cmd_obj || !cmd_obj->IsMultiwordObject())
|
|
return false;
|
|
|
|
if (!(cmd_obj = cmd_obj->GetSubcommandObject(e.ref)))
|
|
return false;
|
|
|
|
return true;
|
|
});
|
|
|
|
if (!all_okay) {
|
|
std::string cmd_string;
|
|
command.GetCommandString(cmd_string);
|
|
|
|
StreamString error_msg_stream;
|
|
const bool generate_apropos = true;
|
|
const bool generate_type_lookup = false;
|
|
CommandObjectHelp::GenerateAdditionalHelpAvenuesMessage(
|
|
&error_msg_stream, cmd_string, "", "", generate_apropos,
|
|
generate_type_lookup);
|
|
result.AppendErrorWithFormat("%s", error_msg_stream.GetData());
|
|
result.SetStatus(eReturnStatusFailed);
|
|
return false;
|
|
}
|
|
|
|
Stream &output_strm = result.GetOutputStream();
|
|
if (cmd_obj->GetOptions() != nullptr) {
|
|
output_strm.Printf("\nSyntax: %s\n", cmd_obj->GetSyntax().str().c_str());
|
|
output_strm.Printf(
|
|
"(Try 'help %s' for more information on command options syntax.)\n",
|
|
cmd_obj->GetCommandName().str().c_str());
|
|
result.SetStatus(eReturnStatusSuccessFinishNoResult);
|
|
} else {
|
|
output_strm.Printf("\nSyntax: %s\n", cmd_obj->GetSyntax().str().c_str());
|
|
result.SetStatus(eReturnStatusSuccessFinishNoResult);
|
|
}
|
|
|
|
return result.Succeeded();
|
|
}
|