[Lldb-commits] [lldb] r107247 - in /lldb/trunk: include/lldb/Interpreter/ source/Commands/ source/Interpreter/
Jim Ingham
jingham at apple.com
Tue Jun 29 22:02:46 PDT 2010
Author: jingham
Date: Wed Jun 30 00:02:46 2010
New Revision: 107247
URL: http://llvm.org/viewvc/llvm-project?rev=107247&view=rev
Log:
Add a source file completer to the CommandCompleters.
Add a way for the completers to say whether the completed argument should have a space inserted after is
or not.
Added the file name completer to the "file" command.
Modified:
lldb/trunk/include/lldb/Interpreter/CommandCompletions.h
lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h
lldb/trunk/include/lldb/Interpreter/CommandObject.h
lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h
lldb/trunk/include/lldb/Interpreter/Options.h
lldb/trunk/source/Commands/CommandCompletions.cpp
lldb/trunk/source/Commands/CommandObjectFile.cpp
lldb/trunk/source/Commands/CommandObjectFile.h
lldb/trunk/source/Commands/CommandObjectHelp.cpp
lldb/trunk/source/Commands/CommandObjectHelp.h
lldb/trunk/source/Commands/CommandObjectImage.cpp
lldb/trunk/source/Commands/CommandObjectMultiword.cpp
lldb/trunk/source/Interpreter/CommandInterpreter.cpp
lldb/trunk/source/Interpreter/CommandObject.cpp
lldb/trunk/source/Interpreter/Options.cpp
Modified: lldb/trunk/include/lldb/Interpreter/CommandCompletions.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandCompletions.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/CommandCompletions.h (original)
+++ lldb/trunk/include/lldb/Interpreter/CommandCompletions.h Wed Jun 30 00:02:46 2010
@@ -34,15 +34,17 @@
int match_start_point, // This is the point in the list of matches that you should start returning elements
int max_return_elements, // This is the number of matches requested.
lldb_private::SearchFilter *searcher,// A search filter to limit the search...
+ bool &word_complete,
lldb_private::StringList &matches); // The array of matches we return.
typedef enum
{
- eNoCompletion = 0,
- eSourceFileCompletion = (1 << 0),
- eDiskFileCompletion = (1 << 1),
- eSymbolCompletion = (1 << 2),
- eModuleCompletion = (1 << 3),
- eCustomCompletion = (1 << 4) // This item serves two purposes. It is the last element in the enum,
+ eNoCompletion = 0,
+ eSourceFileCompletion = (1 << 0),
+ eDiskFileCompletion = (1 << 1),
+ eDiskDirectoryCompletion = (1 << 2),
+ eSymbolCompletion = (1 << 3),
+ eModuleCompletion = (1 << 4),
+ eCustomCompletion = (1 << 5) // This item serves two purposes. It is the last element in the enum,
// so you can add custom enums starting from here in your Option class.
// Also if you & in this bit the base code will not process the option.
@@ -60,17 +62,36 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches);
//----------------------------------------------------------------------
// These are the generic completer functions:
//----------------------------------------------------------------------
static int
+ DiskFiles (CommandInterpreter &interpreter,
+ const char *partial_file_name,
+ int match_start_point,
+ int max_return_elements,
+ SearchFilter *searcher,
+ bool &word_complete,
+ StringList &matches);
+ static int
+ DiskDirectories (CommandInterpreter &interpreter,
+ const char *partial_file_name,
+ int match_start_point,
+ int max_return_elements,
+ SearchFilter *searcher,
+ bool &word_complete,
+ StringList &matches);
+
+ static int
SourceFiles (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches);
static int
@@ -79,6 +100,7 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
lldb_private::StringList &matches);
static int
@@ -87,6 +109,7 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
lldb_private::StringList &matches);
//----------------------------------------------------------------------
Modified: lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h (original)
+++ lldb/trunk/include/lldb/Interpreter/CommandInterpreter.h Wed Jun 30 00:02:46 2010
@@ -116,6 +116,8 @@
// This version just returns matches, and doesn't compute the substring. It is here so the
// Help command can call it for the first argument.
+ // word_complete tells whether a the completions are considered a "complete" response (so the
+ // completer should complete the quote & put a space after the word.
int
HandleCompletionMatches (Args &input,
@@ -123,6 +125,7 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches);
Modified: lldb/trunk/include/lldb/Interpreter/CommandObject.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObject.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/CommandObject.h (original)
+++ lldb/trunk/include/lldb/Interpreter/CommandObject.h Wed Jun 30 00:02:46 2010
@@ -122,13 +122,46 @@
static int
AddNamesMatchingPartialString (CommandMap &in_map, const char *cmd_str, StringList &matches);
- // The input array contains a parsed version of the line. The insertion
- // point is given by cursor_index (the index in input of the word containing
- // the cursor) and cursor_char_position (the position of the cursor in that word.)
- // This default version handles calling option argument completions and then calls
- // HandleArgumentCompletion if the cursor is on an argument, not an option.
- // Don't override this method, override HandleArgumentCompletion instead unless
- // you have special reasons.
+ //------------------------------------------------------------------
+ /// The input array contains a parsed version of the line. The insertion
+ /// point is given by cursor_index (the index in input of the word containing
+ /// the cursor) and cursor_char_position (the position of the cursor in that word.)
+ /// This default version handles calling option argument completions and then calls
+ /// HandleArgumentCompletion if the cursor is on an argument, not an option.
+ /// Don't override this method, override HandleArgumentCompletion instead unless
+ /// you have special reasons.
+ ///
+ /// @param[in] interpreter
+ /// The command interpreter doing the completion.
+ ///
+ /// @param[in] input
+ /// The command line parsed into words
+ ///
+ /// @param[in] cursor_index
+ /// The index in \ainput of the word in which the cursor lies.
+ ///
+ /// @param[in] cursor_char_pos
+ /// The character position of the cursor in its argument word.
+ ///
+ /// @param[in] match_start_point
+ /// @param[in] match_return_elements
+ /// FIXME: Not yet implemented... If there is a match that is expensive to compute, these are
+ /// here to allow you to compute the completions in batches. Start the completion from \amatch_start_point,
+ /// and return \amatch_return_elements elements.
+ ///
+ /// @param[out] word_complete
+ /// \btrue if this is a complete option value (a space will be inserted after the
+ /// completion.) \bfalse otherwise.
+ ///
+ /// @param[out] matches
+ /// The array of matches returned.
+ ///
+ /// FIXME: This is the wrong return value, since we also need to make a distinction between
+ /// total number of matches, and the window the user wants returned.
+ ///
+ /// @return
+ /// \btrue if we were in an option, \bfalse otherwise.
+ //------------------------------------------------------------------
virtual int
HandleCompletion (CommandInterpreter &interpreter,
Args &input,
@@ -136,13 +169,48 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches);
- // The input array contains a parsed version of the line. The insertion
- // point is given by cursor_index (the index in input of the word containing
- // the cursor) and cursor_char_position (the position of the cursor in that word.)
- // We've constructed the map of options and their arguments as well if that is
- // helpful for the completion.
+ //------------------------------------------------------------------
+ /// The input array contains a parsed version of the line. The insertion
+ /// point is given by cursor_index (the index in input of the word containing
+ /// the cursor) and cursor_char_position (the position of the cursor in that word.)
+ /// We've constructed the map of options and their arguments as well if that is
+ /// helpful for the completion.
+ ///
+ /// @param[in] interpreter
+ /// The command interpreter doing the completion.
+ ///
+ /// @param[in] input
+ /// The command line parsed into words
+ ///
+ /// @param[in] cursor_index
+ /// The index in \ainput of the word in which the cursor lies.
+ ///
+ /// @param[in] cursor_char_pos
+ /// The character position of the cursor in its argument word.
+ ///
+ /// @param[in] opt_element_vector
+ /// The results of the options parse of \a input.
+ ///
+ /// @param[in] match_start_point
+ /// @param[in] match_return_elements
+ /// See CommandObject::HandleCompletions for a description of how these work.
+ ///
+ /// @param[out] word_complete
+ /// \btrue if this is a complete option value (a space will be inserted after the
+ /// completion.) \bfalse otherwise.
+ ///
+ /// @param[out] matches
+ /// The array of matches returned.
+ ///
+ /// FIXME: This is the wrong return value, since we also need to make a distinction between
+ /// total number of matches, and the window the user wants returned.
+ ///
+ /// @return
+ /// \btrue if we were in an option, \bfalse otherwise.
+ //------------------------------------------------------------------
virtual int
HandleArgumentCompletion (CommandInterpreter &interpreter,
@@ -152,6 +220,7 @@
OptionElementVector &opt_element_vector,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches)
{
return 0;
Modified: lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h (original)
+++ lldb/trunk/include/lldb/Interpreter/CommandObjectMultiword.h Wed Jun 30 00:02:46 2010
@@ -64,6 +64,7 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches);
CommandObject::CommandMap m_subcommand_dict;
Modified: lldb/trunk/include/lldb/Interpreter/Options.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Interpreter/Options.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Interpreter/Options.h (original)
+++ lldb/trunk/include/lldb/Interpreter/Options.h Wed Jun 30 00:02:46 2010
@@ -208,6 +208,10 @@
/// @param[in] interpreter
/// The interpreter that's doing the completing.
///
+ /// @param[out] word_complete
+ /// \btrue if this is a complete option value (a space will be inserted after the
+ /// completion.) \bfalse otherwise.
+ ///
/// @param[out] matches
/// The array of matches returned.
///
@@ -225,12 +229,16 @@
int char_pos,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
lldb_private::StringList &matches);
//------------------------------------------------------------------
/// Handles the generic bits of figuring out whether we are in an option, and if so completing
/// it.
///
+ /// @param[in] interpreter
+ /// The command interpreter doing the completion.
+ ///
/// @param[in] input
/// The command line parsed into words
///
@@ -250,8 +258,9 @@
/// @param[in] match_return_elements
/// See CommandObject::HandleCompletions for a description of how these work.
///
- /// @param[in] interpreter
- /// The interpreter that's doing the completing.
+ /// @param[out] word_complete
+ /// \btrue if this is a complete option value (a space will be inserted after the
+ /// completion.) \bfalse otherwise.
///
/// @param[out] matches
/// The array of matches returned.
@@ -271,6 +280,7 @@
int opt_element_index,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches);
protected:
Modified: lldb/trunk/source/Commands/CommandCompletions.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandCompletions.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandCompletions.cpp (original)
+++ lldb/trunk/source/Commands/CommandCompletions.cpp Wed Jun 30 00:02:46 2010
@@ -9,6 +9,11 @@
// C Includes
+#include <sys/stat.h>
+#include <dirent.h>
+#include <libgen.h>
+#include <glob.h>
+
// C++ Includes
// Other libraries and framework includes
// Project includes
@@ -24,12 +29,13 @@
CommandCompletions::CommonCompletionElement
CommandCompletions::g_common_completions[] =
{
- {eCustomCompletion, NULL},
- {eSourceFileCompletion, CommandCompletions::SourceFiles},
- {eDiskFileCompletion, NULL},
- {eSymbolCompletion, CommandCompletions::Symbols},
- {eModuleCompletion, CommandCompletions::Modules},
- {eNoCompletion, NULL} // This one has to be last in the list.
+ {eCustomCompletion, NULL},
+ {eSourceFileCompletion, CommandCompletions::SourceFiles},
+ {eDiskFileCompletion, CommandCompletions::DiskFiles},
+ {eDiskDirectoryCompletion, CommandCompletions::DiskDirectories},
+ {eSymbolCompletion, CommandCompletions::Symbols},
+ {eModuleCompletion, CommandCompletions::Modules},
+ {eNoCompletion, NULL} // This one has to be last in the list.
};
bool
@@ -41,6 +47,7 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches
)
{
@@ -62,6 +69,7 @@
match_start_point,
max_return_elements,
searcher,
+ word_complete,
matches);
}
}
@@ -76,9 +84,11 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches
)
{
+ word_complete = true;
// Find some way to switch "include support files..."
SourceFileCompleter completer (interpreter,
false,
@@ -100,6 +110,216 @@
return matches.GetSize();
}
+static int
+DiskFilesOrDirectories
+(
+ const char *partial_file_name,
+ bool only_directories,
+ bool &saw_directory,
+ StringList &matches
+)
+{
+ // I'm going to use the "glob" function with GLOB_TILDE for user directory expansion.
+ // If it is not defined on your host system, you'll need to implement it yourself...
+
+ int partial_name_len = strlen(partial_file_name);
+
+ if (partial_name_len >= PATH_MAX)
+ return matches.GetSize();
+
+ // This copy of the string will be cut up into the directory part, and the remainder. end_ptr
+ // below will point to the place of the remainder in this string. Then when we've resolved the
+ // containing directory, and opened it, we'll read the directory contents and overwrite the
+ // partial_name_copy starting from end_ptr with each of the matches. Thus we will preserve
+ // the form the user originally typed.
+
+ char partial_name_copy[PATH_MAX];
+ bcopy (partial_file_name, partial_name_copy, partial_name_len);
+ partial_name_copy[partial_name_len] = '\0';
+
+ // We'll need to save a copy of the remainder for comparision, which we do here.
+ char remainder[PATH_MAX];
+
+ // end_ptr will point past the last / in partial_name_copy, or if there is no slash to the beginning of the string.
+ char *end_ptr;
+
+ end_ptr = strrchr(partial_name_copy, '/');
+
+ // This will store the resolved form of the containing directory
+ char containing_part[PATH_MAX];
+
+ if (end_ptr == NULL)
+ {
+ // There's no directory. If the thing begins with a "~" then this is a bare
+ // user name.
+ if (*partial_name_copy == '~')
+ {
+ // Nothing here but the user name. We could just put a slash on the end,
+ // but for completeness sake we'll glob the user name and only put a slash
+ // on the end if it exists.
+ glob_t glob_buf;
+ if (glob (partial_name_copy, GLOB_TILDE, NULL, &glob_buf) != 0)
+ return matches.GetSize();
+
+ //The thing exists, put a '/' on the end, and return it...
+ // FIXME: complete user names here:
+ partial_name_copy[partial_name_len] = '/';
+ partial_name_copy[partial_name_len+1] = '\0';
+ matches.AppendString(partial_name_copy);
+ globfree(&glob_buf);
+ saw_directory == true;
+ return matches.GetSize();
+ }
+ else
+ {
+ // The containing part is the CWD, and the whole string is the remainder.
+ containing_part[0] = '.';
+ containing_part[1] = '\0';
+ strcpy(remainder, partial_name_copy);
+ end_ptr = partial_name_copy;
+ }
+ }
+ else
+ {
+ if (end_ptr == partial_name_copy)
+ {
+ // We're completing a file or directory in the root volume.
+ containing_part[0] = '/';
+ containing_part[1] = '\0';
+ }
+ else
+ {
+ size_t len = end_ptr - partial_name_copy;
+ memcpy(containing_part, partial_name_copy, len);
+ containing_part[len] = '\0';
+ }
+ // Push end_ptr past the final "/" and set remainder.
+ end_ptr++;
+ strcpy(remainder, end_ptr);
+ }
+
+ // Look for a user name in the containing part, and if it's there, glob containing_part and stick the
+ // result back into the containing_part:
+
+ if (*partial_name_copy == '~')
+ {
+ glob_t glob_buf;
+
+ // User name doesn't exist, we're not getting any further...
+ if (glob (containing_part, GLOB_TILDE, NULL, &glob_buf) != 0)
+ return matches.GetSize();
+
+ if (glob_buf.gl_pathc != 1)
+ {
+ // I'm not really sure how this would happen?
+ globfree(&glob_buf);
+ return matches.GetSize();
+ }
+ strcpy(containing_part, glob_buf.gl_pathv[0]);
+ globfree(&glob_buf);
+ }
+
+ // Okay, containing_part is now the directory we want to open and look for files:
+
+ DIR *dir_stream;
+
+ dir_stream = opendir(containing_part);
+ if (dir_stream == NULL)
+ return matches.GetSize();
+
+ struct dirent *dirent_buf;
+
+ size_t baselen = end_ptr - partial_name_copy;
+
+ while ((dirent_buf = readdir(dir_stream)) != NULL)
+ {
+ char *name = dirent_buf->d_name;
+
+ // Omit ".", ".." and any . files if the match string doesn't start with .
+ if (name[0] == '.')
+ {
+ if (name[1] == '\0')
+ continue;
+ else if (name[1] == '.' && name[2] == '\0')
+ continue;
+ else if (remainder[0] != '.')
+ continue;
+ }
+
+ if (remainder[0] == '\0' || strstr(dirent_buf->d_name, remainder) == name)
+ {
+ if (strlen(name) + baselen >= PATH_MAX)
+ continue;
+
+ strcpy(end_ptr, name);
+
+ bool isa_directory = false;
+ if (dirent_buf->d_type & DT_DIR)
+ isa_directory = true;
+ else if (dirent_buf->d_type & DT_LNK)
+ {
+ struct stat stat_buf;
+ if ((stat(partial_name_copy, &stat_buf) == 0) && (stat_buf.st_mode & S_IFDIR))
+ isa_directory = true;
+ }
+
+ if (isa_directory)
+ {
+ saw_directory = true;
+ size_t len = strlen(partial_name_copy);
+ partial_name_copy[len] = '/';
+ partial_name_copy[len + 1] = '\0';
+ }
+ if (only_directories && !isa_directory)
+ continue;
+ matches.AppendString(partial_name_copy);
+ }
+ }
+
+ return matches.GetSize();
+}
+
+int
+CommandCompletions::DiskFiles
+(
+ CommandInterpreter &interpreter,
+ const char *partial_file_name,
+ int match_start_point,
+ int max_return_elements,
+ SearchFilter *searcher,
+ bool &word_complete,
+ StringList &matches
+)
+{
+
+ int ret_val = DiskFilesOrDirectories (partial_file_name,
+ false,
+ word_complete,
+ matches);
+ word_complete = !word_complete;
+ return ret_val;
+}
+
+int
+CommandCompletions::DiskDirectories
+(
+ CommandInterpreter &interpreter,
+ const char *partial_file_name,
+ int match_start_point,
+ int max_return_elements,
+ SearchFilter *searcher,
+ bool &word_complete,
+ StringList &matches
+)
+{
+ int ret_val = DiskFilesOrDirectories (partial_file_name,
+ true,
+ word_complete,
+ matches);
+ word_complete = false;
+ return ret_val;
+}
+
int
CommandCompletions::Modules
(
@@ -108,9 +328,11 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches
)
{
+ word_complete = true;
ModuleCompleter completer (interpreter,
partial_file_name,
match_start_point,
@@ -138,8 +360,10 @@
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
+ bool &word_complete,
StringList &matches)
{
+ word_complete = true;
SymbolCompleter completer (interpreter,
partial_file_name,
match_start_point,
Modified: lldb/trunk/source/Commands/CommandObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFile.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectFile.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectFile.cpp Wed Jun 30 00:02:46 2010
@@ -19,6 +19,7 @@
#include "lldb/Core/Debugger.h"
#include "lldb/Interpreter/CommandInterpreter.h"
#include "lldb/Interpreter/CommandReturnObject.h"
+#include "lldb/Interpreter/CommandCompletions.h"
#include "lldb/Target/Process.h"
using namespace lldb;
@@ -166,3 +167,29 @@
return result.Succeeded();
}
+
+int
+CommandObjectFile::HandleArgumentCompletion (CommandInterpreter &interpreter,
+ Args &input,
+ int &cursor_index,
+ int &cursor_char_position,
+ OptionElementVector &opt_element_vector,
+ int match_start_point,
+ int max_return_elements,
+ bool &word_complete,
+ StringList &matches)
+{
+ std::string completion_str (input.GetArgumentAtIndex(cursor_index));
+ completion_str.erase (cursor_char_position);
+
+ CommandCompletions::InvokeCommonCompletionCallbacks (interpreter,
+ CommandCompletions::eDiskFileCompletion,
+ completion_str.c_str(),
+ match_start_point,
+ max_return_elements,
+ NULL,
+ word_complete,
+ matches);
+ return matches.GetSize();
+
+}
\ No newline at end of file
Modified: lldb/trunk/source/Commands/CommandObjectFile.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectFile.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectFile.h (original)
+++ lldb/trunk/source/Commands/CommandObjectFile.h Wed Jun 30 00:02:46 2010
@@ -67,6 +67,18 @@
ArchSpec m_arch;
};
+
+ virtual int
+ HandleArgumentCompletion (CommandInterpreter &interpreter,
+ Args &input,
+ int &cursor_index,
+ int &cursor_char_position,
+ OptionElementVector &opt_element_vector,
+ int match_start_point,
+ int max_return_elements,
+ bool &word_complete,
+ StringList &matches);
+
private:
CommandOptions m_options;
Modified: lldb/trunk/source/Commands/CommandObjectHelp.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectHelp.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectHelp.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectHelp.cpp Wed Jun 30 00:02:46 2010
@@ -144,19 +144,22 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches
)
{
// Return the completions of the commands in the help system:
if (cursor_index == 0)
{
- return interpreter.HandleCompletionMatches(input, cursor_index, cursor_char_position, match_start_point, max_return_elements, matches);
+ return interpreter.HandleCompletionMatches(input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
}
else
{
CommandObject *cmd_obj = interpreter.GetCommandObject (input.GetArgumentAtIndex(0), true, false);
input.Shift();
cursor_index--;
- return cmd_obj->HandleCompletion (interpreter, input, cursor_index, cursor_char_position, match_start_point, max_return_elements, matches);
+ return cmd_obj->HandleCompletion (interpreter, input, cursor_index, cursor_char_position, match_start_point,
+ max_return_elements, word_complete, matches);
}
}
Modified: lldb/trunk/source/Commands/CommandObjectHelp.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectHelp.h?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectHelp.h (original)
+++ lldb/trunk/source/Commands/CommandObjectHelp.h Wed Jun 30 00:02:46 2010
@@ -43,6 +43,7 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches);
};
Modified: lldb/trunk/source/Commands/CommandObjectImage.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectImage.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectImage.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectImage.cpp Wed Jun 30 00:02:46 2010
@@ -422,6 +422,7 @@
OptionElementVector &opt_element_vector,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches)
{
// Arguments are the standard module completer.
@@ -434,6 +435,7 @@
match_start_point,
max_return_elements,
NULL,
+ word_complete,
matches);
return matches.GetSize();
}
@@ -463,6 +465,7 @@
OptionElementVector &opt_element_vector,
int match_start_point,
int max_return_elements,
+ bool word_complete,
StringList &matches)
{
// Arguments are the standard source file completer.
@@ -475,6 +478,7 @@
match_start_point,
max_return_elements,
NULL,
+ word_complete,
matches);
return matches.GetSize();
}
Modified: lldb/trunk/source/Commands/CommandObjectMultiword.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Commands/CommandObjectMultiword.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Commands/CommandObjectMultiword.cpp (original)
+++ lldb/trunk/source/Commands/CommandObjectMultiword.cpp Wed Jun 30 00:02:46 2010
@@ -219,9 +219,14 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches
)
{
+ // Any of the command matches will provide a complete word, otherwise the individual
+ // completers will override this.
+ word_complete = true;
+
if (cursor_index == 0)
{
CommandObject::AddNamesMatchingPartialString (m_subcommand_dict,
@@ -245,7 +250,8 @@
input, cursor_index,
cursor_char_position,
match_start_point,
- max_return_elements,
+ max_return_elements,
+ word_complete,
matches);
}
else
@@ -273,7 +279,8 @@
cursor_index,
cursor_char_position,
match_start_point,
- max_return_elements,
+ max_return_elements,
+ word_complete,
matches);
}
Modified: lldb/trunk/source/Interpreter/CommandInterpreter.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandInterpreter.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandInterpreter.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandInterpreter.cpp Wed Jun 30 00:02:46 2010
@@ -653,11 +653,13 @@
int num_matches;
int cursor_index = command_args.GetArgumentCount() - 1;
int cursor_char_position = strlen (command_args.GetArgumentAtIndex(command_args.GetArgumentCount() - 1));
+ bool word_complete;
num_matches = HandleCompletionMatches (command_args,
cursor_index,
cursor_char_position,
0,
-1,
+ word_complete,
matches);
if (num_matches > 0)
@@ -692,11 +694,15 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches)
{
int num_command_matches = 0;
bool include_aliases = true;
bool look_for_subcommand = false;
+
+ // For any of the command completions a unique match will be a complete word.
+ word_complete = true;
if (cursor_index == -1)
{
@@ -743,7 +749,8 @@
cursor_index,
cursor_char_position,
match_start_point,
- max_return_elements,
+ max_return_elements,
+ word_complete,
matches);
}
}
@@ -781,11 +788,13 @@
// Only max_return_elements == -1 is supported at present:
assert (max_return_elements == -1);
+ bool word_complete;
num_command_matches = HandleCompletionMatches (parsed_line,
cursor_index,
cursor_char_position,
match_start_point,
- max_return_elements,
+ max_return_elements,
+ word_complete,
matches);
if (num_command_matches <= 0)
@@ -809,7 +818,8 @@
int partial_name_len = command_partial_str.size();
// If we matched a unique single command, add a space...
- if (num_command_matches == 1)
+ // Only do this if the completer told us this was a complete word, however...
+ if (num_command_matches == 1 && word_complete)
{
char quote_char = parsed_line.GetArgumentQuoteCharAtIndex(cursor_index);
if (quote_char != '\0')
Modified: lldb/trunk/source/Interpreter/CommandObject.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/CommandObject.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/CommandObject.cpp (original)
+++ lldb/trunk/source/Interpreter/CommandObject.cpp Wed Jun 30 00:02:46 2010
@@ -304,6 +304,7 @@
int &cursor_char_position,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
StringList &matches
)
{
@@ -345,6 +346,7 @@
cursor_char_position,
match_start_point,
max_return_elements,
+ word_complete,
matches);
if (handled_by_options)
return matches.GetSize();
@@ -358,6 +360,7 @@
opt_element_vector,
match_start_point,
max_return_elements,
+ word_complete,
matches);
}
}
Modified: lldb/trunk/source/Interpreter/Options.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Interpreter/Options.cpp?rev=107247&r1=107246&r2=107247&view=diff
==============================================================================
--- lldb/trunk/source/Interpreter/Options.cpp (original)
+++ lldb/trunk/source/Interpreter/Options.cpp Wed Jun 30 00:02:46 2010
@@ -538,9 +538,12 @@
int char_pos,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
lldb_private::StringList &matches
)
{
+ word_complete = true;
+
// For now we just scan the completions to see if the cursor position is in
// an option or its argument. Otherwise we'll call HandleArgumentCompletion.
// In the future we can use completion to validate options as well if we want.
@@ -658,6 +661,7 @@
i,
match_start_point,
max_return_elements,
+ word_complete,
matches);
return true;
}
@@ -688,6 +692,7 @@
int opt_element_index,
int match_start_point,
int max_return_elements,
+ bool &word_complete,
lldb_private::StringList &matches
)
{
@@ -754,6 +759,7 @@
match_start_point,
max_return_elements,
filter_ap.get(),
+ word_complete,
matches);
}
More information about the lldb-commits
mailing list