126cac3afSEugene Zelenko //===-- CommandObjectPlugin.cpp ---------------------------------*- C++ -*-===//
221dfcd9dSEnrico Granata //
321dfcd9dSEnrico Granata //                     The LLVM Compiler Infrastructure
421dfcd9dSEnrico Granata //
521dfcd9dSEnrico Granata // This file is distributed under the University of Illinois Open Source
621dfcd9dSEnrico Granata // License. See LICENSE.TXT for details.
721dfcd9dSEnrico Granata //
821dfcd9dSEnrico Granata //===----------------------------------------------------------------------===//
921dfcd9dSEnrico Granata 
1026cac3afSEugene Zelenko // C Includes
1126cac3afSEugene Zelenko // C++ Includes
1226cac3afSEugene Zelenko // Other libraries and framework includes
1326cac3afSEugene Zelenko // Project includes
1421dfcd9dSEnrico Granata #include "CommandObjectPlugin.h"
1521dfcd9dSEnrico Granata #include "lldb/Host/Host.h"
1621dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h"
1721dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandReturnObject.h"
1821dfcd9dSEnrico Granata 
1921dfcd9dSEnrico Granata using namespace lldb;
2021dfcd9dSEnrico Granata using namespace lldb_private;
2121dfcd9dSEnrico Granata 
22b9c1b51eSKate Stone class CommandObjectPluginLoad : public CommandObjectParsed {
2321dfcd9dSEnrico Granata public:
24b9c1b51eSKate Stone   CommandObjectPluginLoad(CommandInterpreter &interpreter)
25b9c1b51eSKate Stone       : CommandObjectParsed(interpreter, "plugin load",
2621dfcd9dSEnrico Granata                             "Import a dylib that implements an LLDB plugin.",
27b9c1b51eSKate Stone                             nullptr) {
2821dfcd9dSEnrico Granata     CommandArgumentEntry arg1;
2921dfcd9dSEnrico Granata     CommandArgumentData cmd_arg;
3021dfcd9dSEnrico Granata 
3121dfcd9dSEnrico Granata     // Define the first (and only) variant of this arg.
3221dfcd9dSEnrico Granata     cmd_arg.arg_type = eArgTypeFilename;
3321dfcd9dSEnrico Granata     cmd_arg.arg_repetition = eArgRepeatPlain;
3421dfcd9dSEnrico Granata 
35b9c1b51eSKate Stone     // There is only one variant this argument could be; put it into the
36b9c1b51eSKate Stone     // argument entry.
3721dfcd9dSEnrico Granata     arg1.push_back(cmd_arg);
3821dfcd9dSEnrico Granata 
3921dfcd9dSEnrico Granata     // Push the data for the first argument into the m_arguments vector.
4021dfcd9dSEnrico Granata     m_arguments.push_back(arg1);
4121dfcd9dSEnrico Granata   }
4221dfcd9dSEnrico Granata 
4326cac3afSEugene Zelenko   ~CommandObjectPluginLoad() override = default;
4421dfcd9dSEnrico Granata 
45b9c1b51eSKate Stone   int HandleArgumentCompletion(Args &input, int &cursor_index,
4621dfcd9dSEnrico Granata                                int &cursor_char_position,
4721dfcd9dSEnrico Granata                                OptionElementVector &opt_element_vector,
48b9c1b51eSKate Stone                                int match_start_point, int max_return_elements,
4921dfcd9dSEnrico Granata                                bool &word_complete,
50b9c1b51eSKate Stone                                StringList &matches) override {
51*2c84f908SZachary Turner     auto completion_str = input[cursor_index].ref;
52*2c84f908SZachary Turner     completion_str = completion_str.take_front(cursor_char_position);
5321dfcd9dSEnrico Granata 
54b9c1b51eSKate Stone     CommandCompletions::InvokeCommonCompletionCallbacks(
55b9c1b51eSKate Stone         GetCommandInterpreter(), CommandCompletions::eDiskFileCompletion,
56*2c84f908SZachary Turner         completion_str, match_start_point, max_return_elements, nullptr,
57b9c1b51eSKate Stone         word_complete, matches);
5821dfcd9dSEnrico Granata     return matches.GetSize();
5921dfcd9dSEnrico Granata   }
6021dfcd9dSEnrico Granata 
6121dfcd9dSEnrico Granata protected:
62b9c1b51eSKate Stone   bool DoExecute(Args &command, CommandReturnObject &result) override {
6321dfcd9dSEnrico Granata     size_t argc = command.GetArgumentCount();
6421dfcd9dSEnrico Granata 
65b9c1b51eSKate Stone     if (argc != 1) {
6621dfcd9dSEnrico Granata       result.AppendError("'plugin load' requires one argument");
6721dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusFailed);
6821dfcd9dSEnrico Granata       return false;
6921dfcd9dSEnrico Granata     }
7021dfcd9dSEnrico Granata 
7121dfcd9dSEnrico Granata     Error error;
7221dfcd9dSEnrico Granata 
73*2c84f908SZachary Turner     FileSpec dylib_fspec(command[0].ref, true);
7421dfcd9dSEnrico Granata 
75e743c782SEnrico Granata     if (m_interpreter.GetDebugger().LoadPlugin(dylib_fspec, error))
7621dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusSuccessFinishResult);
77b9c1b51eSKate Stone     else {
78e743c782SEnrico Granata       result.AppendError(error.AsCString());
7921dfcd9dSEnrico Granata       result.SetStatus(eReturnStatusFailed);
80e743c782SEnrico Granata     }
8121dfcd9dSEnrico Granata 
8221dfcd9dSEnrico Granata     return result.Succeeded();
8321dfcd9dSEnrico Granata   }
8421dfcd9dSEnrico Granata };
8521dfcd9dSEnrico Granata 
867428a18cSKate Stone CommandObjectPlugin::CommandObjectPlugin(CommandInterpreter &interpreter)
87b9c1b51eSKate Stone     : CommandObjectMultiword(interpreter, "plugin",
88b9c1b51eSKate Stone                              "Commands for managing LLDB plugins.",
89b9c1b51eSKate Stone                              "plugin <subcommand> [<subcommand-options>]") {
90b9c1b51eSKate Stone   LoadSubCommand("load",
91b9c1b51eSKate Stone                  CommandObjectSP(new CommandObjectPluginLoad(interpreter)));
9221dfcd9dSEnrico Granata }
9321dfcd9dSEnrico Granata 
9426cac3afSEugene Zelenko CommandObjectPlugin::~CommandObjectPlugin() = default;
95