1 //===-- CommandObject.h -----------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef liblldb_CommandObject_h_
11 #define liblldb_CommandObject_h_
19 // Other libraries and framework includes
21 #include "lldb/Utility/Flags.h"
23 #include "lldb/Interpreter/Args.h"
24 #include "lldb/Interpreter/CommandCompletions.h"
25 #include "lldb/Target/ExecutionContext.h"
26 #include "lldb/Utility/StringList.h"
27 #include "lldb/lldb-private.h"
29 namespace lldb_private {
31 // This function really deals with CommandObjectLists, but we didn't make a
32 // CommandObjectList class, so I'm sticking it here. But we really should have
33 // such a class. Anyway, it looks up the commands in the map that match the
35 // string cmd_str, inserts the matches into matches, and returns the number
38 template <typename ValueType>
39 int AddNamesMatchingPartialString(const std::map<std::string, ValueType> &in_map,
40 llvm::StringRef cmd_str, StringList &matches) {
43 const bool add_all = cmd_str.empty();
45 for (auto iter = in_map.begin(), end = in_map.end(); iter != end; iter++) {
46 if (add_all || (iter->first.find(cmd_str, 0) == 0)) {
48 matches.AppendString(iter->first.c_str());
55 template <typename ValueType>
56 size_t FindLongestCommandWord(std::map<std::string, ValueType> &dict) {
57 auto end = dict.end();
60 for (auto pos = dict.begin(); pos != end; ++pos) {
61 size_t len = pos->first.size();
70 typedef llvm::StringRef(ArgumentHelpCallbackFunction)();
72 struct ArgumentHelpCallback {
73 ArgumentHelpCallbackFunction *help_callback;
76 llvm::StringRef operator()() const { return (*help_callback)(); }
78 explicit operator bool() const { return (help_callback != nullptr); }
81 struct ArgumentTableEntry // Entries in the main argument information table
83 lldb::CommandArgumentType arg_type;
85 CommandCompletions::CommonCompletionTypes completion_type;
86 ArgumentHelpCallback help_function;
87 const char *help_text;
90 struct CommandArgumentData // Used to build individual command argument lists
92 lldb::CommandArgumentType arg_type;
93 ArgumentRepetitionType arg_repetition;
94 uint32_t arg_opt_set_association; // This arg might be associated only with
95 // some particular option set(s).
97 : arg_type(lldb::eArgTypeNone), arg_repetition(eArgRepeatPlain),
98 arg_opt_set_association(LLDB_OPT_SET_ALL) // By default, the arg
99 // associates to all option
104 typedef std::vector<CommandArgumentData>
105 CommandArgumentEntry; // Used to build individual command argument lists
107 static ArgumentTableEntry g_arguments_data
108 [lldb::eArgTypeLastArg]; // Main argument information table
110 typedef std::map<std::string, lldb::CommandObjectSP> CommandMap;
112 CommandObject(CommandInterpreter &interpreter, llvm::StringRef name,
113 llvm::StringRef help = "", llvm::StringRef syntax = "",
116 virtual ~CommandObject();
119 GetArgumentTypeAsCString(const lldb::CommandArgumentType arg_type);
122 GetArgumentDescriptionAsCString(const lldb::CommandArgumentType arg_type);
124 CommandInterpreter &GetCommandInterpreter() { return m_interpreter; }
126 virtual llvm::StringRef GetHelp();
128 virtual llvm::StringRef GetHelpLong();
130 virtual llvm::StringRef GetSyntax();
132 llvm::StringRef GetCommandName() const;
134 virtual void SetHelp(llvm::StringRef str);
136 virtual void SetHelpLong(llvm::StringRef str);
138 void SetSyntax(llvm::StringRef str);
140 // override this to return true if you want to enable the user to delete
141 // the Command object from the Command dictionary (aliases have their own
142 // deletion scheme, so they do not need to care about this)
143 virtual bool IsRemovable() const { return false; }
145 virtual bool IsMultiwordObject() { return false; }
147 virtual CommandObjectMultiword *GetAsMultiwordCommand() { return nullptr; }
149 virtual bool IsAlias() { return false; }
151 // override this to return true if your command is somehow a "dash-dash"
152 // form of some other command (e.g. po is expr -O --); this is a powerful
153 // hint to the help system that one cannot pass options to this command
154 virtual bool IsDashDashCommand() { return false; }
156 virtual lldb::CommandObjectSP GetSubcommandSP(llvm::StringRef sub_cmd,
157 StringList *matches = nullptr) {
158 return lldb::CommandObjectSP();
161 virtual CommandObject *GetSubcommandObject(llvm::StringRef sub_cmd,
162 StringList *matches = nullptr) {
166 virtual void AproposAllSubCommands(llvm::StringRef prefix,
167 llvm::StringRef search_word,
168 StringList &commands_found,
169 StringList &commands_help) {}
171 void FormatLongHelpText(Stream &output_strm, llvm::StringRef long_help);
173 void GenerateHelpText(CommandReturnObject &result);
175 virtual void GenerateHelpText(Stream &result);
177 // this is needed in order to allow the SBCommand class to
178 // transparently try and load subcommands - it will fail on
179 // anything but a multiword command, but it avoids us doing
180 // type checkings and casts
181 virtual bool LoadSubCommand(llvm::StringRef cmd_name,
182 const lldb::CommandObjectSP &command_obj) {
186 virtual bool WantsRawCommandString() = 0;
188 // By default, WantsCompletion = !WantsRawCommandString.
189 // Subclasses who want raw command string but desire, for example,
190 // argument completion should override this method to return true.
191 virtual bool WantsCompletion() { return !WantsRawCommandString(); }
193 virtual Options *GetOptions();
195 static const ArgumentTableEntry *GetArgumentTable();
197 static lldb::CommandArgumentType LookupArgumentName(llvm::StringRef arg_name);
199 static const ArgumentTableEntry *
200 FindArgumentDataByType(lldb::CommandArgumentType arg_type);
202 int GetNumArgumentEntries();
204 CommandArgumentEntry *GetArgumentEntryAtIndex(int idx);
206 static void GetArgumentHelp(Stream &str, lldb::CommandArgumentType arg_type,
207 CommandInterpreter &interpreter);
209 static const char *GetArgumentName(lldb::CommandArgumentType arg_type);
211 // Generates a nicely formatted command args string for help command output.
212 // By default, all possible args are taken into account, for example,
213 // '<expr | variable-name>'. This can be refined by passing a second arg
214 // specifying which option set(s) we are interested, which could then, for
215 // example, produce either '<expr>' or '<variable-name>'.
216 void GetFormattedCommandArguments(Stream &str,
217 uint32_t opt_set_mask = LLDB_OPT_SET_ALL);
219 bool IsPairType(ArgumentRepetitionType arg_repeat_type);
221 bool ParseOptions(Args &args, CommandReturnObject &result);
223 void SetCommandName(llvm::StringRef name);
225 //------------------------------------------------------------------
226 /// The input array contains a parsed version of the line. The insertion
227 /// point is given by cursor_index (the index in input of the word containing
228 /// the cursor) and cursor_char_position (the position of the cursor in that
230 /// This default version handles calling option argument completions and then
232 /// HandleArgumentCompletion if the cursor is on an argument, not an option.
233 /// Don't override this method, override HandleArgumentCompletion instead
235 /// you have special reasons.
237 /// @param[in] interpreter
238 /// The command interpreter doing the completion.
241 /// The command line parsed into words
243 /// @param[in] cursor_index
244 /// The index in \ainput of the word in which the cursor lies.
246 /// @param[in] cursor_char_pos
247 /// The character position of the cursor in its argument word.
249 /// @param[in] match_start_point
250 /// @param[in] match_return_elements
251 /// FIXME: Not yet implemented... If there is a match that is expensive
252 /// to compute, these are
253 /// here to allow you to compute the completions in batches. Start the
254 /// completion from \amatch_start_point,
255 /// and return \amatch_return_elements elements.
257 /// @param[out] word_complete
258 /// \btrue if this is a complete option value (a space will be inserted
260 /// completion.) \bfalse otherwise.
262 /// @param[out] matches
263 /// The array of matches returned.
265 /// FIXME: This is the wrong return value, since we also need to make a
266 /// distinction between
267 /// total number of matches, and the window the user wants returned.
270 /// \btrue if we were in an option, \bfalse otherwise.
271 //------------------------------------------------------------------
272 virtual int HandleCompletion(Args &input, int &cursor_index,
273 int &cursor_char_position, int match_start_point,
274 int max_return_elements, bool &word_complete,
275 StringList &matches);
277 //------------------------------------------------------------------
278 /// The input array contains a parsed version of the line. The insertion
279 /// point is given by cursor_index (the index in input of the word containing
280 /// the cursor) and cursor_char_position (the position of the cursor in that
282 /// We've constructed the map of options and their arguments as well if that
284 /// helpful for the completion.
286 /// @param[in] interpreter
287 /// The command interpreter doing the completion.
290 /// The command line parsed into words
292 /// @param[in] cursor_index
293 /// The index in \ainput of the word in which the cursor lies.
295 /// @param[in] cursor_char_pos
296 /// The character position of the cursor in its argument word.
298 /// @param[in] opt_element_vector
299 /// The results of the options parse of \a input.
301 /// @param[in] match_start_point
302 /// @param[in] match_return_elements
303 /// See CommandObject::HandleCompletions for a description of how these
306 /// @param[out] word_complete
307 /// \btrue if this is a complete option value (a space will be inserted
309 /// completion.) \bfalse otherwise.
311 /// @param[out] matches
312 /// The array of matches returned.
314 /// FIXME: This is the wrong return value, since we also need to make a
315 /// distinction between
316 /// total number of matches, and the window the user wants returned.
319 /// The number of completions.
320 //------------------------------------------------------------------
321 virtual int HandleArgumentCompletion(
322 Args &input, int &cursor_index, int &cursor_char_position,
323 OptionElementVector &opt_element_vector, int match_start_point,
324 int max_return_elements, bool &word_complete, StringList &matches) {
328 bool HelpTextContainsWord(llvm::StringRef search_word,
329 bool search_short_help = true,
330 bool search_long_help = true,
331 bool search_syntax = true,
332 bool search_options = true);
334 //------------------------------------------------------------------
335 /// The flags accessor.
338 /// A reference to the Flags member variable.
339 //------------------------------------------------------------------
340 Flags &GetFlags() { return m_flags; }
342 //------------------------------------------------------------------
343 /// The flags const accessor.
346 /// A const reference to the Flags member variable.
347 //------------------------------------------------------------------
348 const Flags &GetFlags() const { return m_flags; }
350 //------------------------------------------------------------------
351 /// Get the command that appropriate for a "repeat" of the current command.
353 /// @param[in] current_command_line
354 /// The complete current command line.
357 /// nullptr if there is no special repeat command - it will use the
358 /// current command line.
359 /// Otherwise a pointer to the command to be repeated.
360 /// If the returned string is the empty string, the command won't be
362 //------------------------------------------------------------------
363 virtual const char *GetRepeatCommand(Args ¤t_command_args,
368 bool HasOverrideCallback() const {
369 return m_command_override_callback ||
370 m_deprecated_command_override_callback;
373 void SetOverrideCallback(lldb::CommandOverrideCallback callback,
375 m_deprecated_command_override_callback = callback;
376 m_command_override_baton = baton;
379 void SetOverrideCallback(lldb::CommandOverrideCallbackWithResult callback,
381 m_command_override_callback = callback;
382 m_command_override_baton = baton;
385 bool InvokeOverrideCallback(const char **argv, CommandReturnObject &result) {
386 if (m_command_override_callback)
387 return m_command_override_callback(m_command_override_baton, argv,
389 else if (m_deprecated_command_override_callback)
390 return m_deprecated_command_override_callback(m_command_override_baton,
396 virtual bool Execute(const char *args_string,
397 CommandReturnObject &result) = 0;
400 virtual const char *GetInvalidTargetDescription() {
401 return "invalid target, create a target using the 'target create' command";
404 virtual const char *GetInvalidProcessDescription() {
405 return "invalid process";
408 virtual const char *GetInvalidThreadDescription() { return "invalid thread"; }
410 virtual const char *GetInvalidFrameDescription() { return "invalid frame"; }
412 virtual const char *GetInvalidRegContextDescription() {
413 return "invalid frame, no registers";
416 // This is for use in the command interpreter, when you either want the
417 // selected target, or if no target
418 // is present you want to prime the dummy target with entities that will be
419 // copied over to new targets.
420 Target *GetSelectedOrDummyTarget(bool prefer_dummy = false);
421 Target *GetDummyTarget();
423 // If a command needs to use the "current" thread, use this call.
424 // Command objects will have an ExecutionContext to use, and that may or may
425 // not have a thread in it. If it
426 // does, you should use that by default, if not, then use the
427 // ExecutionContext's target's selected thread, etc...
428 // This call insulates you from the details of this calculation.
429 Thread *GetDefaultThread();
431 //------------------------------------------------------------------
432 /// Check the command to make sure anything required by this
433 /// command is available.
435 /// @param[out] result
436 /// A command result object, if it is not okay to run the command
437 /// this will be filled in with a suitable error.
440 /// \b true if it is okay to run this command, \b false otherwise.
441 //------------------------------------------------------------------
442 bool CheckRequirements(CommandReturnObject &result);
446 CommandInterpreter &m_interpreter;
447 ExecutionContext m_exe_ctx;
448 std::unique_lock<std::recursive_mutex> m_api_locker;
449 std::string m_cmd_name;
450 std::string m_cmd_help_short;
451 std::string m_cmd_help_long;
452 std::string m_cmd_syntax;
454 std::vector<CommandArgumentEntry> m_arguments;
455 lldb::CommandOverrideCallback m_deprecated_command_override_callback;
456 lldb::CommandOverrideCallbackWithResult m_command_override_callback;
457 void *m_command_override_baton;
459 // Helper function to populate IDs or ID ranges as the command argument data
460 // to the specified command argument entry.
461 static void AddIDsArgumentData(CommandArgumentEntry &arg,
462 lldb::CommandArgumentType ID,
463 lldb::CommandArgumentType IDRange);
466 class CommandObjectParsed : public CommandObject {
468 CommandObjectParsed(CommandInterpreter &interpreter, const char *name,
469 const char *help = nullptr, const char *syntax = nullptr,
471 : CommandObject(interpreter, name, help, syntax, flags) {}
473 ~CommandObjectParsed() override = default;
475 bool Execute(const char *args_string, CommandReturnObject &result) override;
478 virtual bool DoExecute(Args &command, CommandReturnObject &result) = 0;
480 bool WantsRawCommandString() override { return false; }
483 class CommandObjectRaw : public CommandObject {
485 CommandObjectRaw(CommandInterpreter &interpreter, llvm::StringRef name,
486 llvm::StringRef help = "", llvm::StringRef syntax = "",
488 : CommandObject(interpreter, name, help, syntax, flags) {}
490 ~CommandObjectRaw() override = default;
492 bool Execute(const char *args_string, CommandReturnObject &result) override;
495 virtual bool DoExecute(const char *command, CommandReturnObject &result) = 0;
497 bool WantsRawCommandString() override { return true; }
500 } // namespace lldb_private
502 #endif // liblldb_CommandObject_h_