180814287SRaphael Isemann //===-- SBCommandInterpreter.cpp ------------------------------------------===//
230fdc8d8SChris Lattner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
630fdc8d8SChris Lattner //
730fdc8d8SChris Lattner //===----------------------------------------------------------------------===//
830fdc8d8SChris Lattner 
930fdc8d8SChris Lattner #include "lldb/lldb-types.h"
102c1f46dcSZachary Turner 
1130fdc8d8SChris Lattner #include "lldb/Interpreter/CommandInterpreter.h"
1221dfcd9dSEnrico Granata #include "lldb/Interpreter/CommandObjectMultiword.h"
1330fdc8d8SChris Lattner #include "lldb/Interpreter/CommandReturnObject.h"
1430fdc8d8SChris Lattner #include "lldb/Target/Target.h"
151755f5b1SJonas Devlieghere #include "lldb/Utility/Instrumentation.h"
16181b823bSPavel Labath #include "lldb/Utility/Listener.h"
1730fdc8d8SChris Lattner 
18ca93cc1dSEli Friedman #include "lldb/API/SBBroadcaster.h"
19ca93cc1dSEli Friedman #include "lldb/API/SBCommandInterpreter.h"
204b354039SJonas Devlieghere #include "lldb/API/SBCommandInterpreterRunOptions.h"
21b9c1b51eSKate Stone #include "lldb/API/SBCommandReturnObject.h"
22af10e1ceSIlia K #include "lldb/API/SBEvent.h"
23ffc9f1deSJim Ingham #include "lldb/API/SBExecutionContext.h"
24ca93cc1dSEli Friedman #include "lldb/API/SBListener.h"
25b9c1b51eSKate Stone #include "lldb/API/SBProcess.h"
26ceb6b139SCaroline Tice #include "lldb/API/SBStream.h"
27ca93cc1dSEli Friedman #include "lldb/API/SBStringList.h"
28b9c1b51eSKate Stone #include "lldb/API/SBTarget.h"
2930fdc8d8SChris Lattner 
30796ac80bSJonas Devlieghere #include <memory>
31796ac80bSJonas Devlieghere 
3230fdc8d8SChris Lattner using namespace lldb;
3330fdc8d8SChris Lattner using namespace lldb_private;
3430fdc8d8SChris Lattner 
35b9c1b51eSKate Stone class CommandPluginInterfaceImplementation : public CommandObjectParsed {
3621dfcd9dSEnrico Granata public:
CommandPluginInterfaceImplementation(CommandInterpreter & interpreter,const char * name,lldb::SBCommandPluginInterface * backend,const char * help=nullptr,const char * syntax=nullptr,uint32_t flags=0,const char * auto_repeat_command="")3721dfcd9dSEnrico Granata   CommandPluginInterfaceImplementation(CommandInterpreter &interpreter,
3821dfcd9dSEnrico Granata                                        const char *name,
3921dfcd9dSEnrico Granata                                        lldb::SBCommandPluginInterface *backend,
40dbb0abbfSEugene Zelenko                                        const char *help = nullptr,
41dbb0abbfSEugene Zelenko                                        const char *syntax = nullptr,
42be3f8a8eSWalter Erquinigo                                        uint32_t flags = 0,
43be3f8a8eSWalter Erquinigo                                        const char *auto_repeat_command = "")
44b9c1b51eSKate Stone       : CommandObjectParsed(interpreter, name, help, syntax, flags),
45be3f8a8eSWalter Erquinigo         m_backend(backend) {
46be3f8a8eSWalter Erquinigo     m_auto_repeat_command =
47be3f8a8eSWalter Erquinigo         auto_repeat_command == nullptr
48be3f8a8eSWalter Erquinigo             ? llvm::None
49be3f8a8eSWalter Erquinigo             : llvm::Optional<std::string>(auto_repeat_command);
50*c1b07d61SJim Ingham     // We don't know whether any given command coming from this interface takes
51*c1b07d61SJim Ingham     // arguments or not so here we're just disabling the basic args check.
52*c1b07d61SJim Ingham     CommandArgumentData none_arg{eArgTypeNone, eArgRepeatStar};
53*c1b07d61SJim Ingham     m_arguments.push_back({none_arg});
54be3f8a8eSWalter Erquinigo   }
5521dfcd9dSEnrico Granata 
IsRemovable() const56b9c1b51eSKate Stone   bool IsRemovable() const override { return true; }
5721dfcd9dSEnrico Granata 
58be3f8a8eSWalter Erquinigo   /// More documentation is available in lldb::CommandObject::GetRepeatCommand,
59635f03feSJim Ingham   /// but in short, if llvm::None is returned, the previous command will be
60be3f8a8eSWalter Erquinigo   /// repeated, and if an empty string is returned, no commands will be
61be3f8a8eSWalter Erquinigo   /// executed.
GetRepeatCommand(Args & current_command_args,uint32_t index)62635f03feSJim Ingham   llvm::Optional<std::string> GetRepeatCommand(Args &current_command_args,
63be3f8a8eSWalter Erquinigo                                                uint32_t index) override {
64be3f8a8eSWalter Erquinigo     if (!m_auto_repeat_command)
65635f03feSJim Ingham       return llvm::None;
66be3f8a8eSWalter Erquinigo     else
67635f03feSJim Ingham       return m_auto_repeat_command;
68be3f8a8eSWalter Erquinigo   }
69be3f8a8eSWalter Erquinigo 
7021dfcd9dSEnrico Granata protected:
DoExecute(Args & command,CommandReturnObject & result)71b9c1b51eSKate Stone   bool DoExecute(Args &command, CommandReturnObject &result) override {
724112b473SJan Kratochvil     SBCommandReturnObject sb_return(result);
7321dfcd9dSEnrico Granata     SBCommandInterpreter sb_interpreter(&m_interpreter);
7421dfcd9dSEnrico Granata     SBDebugger debugger_sb(m_interpreter.GetDebugger().shared_from_this());
75b9c1b51eSKate Stone     bool ret = m_backend->DoExecute(
76fc1d95ebSRaphael Isemann         debugger_sb, command.GetArgumentVector(), sb_return);
7721dfcd9dSEnrico Granata     return ret;
7821dfcd9dSEnrico Granata   }
79f605c198SAbhishek Aggarwal   std::shared_ptr<lldb::SBCommandPluginInterface> m_backend;
80be3f8a8eSWalter Erquinigo   llvm::Optional<std::string> m_auto_repeat_command;
8121dfcd9dSEnrico Granata };
8230fdc8d8SChris Lattner 
SBCommandInterpreter(CommandInterpreter * interpreter)83b9c1b51eSKate Stone SBCommandInterpreter::SBCommandInterpreter(CommandInterpreter *interpreter)
84b9c1b51eSKate Stone     : m_opaque_ptr(interpreter) {
851755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, interpreter);
8630fdc8d8SChris Lattner }
8730fdc8d8SChris Lattner 
SBCommandInterpreter(const SBCommandInterpreter & rhs)88b9c1b51eSKate Stone SBCommandInterpreter::SBCommandInterpreter(const SBCommandInterpreter &rhs)
89baf5664fSJonas Devlieghere     : m_opaque_ptr(rhs.m_opaque_ptr) {
901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
91baf5664fSJonas Devlieghere }
92efabb123SGreg Clayton 
93dbb0abbfSEugene Zelenko SBCommandInterpreter::~SBCommandInterpreter() = default;
94dbb0abbfSEugene Zelenko 
95b9c1b51eSKate Stone const SBCommandInterpreter &SBCommandInterpreter::
operator =(const SBCommandInterpreter & rhs)96b9c1b51eSKate Stone operator=(const SBCommandInterpreter &rhs) {
971755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, rhs);
98baf5664fSJonas Devlieghere 
99efabb123SGreg Clayton   m_opaque_ptr = rhs.m_opaque_ptr;
100d232abc3SJonas Devlieghere   return *this;
101efabb123SGreg Clayton }
102efabb123SGreg Clayton 
IsValid() const103baf5664fSJonas Devlieghere bool SBCommandInterpreter::IsValid() const {
1041755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
1057f5237bcSPavel Labath   return this->operator bool();
1067f5237bcSPavel Labath }
operator bool() const1077f5237bcSPavel Labath SBCommandInterpreter::operator bool() const {
1081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
109baf5664fSJonas Devlieghere 
110baf5664fSJonas Devlieghere   return m_opaque_ptr != nullptr;
111baf5664fSJonas Devlieghere }
112b9c1b51eSKate Stone 
CommandExists(const char * cmd)113b9c1b51eSKate Stone bool SBCommandInterpreter::CommandExists(const char *cmd) {
1141755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, cmd);
115baf5664fSJonas Devlieghere 
116b9c1b51eSKate Stone   return (((cmd != nullptr) && IsValid()) ? m_opaque_ptr->CommandExists(cmd)
117b9c1b51eSKate Stone                                           : false);
1186611103cSGreg Clayton }
1196611103cSGreg Clayton 
AliasExists(const char * cmd)120b9c1b51eSKate Stone bool SBCommandInterpreter::AliasExists(const char *cmd) {
1211755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, cmd);
122baf5664fSJonas Devlieghere 
123b9c1b51eSKate Stone   return (((cmd != nullptr) && IsValid()) ? m_opaque_ptr->AliasExists(cmd)
124b9c1b51eSKate Stone                                           : false);
12530fdc8d8SChris Lattner }
12630fdc8d8SChris Lattner 
IsActive()127b9c1b51eSKate Stone bool SBCommandInterpreter::IsActive() {
1281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
129baf5664fSJonas Devlieghere 
130dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_ptr->IsActive() : false);
13144d93782SGreg Clayton }
13244d93782SGreg Clayton 
WasInterrupted() const13317ffd39eSLeonard Mosescu bool SBCommandInterpreter::WasInterrupted() const {
1341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
135baf5664fSJonas Devlieghere 
13617ffd39eSLeonard Mosescu   return (IsValid() ? m_opaque_ptr->WasInterrupted() : false);
13717ffd39eSLeonard Mosescu }
13817ffd39eSLeonard Mosescu 
GetIOHandlerControlSequence(char ch)139b9c1b51eSKate Stone const char *SBCommandInterpreter::GetIOHandlerControlSequence(char ch) {
1401755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, ch);
141baf5664fSJonas Devlieghere 
142b9c1b51eSKate Stone   return (IsValid()
143b9c1b51eSKate Stone               ? m_opaque_ptr->GetDebugger()
144b9c1b51eSKate Stone                     .GetTopIOHandlerControlSequence(ch)
145b9c1b51eSKate Stone                     .GetCString()
146b9c1b51eSKate Stone               : nullptr);
14744d93782SGreg Clayton }
14844d93782SGreg Clayton 
14930fdc8d8SChris Lattner lldb::ReturnStatus
HandleCommand(const char * command_line,SBCommandReturnObject & result,bool add_to_history)150b9c1b51eSKate Stone SBCommandInterpreter::HandleCommand(const char *command_line,
151b9c1b51eSKate Stone                                     SBCommandReturnObject &result,
152b9c1b51eSKate Stone                                     bool add_to_history) {
1531755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, command_line, result, add_to_history);
154baf5664fSJonas Devlieghere 
155ffc9f1deSJim Ingham   SBExecutionContext sb_exe_ctx;
156ffc9f1deSJim Ingham   return HandleCommand(command_line, sb_exe_ctx, result, add_to_history);
157ffc9f1deSJim Ingham }
158ffc9f1deSJim Ingham 
HandleCommand(const char * command_line,SBExecutionContext & override_context,SBCommandReturnObject & result,bool add_to_history)159b9c1b51eSKate Stone lldb::ReturnStatus SBCommandInterpreter::HandleCommand(
160b9c1b51eSKate Stone     const char *command_line, SBExecutionContext &override_context,
161b9c1b51eSKate Stone     SBCommandReturnObject &result, bool add_to_history) {
1621755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, command_line, override_context, result,
1631755f5b1SJonas Devlieghere                      add_to_history);
164baf5664fSJonas Devlieghere 
16530fdc8d8SChris Lattner   result.Clear();
166b9c1b51eSKate Stone   if (command_line && IsValid()) {
16745a44f3cSGreg Clayton     result.ref().SetInteractive(false);
16836de94cfSTatyana Krasnukha     auto do_add_to_history = add_to_history ? eLazyBoolYes : eLazyBoolNo;
16936de94cfSTatyana Krasnukha     if (override_context.get())
17036de94cfSTatyana Krasnukha       m_opaque_ptr->HandleCommand(command_line, do_add_to_history,
17136de94cfSTatyana Krasnukha                                   override_context.get()->Lock(true),
17236de94cfSTatyana Krasnukha                                   result.ref());
17336de94cfSTatyana Krasnukha     else
17436de94cfSTatyana Krasnukha       m_opaque_ptr->HandleCommand(command_line, do_add_to_history,
17536de94cfSTatyana Krasnukha                                   result.ref());
176b9c1b51eSKate Stone   } else {
177b9c1b51eSKate Stone     result->AppendError(
178b9c1b51eSKate Stone         "SBCommandInterpreter or the command line is not valid");
1796611103cSGreg Clayton   }
180ceb6b139SCaroline Tice 
18130fdc8d8SChris Lattner   return result.GetStatus();
18230fdc8d8SChris Lattner }
18330fdc8d8SChris Lattner 
HandleCommandsFromFile(lldb::SBFileSpec & file,lldb::SBExecutionContext & override_context,lldb::SBCommandInterpreterRunOptions & options,lldb::SBCommandReturnObject result)184b9c1b51eSKate Stone void SBCommandInterpreter::HandleCommandsFromFile(
185b9c1b51eSKate Stone     lldb::SBFileSpec &file, lldb::SBExecutionContext &override_context,
186ffc9f1deSJim Ingham     lldb::SBCommandInterpreterRunOptions &options,
187b9c1b51eSKate Stone     lldb::SBCommandReturnObject result) {
1881755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, file, override_context, options, result);
189baf5664fSJonas Devlieghere 
190b9c1b51eSKate Stone   if (!IsValid()) {
191ffc9f1deSJim Ingham     result->AppendError("SBCommandInterpreter is not valid.");
192ffc9f1deSJim Ingham     return;
193ffc9f1deSJim Ingham   }
194ffc9f1deSJim Ingham 
195b9c1b51eSKate Stone   if (!file.IsValid()) {
196ffc9f1deSJim Ingham     SBStream s;
197ffc9f1deSJim Ingham     file.GetDescription(s);
198ffc9f1deSJim Ingham     result->AppendErrorWithFormat("File is not valid: %s.", s.GetData());
199ffc9f1deSJim Ingham   }
200ffc9f1deSJim Ingham 
201ffc9f1deSJim Ingham   FileSpec tmp_spec = file.ref();
20236de94cfSTatyana Krasnukha   if (override_context.get())
20336de94cfSTatyana Krasnukha     m_opaque_ptr->HandleCommandsFromFile(tmp_spec,
20436de94cfSTatyana Krasnukha                                          override_context.get()->Lock(true),
20536de94cfSTatyana Krasnukha                                          options.ref(),
206122a4ebdSPavel Labath                                          result.ref());
20736de94cfSTatyana Krasnukha 
20836de94cfSTatyana Krasnukha   else
20936de94cfSTatyana Krasnukha     m_opaque_ptr->HandleCommandsFromFile(tmp_spec, options.ref(), result.ref());
210ffc9f1deSJim Ingham }
211ffc9f1deSJim Ingham 
HandleCompletion(const char * current_line,const char * cursor,const char * last_char,int match_start_point,int max_return_elements,SBStringList & matches)212b9c1b51eSKate Stone int SBCommandInterpreter::HandleCompletion(
213b9c1b51eSKate Stone     const char *current_line, const char *cursor, const char *last_char,
214b9c1b51eSKate Stone     int match_start_point, int max_return_elements, SBStringList &matches) {
2151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, current_line, cursor, last_char, match_start_point,
216baf5664fSJonas Devlieghere                      max_return_elements, matches);
217baf5664fSJonas Devlieghere 
2187f88829cSRaphael Isemann   SBStringList dummy_descriptions;
2197f88829cSRaphael Isemann   return HandleCompletionWithDescriptions(
2207f88829cSRaphael Isemann       current_line, cursor, last_char, match_start_point, max_return_elements,
2217f88829cSRaphael Isemann       matches, dummy_descriptions);
2227f88829cSRaphael Isemann }
2237f88829cSRaphael Isemann 
HandleCompletionWithDescriptions(const char * current_line,const char * cursor,const char * last_char,int match_start_point,int max_return_elements,SBStringList & matches,SBStringList & descriptions)2247f88829cSRaphael Isemann int SBCommandInterpreter::HandleCompletionWithDescriptions(
2257f88829cSRaphael Isemann     const char *current_line, const char *cursor, const char *last_char,
2267f88829cSRaphael Isemann     int match_start_point, int max_return_elements, SBStringList &matches,
2277f88829cSRaphael Isemann     SBStringList &descriptions) {
2281755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, current_line, cursor, last_char, match_start_point,
229baf5664fSJonas Devlieghere                      max_return_elements, matches, descriptions);
230baf5664fSJonas Devlieghere 
23105097246SAdrian Prantl   // Sanity check the arguments that are passed in: cursor & last_char have to
23205097246SAdrian Prantl   // be within the current_line.
233dbb0abbfSEugene Zelenko   if (current_line == nullptr || cursor == nullptr || last_char == nullptr)
234ac012605SJim Ingham     return 0;
235ac012605SJim Ingham 
236ac012605SJim Ingham   if (cursor < current_line || last_char < current_line)
237ac012605SJim Ingham     return 0;
238ac012605SJim Ingham 
239ac012605SJim Ingham   size_t current_line_size = strlen(current_line);
2403985c8c6SSaleem Abdulrasool   if (cursor - current_line > static_cast<ptrdiff_t>(current_line_size) ||
2413985c8c6SSaleem Abdulrasool       last_char - current_line > static_cast<ptrdiff_t>(current_line_size))
242ac012605SJim Ingham     return 0;
243ac012605SJim Ingham 
244ae34ed2cSRaphael Isemann   if (!IsValid())
245ae34ed2cSRaphael Isemann     return 0;
246389512dcSJim Ingham 
2477f88829cSRaphael Isemann   lldb_private::StringList lldb_matches, lldb_descriptions;
2482fc20f65SRaphael Isemann   CompletionResult result;
2492fc20f65SRaphael Isemann   CompletionRequest request(current_line, cursor - current_line, result);
250ae34ed2cSRaphael Isemann   m_opaque_ptr->HandleCompletion(request);
2512fc20f65SRaphael Isemann   result.GetMatches(lldb_matches);
2522fc20f65SRaphael Isemann   result.GetDescriptions(lldb_descriptions);
25330fdc8d8SChris Lattner 
254ae34ed2cSRaphael Isemann   // Make the result array indexed from 1 again by adding the 'common prefix'
255ae34ed2cSRaphael Isemann   // of all completions as element 0. This is done to emulate the old API.
256ae34ed2cSRaphael Isemann   if (request.GetParsedLine().GetArgumentCount() == 0) {
257ae34ed2cSRaphael Isemann     // If we got an empty string, insert nothing.
258ae34ed2cSRaphael Isemann     lldb_matches.InsertStringAtIndex(0, "");
259ae34ed2cSRaphael Isemann     lldb_descriptions.InsertStringAtIndex(0, "");
260ae34ed2cSRaphael Isemann   } else {
261ae34ed2cSRaphael Isemann     // Now figure out if there is a common substring, and if so put that in
262ae34ed2cSRaphael Isemann     // element 0, otherwise put an empty string in element 0.
263ae34ed2cSRaphael Isemann     std::string command_partial_str = request.GetCursorArgumentPrefix().str();
264ae34ed2cSRaphael Isemann 
265ae34ed2cSRaphael Isemann     std::string common_prefix = lldb_matches.LongestCommonPrefix();
266ae34ed2cSRaphael Isemann     const size_t partial_name_len = command_partial_str.size();
267ae34ed2cSRaphael Isemann     common_prefix.erase(0, partial_name_len);
268ae34ed2cSRaphael Isemann 
269ae34ed2cSRaphael Isemann     // If we matched a unique single command, add a space... Only do this if
270ae34ed2cSRaphael Isemann     // the completer told us this was a complete word, however...
271ae34ed2cSRaphael Isemann     if (lldb_matches.GetSize() == 1) {
272a024f5e3SRaphael Isemann       char quote_char = request.GetParsedArg().GetQuoteChar();
273ae34ed2cSRaphael Isemann       common_prefix =
274ae34ed2cSRaphael Isemann           Args::EscapeLLDBCommandArgument(common_prefix, quote_char);
275ae34ed2cSRaphael Isemann       if (request.GetParsedArg().IsQuoted())
276ae34ed2cSRaphael Isemann         common_prefix.push_back(quote_char);
277ae34ed2cSRaphael Isemann       common_prefix.push_back(' ');
278ae34ed2cSRaphael Isemann     }
279ae34ed2cSRaphael Isemann     lldb_matches.InsertStringAtIndex(0, common_prefix.c_str());
280ae34ed2cSRaphael Isemann     lldb_descriptions.InsertStringAtIndex(0, "");
281ae34ed2cSRaphael Isemann   }
282ae34ed2cSRaphael Isemann 
2837f88829cSRaphael Isemann   SBStringList temp_matches_list(&lldb_matches);
2847f88829cSRaphael Isemann   matches.AppendList(temp_matches_list);
2857f88829cSRaphael Isemann   SBStringList temp_descriptions_list(&lldb_descriptions);
2867f88829cSRaphael Isemann   descriptions.AppendList(temp_descriptions_list);
287ae34ed2cSRaphael Isemann   return result.GetNumberOfResults();
28830fdc8d8SChris Lattner }
28930fdc8d8SChris Lattner 
HandleCompletionWithDescriptions(const char * current_line,uint32_t cursor_pos,int match_start_point,int max_return_elements,SBStringList & matches,SBStringList & descriptions)2907f88829cSRaphael Isemann int SBCommandInterpreter::HandleCompletionWithDescriptions(
2917f88829cSRaphael Isemann     const char *current_line, uint32_t cursor_pos, int match_start_point,
2927f88829cSRaphael Isemann     int max_return_elements, SBStringList &matches,
2937f88829cSRaphael Isemann     SBStringList &descriptions) {
2941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, current_line, cursor_pos, match_start_point,
295baf5664fSJonas Devlieghere                      max_return_elements, matches, descriptions);
296baf5664fSJonas Devlieghere 
2977f88829cSRaphael Isemann   const char *cursor = current_line + cursor_pos;
2987f88829cSRaphael Isemann   const char *last_char = current_line + strlen(current_line);
2997f88829cSRaphael Isemann   return HandleCompletionWithDescriptions(
3007f88829cSRaphael Isemann       current_line, cursor, last_char, match_start_point, max_return_elements,
3017f88829cSRaphael Isemann       matches, descriptions);
3027f88829cSRaphael Isemann }
3037f88829cSRaphael Isemann 
HandleCompletion(const char * current_line,uint32_t cursor_pos,int match_start_point,int max_return_elements,lldb::SBStringList & matches)304b9c1b51eSKate Stone int SBCommandInterpreter::HandleCompletion(const char *current_line,
305969795f1SJim Ingham                                            uint32_t cursor_pos,
306969795f1SJim Ingham                                            int match_start_point,
307969795f1SJim Ingham                                            int max_return_elements,
308b9c1b51eSKate Stone                                            lldb::SBStringList &matches) {
3091755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, current_line, cursor_pos, match_start_point,
310baf5664fSJonas Devlieghere                      max_return_elements, matches);
311baf5664fSJonas Devlieghere 
312969795f1SJim Ingham   const char *cursor = current_line + cursor_pos;
313969795f1SJim Ingham   const char *last_char = current_line + strlen(current_line);
314b9c1b51eSKate Stone   return HandleCompletion(current_line, cursor, last_char, match_start_point,
315b9c1b51eSKate Stone                           max_return_elements, matches);
316969795f1SJim Ingham }
317969795f1SJim Ingham 
HasCommands()318b9c1b51eSKate Stone bool SBCommandInterpreter::HasCommands() {
3191755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
320baf5664fSJonas Devlieghere 
321dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_ptr->HasCommands() : false);
32230fdc8d8SChris Lattner }
32330fdc8d8SChris Lattner 
HasAliases()324b9c1b51eSKate Stone bool SBCommandInterpreter::HasAliases() {
3251755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
326baf5664fSJonas Devlieghere 
327dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_ptr->HasAliases() : false);
32830fdc8d8SChris Lattner }
32930fdc8d8SChris Lattner 
HasAliasOptions()330b9c1b51eSKate Stone bool SBCommandInterpreter::HasAliasOptions() {
3311755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
332baf5664fSJonas Devlieghere 
333dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_ptr->HasAliasOptions() : false);
33430fdc8d8SChris Lattner }
33530fdc8d8SChris Lattner 
IsInteractive()3367f3fc2eeSMed Ismail Bennani bool SBCommandInterpreter::IsInteractive() {
3377f3fc2eeSMed Ismail Bennani   LLDB_INSTRUMENT_VA(this);
3387f3fc2eeSMed Ismail Bennani 
3397f3fc2eeSMed Ismail Bennani   return (IsValid() ? m_opaque_ptr->IsInteractive() : false);
3407f3fc2eeSMed Ismail Bennani }
3417f3fc2eeSMed Ismail Bennani 
GetProcess()342b9c1b51eSKate Stone SBProcess SBCommandInterpreter::GetProcess() {
3431755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
344baf5664fSJonas Devlieghere 
345b9556accSGreg Clayton   SBProcess sb_process;
346b9556accSGreg Clayton   ProcessSP process_sp;
347b9c1b51eSKate Stone   if (IsValid()) {
348af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
349b9c1b51eSKate Stone     if (target_sp) {
350bb19a13cSSaleem Abdulrasool       std::lock_guard<std::recursive_mutex> guard(target_sp->GetAPIMutex());
351b9556accSGreg Clayton       process_sp = target_sp->GetProcessSP();
352b9556accSGreg Clayton       sb_process.SetSP(process_sp);
353af67cecdSGreg Clayton     }
35430fdc8d8SChris Lattner   }
3554838131bSGreg Clayton 
356d232abc3SJonas Devlieghere   return sb_process;
35730fdc8d8SChris Lattner }
35830fdc8d8SChris Lattner 
GetDebugger()359b9c1b51eSKate Stone SBDebugger SBCommandInterpreter::GetDebugger() {
3601755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
361baf5664fSJonas Devlieghere 
36221dfcd9dSEnrico Granata   SBDebugger sb_debugger;
363dbb0abbfSEugene Zelenko   if (IsValid())
36421dfcd9dSEnrico Granata     sb_debugger.reset(m_opaque_ptr->GetDebugger().shared_from_this());
36521dfcd9dSEnrico Granata 
366d232abc3SJonas Devlieghere   return sb_debugger;
36721dfcd9dSEnrico Granata }
36821dfcd9dSEnrico Granata 
GetPromptOnQuit()369b9c1b51eSKate Stone bool SBCommandInterpreter::GetPromptOnQuit() {
3701755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
371baf5664fSJonas Devlieghere 
372dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_ptr->GetPromptOnQuit() : false);
373acf28beaSIlia K }
374acf28beaSIlia K 
SetPromptOnQuit(bool b)375b9c1b51eSKate Stone void SBCommandInterpreter::SetPromptOnQuit(bool b) {
3761755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, b);
377baf5664fSJonas Devlieghere 
378dbb0abbfSEugene Zelenko   if (IsValid())
379acf28beaSIlia K     m_opaque_ptr->SetPromptOnQuit(b);
380acf28beaSIlia K }
381acf28beaSIlia K 
AllowExitCodeOnQuit(bool allow)382c094d23fSRaphael Isemann void SBCommandInterpreter::AllowExitCodeOnQuit(bool allow) {
3831755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, allow);
384baf5664fSJonas Devlieghere 
385c094d23fSRaphael Isemann   if (m_opaque_ptr)
386c094d23fSRaphael Isemann     m_opaque_ptr->AllowExitCodeOnQuit(allow);
387c094d23fSRaphael Isemann }
388c094d23fSRaphael Isemann 
HasCustomQuitExitCode()389c094d23fSRaphael Isemann bool SBCommandInterpreter::HasCustomQuitExitCode() {
3901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
391baf5664fSJonas Devlieghere 
392c094d23fSRaphael Isemann   bool exited = false;
393c094d23fSRaphael Isemann   if (m_opaque_ptr)
394c094d23fSRaphael Isemann     m_opaque_ptr->GetQuitExitCode(exited);
395c094d23fSRaphael Isemann   return exited;
396c094d23fSRaphael Isemann }
397c094d23fSRaphael Isemann 
GetQuitStatus()398c094d23fSRaphael Isemann int SBCommandInterpreter::GetQuitStatus() {
3991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
400baf5664fSJonas Devlieghere 
401c094d23fSRaphael Isemann   bool exited = false;
402c094d23fSRaphael Isemann   return (m_opaque_ptr ? m_opaque_ptr->GetQuitExitCode(exited) : 0);
403c094d23fSRaphael Isemann }
404c094d23fSRaphael Isemann 
ResolveCommand(const char * command_line,SBCommandReturnObject & result)405b9c1b51eSKate Stone void SBCommandInterpreter::ResolveCommand(const char *command_line,
406b9c1b51eSKate Stone                                           SBCommandReturnObject &result) {
4071755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, command_line, result);
408baf5664fSJonas Devlieghere 
4092304b6ffSAdrian McCarthy   result.Clear();
410b9c1b51eSKate Stone   if (command_line && IsValid()) {
4112304b6ffSAdrian McCarthy     m_opaque_ptr->ResolveCommand(command_line, result.ref());
412b9c1b51eSKate Stone   } else {
413b9c1b51eSKate Stone     result->AppendError(
414b9c1b51eSKate Stone         "SBCommandInterpreter or the command line is not valid");
4152304b6ffSAdrian McCarthy   }
4162304b6ffSAdrian McCarthy }
4172304b6ffSAdrian McCarthy 
get()418b9c1b51eSKate Stone CommandInterpreter *SBCommandInterpreter::get() { return m_opaque_ptr; }
41930fdc8d8SChris Lattner 
ref()420b9c1b51eSKate Stone CommandInterpreter &SBCommandInterpreter::ref() {
4216611103cSGreg Clayton   assert(m_opaque_ptr);
4226611103cSGreg Clayton   return *m_opaque_ptr;
4236611103cSGreg Clayton }
4246611103cSGreg Clayton 
reset(lldb_private::CommandInterpreter * interpreter)425b9c1b51eSKate Stone void SBCommandInterpreter::reset(
426b9c1b51eSKate Stone     lldb_private::CommandInterpreter *interpreter) {
4276611103cSGreg Clayton   m_opaque_ptr = interpreter;
42830fdc8d8SChris Lattner }
42930fdc8d8SChris Lattner 
SourceInitFileInGlobalDirectory(SBCommandReturnObject & result)4306c99a346SPavel Labath void SBCommandInterpreter::SourceInitFileInGlobalDirectory(
4316c99a346SPavel Labath     SBCommandReturnObject &result) {
4326c99a346SPavel Labath   LLDB_INSTRUMENT_VA(this, result);
4336c99a346SPavel Labath 
4346c99a346SPavel Labath   result.Clear();
4356c99a346SPavel Labath   if (IsValid()) {
4366c99a346SPavel Labath     TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
4376c99a346SPavel Labath     std::unique_lock<std::recursive_mutex> lock;
4386c99a346SPavel Labath     if (target_sp)
4396c99a346SPavel Labath       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
4406c99a346SPavel Labath     m_opaque_ptr->SourceInitFileGlobal(result.ref());
4416c99a346SPavel Labath   } else {
4426c99a346SPavel Labath     result->AppendError("SBCommandInterpreter is not valid");
4436c99a346SPavel Labath   }
4446c99a346SPavel Labath }
4456c99a346SPavel Labath 
SourceInitFileInHomeDirectory(SBCommandReturnObject & result)446b9c1b51eSKate Stone void SBCommandInterpreter::SourceInitFileInHomeDirectory(
447b9c1b51eSKate Stone     SBCommandReturnObject &result) {
4481755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, result);
449baf5664fSJonas Devlieghere 
45096000f5cSPavel Labath   SourceInitFileInHomeDirectory(result, /*is_repl=*/false);
45130fdc8d8SChris Lattner }
45230fdc8d8SChris Lattner 
SourceInitFileInHomeDirectory(SBCommandReturnObject & result,bool is_repl)453868b45b5SMed Ismail Bennani void SBCommandInterpreter::SourceInitFileInHomeDirectory(
454868b45b5SMed Ismail Bennani     SBCommandReturnObject &result, bool is_repl) {
4551755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, result, is_repl);
456868b45b5SMed Ismail Bennani 
457868b45b5SMed Ismail Bennani   result.Clear();
458868b45b5SMed Ismail Bennani   if (IsValid()) {
459868b45b5SMed Ismail Bennani     TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
460868b45b5SMed Ismail Bennani     std::unique_lock<std::recursive_mutex> lock;
461868b45b5SMed Ismail Bennani     if (target_sp)
462868b45b5SMed Ismail Bennani       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
463868b45b5SMed Ismail Bennani     m_opaque_ptr->SourceInitFileHome(result.ref(), is_repl);
464868b45b5SMed Ismail Bennani   } else {
465868b45b5SMed Ismail Bennani     result->AppendError("SBCommandInterpreter is not valid");
466868b45b5SMed Ismail Bennani   }
467868b45b5SMed Ismail Bennani }
468868b45b5SMed Ismail Bennani 
SourceInitFileInCurrentWorkingDirectory(SBCommandReturnObject & result)469b9c1b51eSKate Stone void SBCommandInterpreter::SourceInitFileInCurrentWorkingDirectory(
470b9c1b51eSKate Stone     SBCommandReturnObject &result) {
4711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, result);
472baf5664fSJonas Devlieghere 
47330fdc8d8SChris Lattner   result.Clear();
474b9c1b51eSKate Stone   if (IsValid()) {
475af67cecdSGreg Clayton     TargetSP target_sp(m_opaque_ptr->GetDebugger().GetSelectedTarget());
476bb19a13cSSaleem Abdulrasool     std::unique_lock<std::recursive_mutex> lock;
477af67cecdSGreg Clayton     if (target_sp)
478bb19a13cSSaleem Abdulrasool       lock = std::unique_lock<std::recursive_mutex>(target_sp->GetAPIMutex());
4792fc6b024SJonas Devlieghere     m_opaque_ptr->SourceInitFileCwd(result.ref());
480b9c1b51eSKate Stone   } else {
4816611103cSGreg Clayton     result->AppendError("SBCommandInterpreter is not valid");
4826611103cSGreg Clayton   }
48330fdc8d8SChris Lattner }
48430fdc8d8SChris Lattner 
GetBroadcaster()485b9c1b51eSKate Stone SBBroadcaster SBCommandInterpreter::GetBroadcaster() {
4861755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
487ceb6b139SCaroline Tice 
4886611103cSGreg Clayton   SBBroadcaster broadcaster(m_opaque_ptr, false);
489ceb6b139SCaroline Tice 
490d232abc3SJonas Devlieghere   return broadcaster;
49130fdc8d8SChris Lattner }
49230fdc8d8SChris Lattner 
GetBroadcasterClass()493b9c1b51eSKate Stone const char *SBCommandInterpreter::GetBroadcasterClass() {
4941755f5b1SJonas Devlieghere   LLDB_INSTRUMENT();
495baf5664fSJonas Devlieghere 
4968a00a562SIlia K   return CommandInterpreter::GetStaticBroadcasterClass().AsCString();
4974bddaeb5SJim Ingham }
4984bddaeb5SJim Ingham 
GetArgumentTypeAsCString(const lldb::CommandArgumentType arg_type)499b9c1b51eSKate Stone const char *SBCommandInterpreter::GetArgumentTypeAsCString(
500b9c1b51eSKate Stone     const lldb::CommandArgumentType arg_type) {
5011755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(arg_type);
502baf5664fSJonas Devlieghere 
5039d0402b1SGreg Clayton   return CommandObject::GetArgumentTypeAsCString(arg_type);
5049d0402b1SGreg Clayton }
5059d0402b1SGreg Clayton 
GetArgumentDescriptionAsCString(const lldb::CommandArgumentType arg_type)506b9c1b51eSKate Stone const char *SBCommandInterpreter::GetArgumentDescriptionAsCString(
507b9c1b51eSKate Stone     const lldb::CommandArgumentType arg_type) {
5081755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(arg_type);
509baf5664fSJonas Devlieghere 
5109d0402b1SGreg Clayton   return CommandObject::GetArgumentDescriptionAsCString(arg_type);
5119d0402b1SGreg Clayton }
5129d0402b1SGreg Clayton 
EventIsCommandInterpreterEvent(const lldb::SBEvent & event)513b9c1b51eSKate Stone bool SBCommandInterpreter::EventIsCommandInterpreterEvent(
514b9c1b51eSKate Stone     const lldb::SBEvent &event) {
5151755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(event);
516baf5664fSJonas Devlieghere 
517b9c1b51eSKate Stone   return event.GetBroadcasterClass() ==
518b9c1b51eSKate Stone          SBCommandInterpreter::GetBroadcasterClass();
519af10e1ceSIlia K }
520af10e1ceSIlia K 
SetCommandOverrideCallback(const char * command_name,lldb::CommandOverrideCallback callback,void * baton)521b9c1b51eSKate Stone bool SBCommandInterpreter::SetCommandOverrideCallback(
522b9c1b51eSKate Stone     const char *command_name, lldb::CommandOverrideCallback callback,
523b9c1b51eSKate Stone     void *baton) {
5241755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, command_name, callback, baton);
5250d7b0c96SJonas Devlieghere 
526b9c1b51eSKate Stone   if (command_name && command_name[0] && IsValid()) {
527a01bccdbSZachary Turner     llvm::StringRef command_name_str = command_name;
528b9c1b51eSKate Stone     CommandObject *cmd_obj =
529b9c1b51eSKate Stone         m_opaque_ptr->GetCommandObjectForCommand(command_name_str);
530b9c1b51eSKate Stone     if (cmd_obj) {
531af6f2755SGreg Clayton       assert(command_name_str.empty());
532a9f7b79dSGreg Clayton       cmd_obj->SetOverrideCallback(callback, baton);
533a9f7b79dSGreg Clayton       return true;
534a9f7b79dSGreg Clayton     }
535a9f7b79dSGreg Clayton   }
536a9f7b79dSGreg Clayton   return false;
537a9f7b79dSGreg Clayton }
5389d0402b1SGreg Clayton 
AddMultiwordCommand(const char * name,const char * help)539b9c1b51eSKate Stone lldb::SBCommand SBCommandInterpreter::AddMultiwordCommand(const char *name,
540b9c1b51eSKate Stone                                                           const char *help) {
5411755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, help);
542baf5664fSJonas Devlieghere 
543c5011aedSJim Ingham   lldb::CommandObjectSP new_command_sp(
544c5011aedSJim Ingham       new CommandObjectMultiword(*m_opaque_ptr, name, help));
545c5011aedSJim Ingham   new_command_sp->GetAsMultiwordCommand()->SetRemovable(true);
546c5011aedSJim Ingham   Status add_error = m_opaque_ptr->AddUserCommand(name, new_command_sp, true);
547c5011aedSJim Ingham   if (add_error.Success())
548d232abc3SJonas Devlieghere     return lldb::SBCommand(new_command_sp);
549d232abc3SJonas Devlieghere   return lldb::SBCommand();
550b9c1b51eSKate Stone }
551b9c1b51eSKate Stone 
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help)552b9c1b51eSKate Stone lldb::SBCommand SBCommandInterpreter::AddCommand(
553b9c1b51eSKate Stone     const char *name, lldb::SBCommandPluginInterface *impl, const char *help) {
5541755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help);
555baf5664fSJonas Devlieghere 
556d232abc3SJonas Devlieghere   return AddCommand(name, impl, help, /*syntax=*/nullptr,
557d232abc3SJonas Devlieghere                     /*auto_repeat_command=*/"");
55821dfcd9dSEnrico Granata }
55921dfcd9dSEnrico Granata 
56021dfcd9dSEnrico Granata lldb::SBCommand
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax)561b9c1b51eSKate Stone SBCommandInterpreter::AddCommand(const char *name,
562b9c1b51eSKate Stone                                  lldb::SBCommandPluginInterface *impl,
563b9c1b51eSKate Stone                                  const char *help, const char *syntax) {
5641755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help, syntax);
565d232abc3SJonas Devlieghere   return AddCommand(name, impl, help, syntax, /*auto_repeat_command=*/"");
566be3f8a8eSWalter Erquinigo }
567be3f8a8eSWalter Erquinigo 
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax,const char * auto_repeat_command)568be3f8a8eSWalter Erquinigo lldb::SBCommand SBCommandInterpreter::AddCommand(
569be3f8a8eSWalter Erquinigo     const char *name, lldb::SBCommandPluginInterface *impl, const char *help,
570be3f8a8eSWalter Erquinigo     const char *syntax, const char *auto_repeat_command) {
5711755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help, syntax, auto_repeat_command);
572baf5664fSJonas Devlieghere 
57321dfcd9dSEnrico Granata   lldb::CommandObjectSP new_command_sp;
574796ac80bSJonas Devlieghere   new_command_sp = std::make_shared<CommandPluginInterfaceImplementation>(
575be3f8a8eSWalter Erquinigo       *m_opaque_ptr, name, impl, help, syntax, /*flags=*/0,
576be3f8a8eSWalter Erquinigo       auto_repeat_command);
57721dfcd9dSEnrico Granata 
578c5011aedSJim Ingham   Status add_error = m_opaque_ptr->AddUserCommand(name, new_command_sp, true);
579c5011aedSJim Ingham   if (add_error.Success())
580d232abc3SJonas Devlieghere     return lldb::SBCommand(new_command_sp);
581d232abc3SJonas Devlieghere   return lldb::SBCommand();
582f605c198SAbhishek Aggarwal }
583f605c198SAbhishek Aggarwal 
SBCommand()5841755f5b1SJonas Devlieghere SBCommand::SBCommand() { LLDB_INSTRUMENT_VA(this); }
58521dfcd9dSEnrico Granata 
SBCommand(lldb::CommandObjectSP cmd_sp)586b9c1b51eSKate Stone SBCommand::SBCommand(lldb::CommandObjectSP cmd_sp) : m_opaque_sp(cmd_sp) {}
58721dfcd9dSEnrico Granata 
IsValid()588baf5664fSJonas Devlieghere bool SBCommand::IsValid() {
5891755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
5907f5237bcSPavel Labath   return this->operator bool();
5917f5237bcSPavel Labath }
operator bool() const5927f5237bcSPavel Labath SBCommand::operator bool() const {
5931755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
594baf5664fSJonas Devlieghere 
595baf5664fSJonas Devlieghere   return m_opaque_sp.get() != nullptr;
596baf5664fSJonas Devlieghere }
59721dfcd9dSEnrico Granata 
GetName()598b9c1b51eSKate Stone const char *SBCommand::GetName() {
5991755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
600baf5664fSJonas Devlieghere 
601a449698cSZachary Turner   return (IsValid() ? ConstString(m_opaque_sp->GetCommandName()).AsCString() : nullptr);
60221dfcd9dSEnrico Granata }
60321dfcd9dSEnrico Granata 
GetHelp()604b9c1b51eSKate Stone const char *SBCommand::GetHelp() {
6051755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
606baf5664fSJonas Devlieghere 
607442f6530SZachary Turner   return (IsValid() ? ConstString(m_opaque_sp->GetHelp()).AsCString()
608442f6530SZachary Turner                     : nullptr);
60921dfcd9dSEnrico Granata }
61021dfcd9dSEnrico Granata 
GetHelpLong()611b9c1b51eSKate Stone const char *SBCommand::GetHelpLong() {
6121755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
613baf5664fSJonas Devlieghere 
614442f6530SZachary Turner   return (IsValid() ? ConstString(m_opaque_sp->GetHelpLong()).AsCString()
615442f6530SZachary Turner                     : nullptr);
616cc342da5SEnrico Granata }
617cc342da5SEnrico Granata 
SetHelp(const char * help)618b9c1b51eSKate Stone void SBCommand::SetHelp(const char *help) {
6191755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, help);
620baf5664fSJonas Devlieghere 
621cc342da5SEnrico Granata   if (IsValid())
622cc342da5SEnrico Granata     m_opaque_sp->SetHelp(help);
623cc342da5SEnrico Granata }
624cc342da5SEnrico Granata 
SetHelpLong(const char * help)625b9c1b51eSKate Stone void SBCommand::SetHelpLong(const char *help) {
6261755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, help);
627baf5664fSJonas Devlieghere 
628cc342da5SEnrico Granata   if (IsValid())
629cc342da5SEnrico Granata     m_opaque_sp->SetHelpLong(help);
630cc342da5SEnrico Granata }
631cc342da5SEnrico Granata 
AddMultiwordCommand(const char * name,const char * help)632b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddMultiwordCommand(const char *name,
633b9c1b51eSKate Stone                                                const char *help) {
6341755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, help);
635baf5664fSJonas Devlieghere 
63621dfcd9dSEnrico Granata   if (!IsValid())
637d232abc3SJonas Devlieghere     return lldb::SBCommand();
638dbb0abbfSEugene Zelenko   if (!m_opaque_sp->IsMultiwordObject())
639d232abc3SJonas Devlieghere     return lldb::SBCommand();
640b9c1b51eSKate Stone   CommandObjectMultiword *new_command = new CommandObjectMultiword(
641b9c1b51eSKate Stone       m_opaque_sp->GetCommandInterpreter(), name, help);
64221dfcd9dSEnrico Granata   new_command->SetRemovable(true);
64321dfcd9dSEnrico Granata   lldb::CommandObjectSP new_command_sp(new_command);
64421dfcd9dSEnrico Granata   if (new_command_sp && m_opaque_sp->LoadSubCommand(name, new_command_sp))
645d232abc3SJonas Devlieghere     return lldb::SBCommand(new_command_sp);
646d232abc3SJonas Devlieghere   return lldb::SBCommand();
64721dfcd9dSEnrico Granata }
64821dfcd9dSEnrico Granata 
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help)649b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddCommand(const char *name,
650b9c1b51eSKate Stone                                       lldb::SBCommandPluginInterface *impl,
651b9c1b51eSKate Stone                                       const char *help) {
6521755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help);
653d232abc3SJonas Devlieghere   return AddCommand(name, impl, help, /*syntax=*/nullptr,
654d232abc3SJonas Devlieghere                     /*auto_repeat_command=*/"");
65521dfcd9dSEnrico Granata }
656e87764f2SEnrico Granata 
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax)657b9c1b51eSKate Stone lldb::SBCommand SBCommand::AddCommand(const char *name,
658b9c1b51eSKate Stone                                       lldb::SBCommandPluginInterface *impl,
659b9c1b51eSKate Stone                                       const char *help, const char *syntax) {
6601755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help, syntax);
661d232abc3SJonas Devlieghere   return AddCommand(name, impl, help, syntax, /*auto_repeat_command=*/"");
662be3f8a8eSWalter Erquinigo }
663be3f8a8eSWalter Erquinigo 
AddCommand(const char * name,lldb::SBCommandPluginInterface * impl,const char * help,const char * syntax,const char * auto_repeat_command)664be3f8a8eSWalter Erquinigo lldb::SBCommand SBCommand::AddCommand(const char *name,
665be3f8a8eSWalter Erquinigo                                       lldb::SBCommandPluginInterface *impl,
666be3f8a8eSWalter Erquinigo                                       const char *help, const char *syntax,
667be3f8a8eSWalter Erquinigo                                       const char *auto_repeat_command) {
6681755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, name, impl, help, syntax, auto_repeat_command);
669baf5664fSJonas Devlieghere 
670f605c198SAbhishek Aggarwal   if (!IsValid())
671d232abc3SJonas Devlieghere     return lldb::SBCommand();
672f605c198SAbhishek Aggarwal   if (!m_opaque_sp->IsMultiwordObject())
673d232abc3SJonas Devlieghere     return lldb::SBCommand();
674f605c198SAbhishek Aggarwal   lldb::CommandObjectSP new_command_sp;
675796ac80bSJonas Devlieghere   new_command_sp = std::make_shared<CommandPluginInterfaceImplementation>(
676be3f8a8eSWalter Erquinigo       m_opaque_sp->GetCommandInterpreter(), name, impl, help, syntax,
677be3f8a8eSWalter Erquinigo       /*flags=*/0, auto_repeat_command);
678f605c198SAbhishek Aggarwal   if (new_command_sp && m_opaque_sp->LoadSubCommand(name, new_command_sp))
679d232abc3SJonas Devlieghere     return lldb::SBCommand(new_command_sp);
680d232abc3SJonas Devlieghere   return lldb::SBCommand();
681f605c198SAbhishek Aggarwal }
682f605c198SAbhishek Aggarwal 
GetFlags()683b9c1b51eSKate Stone uint32_t SBCommand::GetFlags() {
6841755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this);
685baf5664fSJonas Devlieghere 
686dbb0abbfSEugene Zelenko   return (IsValid() ? m_opaque_sp->GetFlags().Get() : 0);
687e87764f2SEnrico Granata }
688e87764f2SEnrico Granata 
SetFlags(uint32_t flags)689b9c1b51eSKate Stone void SBCommand::SetFlags(uint32_t flags) {
6901755f5b1SJonas Devlieghere   LLDB_INSTRUMENT_VA(this, flags);
691baf5664fSJonas Devlieghere 
692e87764f2SEnrico Granata   if (IsValid())
693e87764f2SEnrico Granata     m_opaque_sp->GetFlags().Set(flags);
694e87764f2SEnrico Granata }
695