[15/28] Convert ada_language_defn::collect_symbol_completion_matches

Message ID 20250311-search-in-psyms-v1-15-d73d9be20983@tromey.com
State New
Headers
Series Search symbols via quick API |

Checks

Context Check Description
linaro-tcwg-bot/tcwg_gdb_build--master-aarch64 fail Patch failed to apply
linaro-tcwg-bot/tcwg_gdb_build--master-arm fail Patch failed to apply

Commit Message

Tom Tromey March 11, 2025, 2:12 p.m. UTC
  This converts ada_language_defn::collect_symbol_completion_matches to
the callback approach, merging the search loop and the call to
expand_symtabs_matching.

Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16994
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=16998
---
 gdb/ada-lang.c | 67 +++++++++++++++++++++++-----------------------------------
 1 file changed, 27 insertions(+), 40 deletions(-)
  

Patch

diff --git a/gdb/ada-lang.c b/gdb/ada-lang.c
index 0a20bfb8c68666326b92a6b9298df09dedcf845c..3dc48125dee8aa424bc787a89323264d75837926 100644
--- a/gdb/ada-lang.c
+++ b/gdb/ada-lang.c
@@ -13652,20 +13652,12 @@  class ada_language : public language_defn
 					  const char *text, const char *word,
 					  enum type_code code) const override
   {
-    const struct block *b, *surrounding_static_block = 0;
+    const struct block *surrounding_static_block = 0;
 
     gdb_assert (code == TYPE_CODE_UNDEF);
 
     lookup_name_info lookup_name (text, name_match_type, true);
 
-    /* First, look at the partial symtab symbols.  */
-    expand_symtabs_matching (NULL,
-			     lookup_name,
-			     NULL,
-			     NULL,
-			     SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
-			     SEARCH_ALL_DOMAINS);
-
     /* At this point scan through the misc symbol vectors and add each
        symbol you find to the list.  Eventually we want to ignore
        anything that isn't a text symbol (everything else will be
@@ -13707,7 +13699,9 @@  class ada_language : public language_defn
     /* Search upwards from currently selected frame (so that we can
        complete on local vars.  */
 
-    for (b = get_selected_block (0); b != NULL; b = b->superblock ())
+    for (const block *b = get_selected_block (0);
+	 b != nullptr;
+	 b = b->superblock ())
       {
 	if (b->is_static_block ())
 	  surrounding_static_block = b;   /* For elmin of dups */
@@ -13729,43 +13723,36 @@  class ada_language : public language_defn
 
     for (objfile *objfile : current_program_space->objfiles ())
       {
-	for (compunit_symtab *s : objfile->compunits ())
+	auto callback = [&] (compunit_symtab *s)
 	  {
 	    QUIT;
-	    b = s->blockvector ()->global_block ();
-	    for (struct symbol *sym : block_iterator_range (b))
+	    for (const block *b = s->blockvector ()->static_block ();
+		 b != nullptr;
+		 b = b->superblock ())
 	      {
-		if (completion_skip_symbol (mode, sym))
-		  continue;
+		/* Don't do this block twice.  */
+		if (b == surrounding_static_block)
+		  break;
+
+		for (struct symbol *sym : block_iterator_range (b))
+		  {
+		    if (completion_skip_symbol (mode, sym))
+		      continue;
 
-		completion_list_add_name (tracker,
-					  sym->language (),
-					  sym->linkage_name (),
-					  lookup_name, text, word);
+		    completion_list_add_name (tracker,
+					      sym->language (),
+					      sym->linkage_name (),
+					      lookup_name, text, word);
+		  }
 	      }
-	  }
-      }
 
-    for (objfile *objfile : current_program_space->objfiles ())
-      {
-	for (compunit_symtab *s : objfile->compunits ())
-	  {
-	    QUIT;
-	    b = s->blockvector ()->static_block ();
-	    /* Don't do this block twice.  */
-	    if (b == surrounding_static_block)
-	      continue;
-	    for (struct symbol *sym : block_iterator_range (b))
-	      {
-		if (completion_skip_symbol (mode, sym))
-		  continue;
+	    return true;
+	  };
 
-		completion_list_add_name (tracker,
-					  sym->language (),
-					  sym->linkage_name (),
-					  lookup_name, text, word);
-	      }
-	  }
+	objfile->expand_symtabs_matching
+	  (nullptr, &lookup_name, nullptr, callback,
+	   SEARCH_GLOBAL_BLOCK | SEARCH_STATIC_BLOCK,
+	   SEARCH_ALL_DOMAINS);
       }
   }