blob: 85127fd87c2cd2e24b47a2d33569a1c8d51a7ce5 [file] [log] [blame]
//===-- CommandCompletions.h ------------------------------------*- C++ -*-===//
//
// The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
#ifndef lldb_CommandCompletions_h_
#define lldb_CommandCompletions_h_
// C Includes
// C++ Includes
// Other libraries and framework includes
// Project includes
#include "lldb/lldb-private.h"
#include "lldb/Core/SearchFilter.h"
#include "lldb/Core/FileSpecList.h"
#include "lldb/Core/RegularExpression.h"
namespace lldb_private
{
class CommandCompletions
{
public:
//----------------------------------------------------------------------
// This is the command completion callback that is used to complete the argument of the option
// it is bound to (in the OptionDefinition table below). Return the total number of matches.
//----------------------------------------------------------------------
typedef int (*CompletionCallback) (CommandInterpreter &interpreter,
const char *completion_str, // This is the argument we are completing
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 = 0u,
eSourceFileCompletion = (1u << 0),
eDiskFileCompletion = (1u << 1),
eDiskDirectoryCompletion = (1u << 2),
eSymbolCompletion = (1u << 3),
eModuleCompletion = (1u << 4),
eSettingsNameCompletion = (1u << 5),
ePlatformPluginCompletion = (1u << 6),
eArchitectureCompletion = (1u << 7),
// 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.
eCustomCompletion = (1u << 8)
} CommonCompletionTypes;
struct CommonCompletionElement
{
uint32_t type;
CompletionCallback callback;
};
static bool InvokeCommonCompletionCallbacks (CommandInterpreter &interpreter,
uint32_t completion_mask,
const char *completion_str,
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
Modules (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
bool &word_complete,
lldb_private::StringList &matches);
static int
Symbols (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
bool &word_complete,
lldb_private::StringList &matches);
static int
SettingsNames (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
bool &word_complete,
lldb_private::StringList &matches);
static int
PlatformPluginNames (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
bool &word_complete,
lldb_private::StringList &matches);
static int
ArchitectureNames (CommandInterpreter &interpreter,
const char *partial_file_name,
int match_start_point,
int max_return_elements,
SearchFilter *searcher,
bool &word_complete,
lldb_private::StringList &matches);
//----------------------------------------------------------------------
// The Completer class is a convenient base class for building searchers
// that go along with the SearchFilter passed to the standard Completer
// functions.
//----------------------------------------------------------------------
class Completer : public Searcher
{
public:
Completer (CommandInterpreter &interpreter,
const char *completion_str,
int match_start_point,
int max_return_elements,
StringList &matches);
virtual ~Completer ();
virtual CallbackReturn
SearchCallback (SearchFilter &filter,
SymbolContext &context,
Address *addr,
bool complete) = 0;
virtual Depth
GetDepth () = 0;
virtual size_t
DoCompletion (SearchFilter *filter) = 0;
protected:
CommandInterpreter &m_interpreter;
std::string m_completion_str;
int m_match_start_point;
int m_max_return_elements;
StringList &m_matches;
private:
DISALLOW_COPY_AND_ASSIGN (Completer);
};
//----------------------------------------------------------------------
// SouceFileCompleter implements the source file completer
//----------------------------------------------------------------------
class SourceFileCompleter : public Completer
{
public:
SourceFileCompleter (CommandInterpreter &interpreter,
bool include_support_files,
const char *completion_str,
int match_start_point,
int max_return_elements,
StringList &matches);
virtual Searcher::Depth GetDepth ();
virtual Searcher::CallbackReturn
SearchCallback (SearchFilter &filter,
SymbolContext &context,
Address *addr,
bool complete);
size_t
DoCompletion (SearchFilter *filter);
private:
bool m_include_support_files;
FileSpecList m_matching_files;
const char *m_file_name;
const char *m_dir_name;
DISALLOW_COPY_AND_ASSIGN (SourceFileCompleter);
};
//----------------------------------------------------------------------
// ModuleCompleter implements the module completer
//----------------------------------------------------------------------
class ModuleCompleter : public Completer
{
public:
ModuleCompleter (CommandInterpreter &interpreter,
const char *completion_str,
int match_start_point,
int max_return_elements,
StringList &matches);
virtual Searcher::Depth GetDepth ();
virtual Searcher::CallbackReturn
SearchCallback (SearchFilter &filter,
SymbolContext &context,
Address *addr,
bool complete);
size_t
DoCompletion (SearchFilter *filter);
private:
const char *m_file_name;
const char *m_dir_name;
DISALLOW_COPY_AND_ASSIGN (ModuleCompleter);
};
//----------------------------------------------------------------------
// SymbolCompleter implements the symbol completer
//----------------------------------------------------------------------
class SymbolCompleter : public Completer
{
public:
SymbolCompleter (CommandInterpreter &interpreter,
const char *completion_str,
int match_start_point,
int max_return_elements,
StringList &matches);
virtual Searcher::Depth GetDepth ();
virtual Searcher::CallbackReturn
SearchCallback (SearchFilter &filter,
SymbolContext &context,
Address *addr,
bool complete);
size_t
DoCompletion (SearchFilter *filter);
private:
// struct NameCmp {
// bool operator() (const ConstString& lhs, const ConstString& rhs) const
// {
// return lhs < rhs;
// }
// };
RegularExpression m_regex;
typedef std::set<ConstString> collection;
collection m_match_set;
DISALLOW_COPY_AND_ASSIGN (SymbolCompleter);
};
private:
static CommonCompletionElement g_common_completions[];
};
} // namespace lldb_private
#endif // lldb_CommandCompletions_h_