Author: enrico Date: Tue Mar 22 20:21:55 2016 New Revision: 264123 URL: http://llvm.org/viewvc/llvm-project?rev=264123&view=rev Log: Change 'apropos' such that it doesn't look into the "long help/syntax" strings for commands
This solves issues such as 'apropos foo' returning valid matches just because syntax examples happen to use 'foo' as a placeholder token Fixes rdar://9043025 Modified: lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h lldb/trunk/include/lldb/Interpreter/CommandObject.h lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h lldb/trunk/packages/Python/lldbsuite/test/functionalities/multidebugger_commands/TestMultipleDebuggersCommands.py lldb/trunk/source/Commands/CommandObjectApropos.cpp lldb/trunk/source/Interpreter/CommandInterpreter.cpp lldb/trunk/source/Interpreter/CommandObject.cpp Modified: lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h (original) +++ lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h Tue Mar 22 20:21:55 2016 @@ -201,8 +201,6 @@ class CommandInterpreter : public IOHandlerDelegate { public: - typedef std::map<std::string, lldb::CommandObjectSP> CommandAliasMap; - enum { eBroadcastBitThreadShouldExit = (1 << 0), @@ -527,7 +525,8 @@ public: StringList &commands_found, StringList &commands_help, bool search_builtin_commands, - bool search_user_commands); + bool search_user_commands, + bool search_alias_commands); bool GetBatchCommandMode () { return m_batch_command_mode; } @@ -680,13 +679,19 @@ private: CommandObject * ResolveCommandImpl(std::string &command_line, CommandReturnObject &result); + void + FindCommandsForApropos (const char *word, + StringList &commands_found, + StringList &commands_help, + CommandObject::CommandMap &command_map); + Debugger &m_debugger; // The debugger session that this interpreter is associated with ExecutionContextRef m_exe_ctx_ref; // The current execution context to use when handling commands bool m_synchronous_execution; bool m_skip_lldbinit_files; bool m_skip_app_init_files; CommandObject::CommandMap m_command_dict; // Stores basic built-in commands (they cannot be deleted, removed or overwritten). - CommandAliasMap m_alias_dict; // Stores user aliases/abbreviations for commands + CommandObject::CommandMap m_alias_dict; // Stores user aliases/abbreviations for commands CommandObject::CommandMap m_user_dict; // Stores user-defined commands CommandHistory m_command_history; std::string m_repeat_command; // Stores the command that will be executed for an empty command string. Modified: lldb/trunk/include/lldb/Interpreter/CommandObject.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObject.h?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/CommandObject.h (original) +++ lldb/trunk/include/lldb/Interpreter/CommandObject.h Tue Mar 22 20:21:55 2016 @@ -373,7 +373,11 @@ public: } bool - HelpTextContainsWord (const char *search_word); + HelpTextContainsWord (const char *search_word, + bool search_short_help = true, + bool search_long_help = true, + bool search_syntax = true, + bool search_options = true); //------------------------------------------------------------------ /// The flags accessor. Modified: lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h (original) +++ lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h Tue Mar 22 20:21:55 2016 @@ -96,6 +96,11 @@ public: } protected: + CommandObject::CommandMap& + GetSubcommandDictionary () + { + return m_subcommand_dict; + } CommandObject::CommandMap m_subcommand_dict; bool m_can_be_removed; Modified: lldb/trunk/packages/Python/lldbsuite/test/functionalities/multidebugger_commands/TestMultipleDebuggersCommands.py URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/multidebugger_commands/TestMultipleDebuggersCommands.py?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/packages/Python/lldbsuite/test/functionalities/multidebugger_commands/TestMultipleDebuggersCommands.py (original) +++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/multidebugger_commands/TestMultipleDebuggersCommands.py Tue Mar 22 20:21:55 2016 @@ -20,7 +20,7 @@ class MultipleDebuggersCommandsTestCase( def test_multipledebuggers_commands(self): """Test that commands do not try and hold on to stale CommandInterpreters in a multiple debuggers scenario""" source_init_files = False - magic_text = "The following built-in commands may relate to 'env'" + magic_text = "The following commands may relate to 'env'" debugger_1 = lldb.SBDebugger.Create(source_init_files) interpreter_1 = debugger_1.GetCommandInterpreter() Modified: lldb/trunk/source/Commands/CommandObjectApropos.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectApropos.cpp?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/source/Commands/CommandObjectApropos.cpp (original) +++ lldb/trunk/source/Commands/CommandObjectApropos.cpp Tue Mar 22 20:21:55 2016 @@ -62,13 +62,10 @@ CommandObjectApropos::DoExecute (Args& a // is private. StringList commands_found; StringList commands_help; - StringList user_commands_found; - StringList user_commands_help; - m_interpreter.FindCommandsForApropos (search_word, commands_found, commands_help, true, false); - m_interpreter.FindCommandsForApropos (search_word, user_commands_found, user_commands_help, false, true); + m_interpreter.FindCommandsForApropos (search_word, commands_found, commands_help, true, true, true); - if (commands_found.GetSize() == 0 && user_commands_found.GetSize() == 0) + if (commands_found.GetSize() == 0) { result.AppendMessageWithFormat ("No commands found pertaining to '%s'. Try 'help' to see a complete list of debugger commands.\n", search_word); } @@ -76,7 +73,7 @@ CommandObjectApropos::DoExecute (Args& a { if (commands_found.GetSize() > 0) { - result.AppendMessageWithFormat ("The following built-in commands may relate to '%s':\n", search_word); + result.AppendMessageWithFormat ("The following commands may relate to '%s':\n", search_word); size_t max_len = 0; for (size_t i = 0; i < commands_found.GetSize(); ++i) @@ -92,28 +89,6 @@ CommandObjectApropos::DoExecute (Args& a "--", commands_help.GetStringAtIndex(i), max_len); - if (user_commands_found.GetSize() > 0) - result.AppendMessage(""); - } - - if (user_commands_found.GetSize() > 0) - { - result.AppendMessageWithFormat ("The following user commands may relate to '%s':\n", search_word); - size_t max_len = 0; - - for (size_t i = 0; i < user_commands_found.GetSize(); ++i) - { - size_t len = strlen (user_commands_found.GetStringAtIndex (i)); - if (len > max_len) - max_len = len; - } - - for (size_t i = 0; i < user_commands_found.GetSize(); ++i) - m_interpreter.OutputFormattedHelpText (result.GetOutputStream(), - user_commands_found.GetStringAtIndex(i), - "--", - user_commands_help.GetStringAtIndex(i), - max_len); } } Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original) +++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Tue Mar 22 20:21:55 2016 @@ -780,7 +780,7 @@ CommandInterpreter::GetCommandSP (const if (include_aliases && HasAliases()) { - CommandAliasMap::iterator alias_pos = m_alias_dict.find(cmd); + auto alias_pos = m_alias_dict.find(cmd); if (alias_pos != m_alias_dict.end()) command_sp = alias_pos->second; } @@ -831,7 +831,7 @@ CommandInterpreter::GetCommandSP (const if (num_alias_matches == 1) { cmd.assign(matches->GetStringAtIndex (num_cmd_matches)); - CommandAliasMap::iterator alias_pos = m_alias_dict.find(cmd); + auto alias_pos = m_alias_dict.find(cmd); if (alias_pos != m_alias_dict.end()) alias_match_sp = alias_pos->second; } @@ -2781,54 +2781,63 @@ CommandInterpreter::OutputHelpText (Stre } void -CommandInterpreter::FindCommandsForApropos (const char *search_word, StringList &commands_found, - StringList &commands_help, bool search_builtin_commands, bool search_user_commands) +CommandInterpreter::FindCommandsForApropos (const char *search_word, + StringList &commands_found, + StringList &commands_help, + CommandObject::CommandMap &command_map) { CommandObject::CommandMap::const_iterator pos; - - if (search_builtin_commands) + + for (pos = command_map.begin(); pos != command_map.end(); ++pos) { - for (pos = m_command_dict.begin(); pos != m_command_dict.end(); ++pos) - { - const char *command_name = pos->first.c_str(); - CommandObject *cmd_obj = pos->second.get(); - - if (cmd_obj->HelpTextContainsWord (search_word)) - { - commands_found.AppendString (command_name); - commands_help.AppendString (cmd_obj->GetHelp()); - } - - if (cmd_obj->IsMultiwordObject()) - cmd_obj->AproposAllSubCommands (command_name, - search_word, - commands_found, - commands_help); - + const char *command_name = pos->first.c_str(); + CommandObject *cmd_obj = pos->second.get(); + + const bool search_short_help = true; + const bool search_long_help = false; + const bool search_syntax = false; + const bool search_options = false; + if (strcasestr(command_name, search_word) || + cmd_obj->HelpTextContainsWord (search_word, + search_short_help, + search_long_help, + search_syntax, + search_options)) + { + commands_found.AppendString (command_name); + commands_help.AppendString (cmd_obj->GetHelp()); + } + + if (cmd_obj->IsMultiwordObject()) + { + CommandObjectMultiword *cmd_multiword = (CommandObjectMultiword*)cmd_obj; + FindCommandsForApropos(search_word, + commands_found, + commands_help, + cmd_multiword->GetSubcommandDictionary()); } } +} + + +void +CommandInterpreter::FindCommandsForApropos (const char *search_word, + StringList &commands_found, + StringList &commands_help, + bool search_builtin_commands, + bool search_user_commands, + bool search_alias_commands) +{ + CommandObject::CommandMap::const_iterator pos; + + if (search_builtin_commands) + FindCommandsForApropos(search_word, commands_found, commands_help, m_command_dict); if (search_user_commands) - { - for (pos = m_user_dict.begin(); pos != m_user_dict.end(); ++pos) - { - const char *command_name = pos->first.c_str(); - CommandObject *cmd_obj = pos->second.get(); - - if (cmd_obj->HelpTextContainsWord (search_word)) - { - commands_found.AppendString (command_name); - commands_help.AppendString (cmd_obj->GetHelp()); - } + FindCommandsForApropos(search_word, commands_found, commands_help, m_user_dict); - if (cmd_obj->IsMultiwordObject()) - cmd_obj->AproposAllSubCommands (command_name, - search_word, - commands_found, - commands_help); - - } - } + if (search_alias_commands) + FindCommandsForApropos(search_word, commands_found, commands_help, m_alias_dict); } void Modified: lldb/trunk/source/Interpreter/CommandObject.cpp URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObject.cpp?rev=264123&r1=264122&r2=264123&view=diff ============================================================================== --- lldb/trunk/source/Interpreter/CommandObject.cpp (original) +++ lldb/trunk/source/Interpreter/CommandObject.cpp Tue Mar 22 20:21:55 2016 @@ -411,7 +411,11 @@ CommandObject::HandleCompletion } bool -CommandObject::HelpTextContainsWord (const char *search_word) +CommandObject::HelpTextContainsWord (const char *search_word, + bool search_short_help, + bool search_long_help, + bool search_syntax, + bool search_options) { std::string options_usage_help; @@ -421,14 +425,15 @@ CommandObject::HelpTextContainsWord (con const char *long_help = GetHelpLong(); const char *syntax_help = GetSyntax(); - if (short_help && strcasestr (short_help, search_word)) + if (search_short_help && short_help && strcasestr (short_help, search_word)) found_word = true; - else if (long_help && strcasestr (long_help, search_word)) + else if (search_long_help && long_help && strcasestr (long_help, search_word)) found_word = true; - else if (syntax_help && strcasestr (syntax_help, search_word)) + else if (search_syntax && syntax_help && strcasestr (syntax_help, search_word)) found_word = true; if (!found_word + && search_options && GetOptions() != nullptr) { StreamString usage_help; _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits