From a207cff2da9f154e4f581b19dcde215593bfccf9 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Wed, 29 Nov 2017 19:33:23 +0000 Subject: 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 * 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. --- gdb/symtab.h | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) (limited to 'gdb/symtab.h') diff --git a/gdb/symtab.h b/gdb/symtab.h index e5aae2a..239a479 100644 --- a/gdb/symtab.h +++ b/gdb/symtab.h @@ -84,7 +84,7 @@ class ada_lookup_name_info final otherwise. If non-NULL, store the matching results in MATCH. */ bool matches (const char *symbol_search_name, symbol_name_match_type match_type, - completion_match *match) const; + completion_match_result *comp_match_res) const; /* The Ada-encoded lookup name. */ const std::string &lookup_name () const @@ -295,15 +295,21 @@ private: SYMBOL_SEARCH_NAME should be a symbol's "search" name. - On success and if non-NULL, MATCH is set to point to the symbol - name as should be presented to the user as a completion match list - element. In most languages, this is the same as the symbol's - search name, but in some, like Ada, the display name is dynamically - computed within the comparison routine. */ + On success and if non-NULL, COMP_MATCH_RES->match is set to point + to the symbol name as should be presented to the user as a + completion match list element. In most languages, this is the same + as the symbol's search name, but in some, like Ada, the display + name is dynamically computed within the comparison routine. + + Also, on success and if non-NULL, COMP_MATCH_RES->match_for_lcd + points the part of SYMBOL_SEARCH_NAME that was considered to match + LOOKUP_NAME. E.g., in C++, in linespec/wild mode, if the symbol is + "foo::function()" and LOOKUP_NAME is "function(", MATCH_FOR_LCD + points to "function()" inside SYMBOL_SEARCH_NAME. */ typedef bool (symbol_name_matcher_ftype) (const char *symbol_search_name, const lookup_name_info &lookup_name, - completion_match *match); + completion_match_result *comp_match_res); /* Some of the structures in this file are space critical. The space-critical structures are: -- cgit v1.1