diff options
author | Pedro Alves <palves@redhat.com> | 2017-11-29 19:33:23 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2017-11-29 19:33:23 +0000 |
commit | a207cff2da9f154e4f581b19dcde215593bfccf9 (patch) | |
tree | a05eafa2c9349fb663f150aff45680aae9aa7cf0 /gdb/cp-support.c | |
parent | 4024cf2b8d864279ff87af1a2ade77ab6d710d50 (diff) | |
download | binutils-gdb-a207cff2da9f154e4f581b19dcde215593bfccf9.tar.gz |
Handle custom completion match prefix / LCD
A following patch will add support for wild matching for C++ symbols,
making completing on "b push_ba" on a C++ program complete to
std::vector<...>::push_back, std::string::push_back etc., like:
(gdb) b push_ba[TAB]
std::vector<...>::push_back(....)
std::string<...>::push_back(....)
Currently, we compute the "lowest common denominator" between all
completion candidates (what the input line is adjusted to) as the
common prefix of all matches. That's problematic with wild matching
as above, as then we'd end up with TAB changing the input line to
"b std::", losing the original input, like:
(gdb) b push_ba[TAB]
std::vector<...>::push_back(....)
std::string<...>::push_back(....)
(gdb) b std::
while obviously we'd want it to adjust itself to "b push_back(" instead:
(gdb) b push_ba[TAB]
std::vector<...>::push_back(....)
std::string<...>::push_back(....)
(gdb) b push_back(
This patch adds the core code necessary to support this, though
nothing really makes use of it yet in this patch.
gdb/ChangeLog:
2017-11-29 Pedro Alves <palves@redhat.com>
* ada-lang.c (ada_lookup_name_info::matches): Change type of
parameter from completion_match to completion_match_result.
Adjust.
(do_wild_match, do_full_match, ada_symbol_name_matches): Likewise.
* completer.c (completion_tracker::maybe_add_completion): Add
match_for_lcd parameter and use it.
(completion_tracker::add_completion): Likewise.
* completer.h (class completion_match_for_lcd): New class.
(completion_match_result::match_for_lcd): New field.
(completion_match_result::set_match): New method.
(completion_tracker): Add comments.
(completion_tracker::add_completion): Add match_for_lcd parameter.
(completion_tracker::reset_completion_match_result): Reset
match_for_lcd too.
(completion_tracker::maybe_add_completion): Add match_for_lcd
parameter.
(completion_tracker::m_lowest_common_denominator_unique): Extend
comments.
* cp-support.c (cp_symbol_name_matches_1)
(cp_fq_symbol_name_matches): Change type of parameter from
completion_match to completion_match_result. Adjust.
* language.c (default_symbol_name_matcher): Change type of
parameter from completion_match to completion_match_result.
Adjust.
* language.h (completion_match_for_lcd): Forward declare.
(default_symbol_name_matcher): Change type of parameter from
completion_match to completion_match_result.
* symtab.c (compare_symbol_name): Adjust.
(completion_list_add_name): Pass the match_for_lcd to the tracker.
* symtab.h (ada_lookup_name_info::matches): Change type of
parameter from completion_match to completion_match_result.
(symbol_name_matcher_ftype): Likewise, and update comments.
Diffstat (limited to 'gdb/cp-support.c')
-rw-r--r-- | gdb/cp-support.c | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 368112a5294..6c6825be90a 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -1634,14 +1634,14 @@ cp_symbol_name_matches_1 (const char *symbol_search_name, const char *lookup_name, size_t lookup_name_len, strncmp_iw_mode mode, - completion_match *match) + completion_match_result *comp_match_res) { if (strncmp_iw_with_mode (symbol_search_name, lookup_name, lookup_name_len, mode, language_cplus) == 0) { - if (match != NULL) - match->set_match (symbol_search_name); + if (comp_match_res != NULL) + comp_match_res->set_match (symbol_search_name); return true; } @@ -1653,7 +1653,7 @@ cp_symbol_name_matches_1 (const char *symbol_search_name, static bool cp_fq_symbol_name_matches (const char *symbol_search_name, const lookup_name_info &lookup_name, - completion_match *match) + completion_match_result *comp_match_res) { /* Get the demangled name. */ const std::string &name = lookup_name.cplus ().lookup_name (); @@ -1664,7 +1664,7 @@ cp_fq_symbol_name_matches (const char *symbol_search_name, return cp_symbol_name_matches_1 (symbol_search_name, name.c_str (), name.size (), - mode, match); + mode, comp_match_res); } /* See cp-support.h. */ |