Re: [PATCH] gdb: search local symbols before global symbols in completion

Andrew Burgess <[email protected]> Mon, 03 Aug 2026 12:03:33 +0100
Newsgroups gmane.comp.gdb.patches
Message-ID <[email protected]>
Oleg Tolmatcev <[email protected]> writes:

> When symbol completion is performed from a selected frame, search the
> local blocks before scanning minimal symbols and global/static symbols.
> This makes completion prefer names that are visible in the current
> context, including local variables.
> ---
>  gdb/symtab.c | 72 ++++++++++++++++++++++++++--------------------------

It feels like this really needs a test in the gdb.dap/ directory.

Thanks,
Andrew


>  1 file changed, 36 insertions(+), 36 deletions(-)
>
> diff --git a/gdb/symtab.c b/gdb/symtab.c
> index 5d5076f2e77..85665bebdf4 100644
> --- a/gdb/symtab.c
> +++ b/gdb/symtab.c
> @@ -5931,6 +5931,42 @@ default_collect_symbol_completion_matches_break_on
>  
>    lookup_name_info lookup_name (sym_text, name_match_type, true);
>  
> +  /* Search upwards from currently selected frame (so that we can
> +     complete on local vars).  Also catch fields of types defined in
> +     this places which match our text string.  Only complete on types
> +     visible from current context.  */
> +
> +  b = get_selected_block ();
> +  surrounding_static_block = b == nullptr ? nullptr : b->static_block ();
> +  surrounding_global_block = b == nullptr ? nullptr : b->global_block ();
> +  if (surrounding_static_block != NULL)
> +    while (b != surrounding_static_block)
> +      {
> +	QUIT;
> +
> +	for (struct symbol *sym : block_iterator_range (b))
> +	  {
> +	    if (code == TYPE_CODE_UNDEF)
> +	      {
> +		completion_list_add_symbol (tracker, sym, lookup_name,
> +					    sym_text, word);
> +		completion_list_add_fields (tracker, sym, lookup_name,
> +					    sym_text, word);
> +	      }
> +	    else if (sym->domain () == STRUCT_DOMAIN
> +		     && sym->type ()->code () == code)
> +	      completion_list_add_symbol (tracker, sym, lookup_name,
> +					  sym_text, word);
> +	  }
> +
> +	/* Stop when we encounter an enclosing function.  Do not stop for
> +	   non-inlined functions - the locals of the enclosing function
> +	   are in scope for a nested function.  */
> +	if (b->function () != NULL && b->inlined_p ())
> +	  break;
> +	b = b->superblock ();
> +      }
> +
>    /* 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
> @@ -5974,42 +6010,6 @@ default_collect_symbol_completion_matches_break_on
>  	 SEARCH_ALL_DOMAINS);
>      }
>  
> -  /* Search upwards from currently selected frame (so that we can
> -     complete on local vars).  Also catch fields of types defined in
> -     this places which match our text string.  Only complete on types
> -     visible from current context.  */
> -
> -  b = get_selected_block ();
> -  surrounding_static_block = b == nullptr ? nullptr : b->static_block ();
> -  surrounding_global_block = b == nullptr ? nullptr : b->global_block ();
> -  if (surrounding_static_block != NULL)
> -    while (b != surrounding_static_block)
> -      {
> -	QUIT;
> -
> -	for (struct symbol *sym : block_iterator_range (b))
> -	  {
> -	    if (code == TYPE_CODE_UNDEF)
> -	      {
> -		completion_list_add_symbol (tracker, sym, lookup_name,
> -					    sym_text, word);
> -		completion_list_add_fields (tracker, sym, lookup_name,
> -					    sym_text, word);
> -	      }
> -	    else if (sym->domain () == STRUCT_DOMAIN
> -		     && sym->type ()->code () == code)
> -	      completion_list_add_symbol (tracker, sym, lookup_name,
> -					  sym_text, word);
> -	  }
> -
> -	/* Stop when we encounter an enclosing function.  Do not stop for
> -	   non-inlined functions - the locals of the enclosing function
> -	   are in scope for a nested function.  */
> -	if (b->function () != NULL && b->inlined_p ())
> -	  break;
> -	b = b->superblock ();
> -      }
> -
>    /* Add fields from the file's types; symbols will be added below.  */
>  
>    if (code == TYPE_CODE_UNDEF)
> -- 
> 2.55.0.windows.1