gdb: add selftest name completion
authorSimon Marchi <simon.marchi@polymtl.ca>
Thu, 23 Sep 2021 13:56:51 +0000 (09:56 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Thu, 28 Oct 2021 15:17:45 +0000 (11:17 -0400)
After the previous commit, it is easy to add completion for selftest
names.  Again, this is not particularly high value, but I rarely touched
completion, so it served as a simple example to get some practice.

Change the for_each_selftest_ftype parameter to gdb::function_view, so
that we can pass a lambda that captures things.

Change-Id: I87cac299ddca9ca7eb0ffab78342e850a98d954c

gdb/maint.c
gdb/testsuite/gdb.gdb/unittest.exp
gdbsupport/selftest.h

index 4e75e47c6a75a3d7fc1efba8364de7163c1ca76d..85fa18c34a07a899fe7f88e99bd524cf2d249e4d 100644 (file)
@@ -1176,8 +1176,15 @@ maintenance_selftest_completer (cmd_list_element *cmd,
 {
   auto grp = make_maintenance_selftest_option_group (nullptr);
 
-  gdb::option::complete_options
-    (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp);
+  if (gdb::option::complete_options
+       (tracker, &text, gdb::option::PROCESS_OPTIONS_UNKNOWN_IS_ERROR, grp))
+    return;
+
+  selftests::for_each_selftest ([&tracker, text] (const std::string &name)
+    {
+      if (startswith (name.c_str (), text))
+       tracker.add_completion (make_unique_xstrdup (name.c_str ()));
+    });
 }
 
 static void
index 670205fff769c26bce6bc062b76af5118a25c108..0ddd20683773376b0c4d628764594b22f2f31e44 100644 (file)
@@ -20,6 +20,8 @@ if [gdb_debug_enabled] {
     return 0
 }
 
+load_lib completion-support.exp
+
 set do_xml_test [expr ![gdb_skip_xml_test]]
 
 standard_testfile
@@ -59,6 +61,17 @@ proc run_selftests { binfile } {
     }
 }
 
+# Test completion of command "maintenance selftest".
+
+proc_with_prefix test_completion {} {
+    clean_restart
+    test_gdb_complete_tab_multiple "maintenance selftest string_v" "" \
+       {string_vappendf string_view string_vprintf}
+    test_gdb_complete_tab_unique "maintenance selftest string_vie" "maintenance selftest string_view" " "
+    test_gdb_complete_tab_unique "maintenance selftest -ver" "maintenance selftest -verbose" " "
+    test_gdb_complete_tab_none "maintenance selftest name_that_does_not_exist"
+}
+
 with_test_prefix "no executable loaded" {
     run_selftests ""
 }
@@ -67,6 +80,8 @@ with_test_prefix "executable loaded" {
     run_selftests ${binfile}
 }
 
+test_completion
+
 if { ![is_remote host] && $do_xml_test } {
     gdb_test "maintenance check xml-descriptions ${srcdir}/../features" \
        "Tested $decimal XML files, 0 failed" \
index 2326ebad495eb932161fc580e1056d666fb06b9e..7275126d2a9ff5bd72fbcb97886f15766391d30b 100644 (file)
@@ -20,6 +20,7 @@
 #define COMMON_SELFTEST_H
 
 #include "gdbsupport/array-view.h"
+#include "gdbsupport/function-view.h"
 
 /* A test is just a function that does some checks and throws an
    exception if something has gone wrong.  */
@@ -48,7 +49,8 @@ extern void run_tests (gdb::array_view<const char *const> filters,
 /* Reset GDB or GDBserver's internal state.  */
 extern void reset ();
 
-typedef void for_each_selftest_ftype (const std::string &name);
+using for_each_selftest_ftype
+  = gdb::function_view<void(const std::string &name)>;
 
 /* Call FUNC for each registered selftest.  */