Enhance the menu to select function overloads with signatures

So far, trying to evaluate an expression involving a function call for
which GDB could find multiple function candidates outputs a menu so that
the user can select the one to run.  For instance, with the two
following functions:

    type New_Integer is new Integer;

    function F (I : Integer) return Boolean;
    function F (I : New_Integer) return Boolean;

Then we get the following GDB session:

    (gdb) print f(1)
    Multiple matches for f
    [0] cancel
    [1] foo.f at foo.adb:23
    [2] foo.f at foo.adb.28
    >

While the source location information is sufficient in order to
determine which one to select, one has to look for them in source files,
which is not convenient.

This commit tunes this menu in order to also include the list of formal
and return types (if any) in each entry.  The above then becomes:

    (gdb) print f(1)
    Multiple matches for f
    [0] cancel
    [1] foo.f (integer) return boolean at foo.adb:23
    [2] foo.f (foo.new_integer) return boolean at foo.adb.28
    >

Since this output is more verbose than previously, this change also
introduces an option (set/show ada print-signatures) to get the original
output.

gdb/ChangeLog:

	* ada-lang.c (print_signatures): New.
	(ada_print_symbol_signature): New.
	(user_select_syms): Add signatures to the output of candidate
	symbols using ada_print_symbol_signature.
	(_initialize_ada_language): Add a "set/show ada
	print-signatures" boolean option.

gdb/testsuite/ChangeLog:

	* gdb.ada/fun_overload_menu.exp: New testcase.
	* gdb.ada/fun_overload_menu/foo.adb: New testcase.

Tested on x86_64-linux, no regression.
This commit is contained in:
Pierre-Marie de Rodat
2015-09-03 17:34:58 +02:00
parent 1b36b65787
commit d72413e64a
5 changed files with 212 additions and 23 deletions

View File

@ -3822,6 +3822,49 @@ sort_choices (struct block_symbol syms[], int nsyms)
}
}
/* Whether GDB should display formals and return types for functions in the
overloads selection menu. */
static int print_signatures = 1;
/* Print the signature for SYM on STREAM according to the FLAGS options. For
all but functions, the signature is just the name of the symbol. For
functions, this is the name of the function, the list of types for formals
and the return type (if any). */
static void
ada_print_symbol_signature (struct ui_file *stream, struct symbol *sym,
const struct type_print_options *flags)
{
struct type *type = SYMBOL_TYPE (sym);
fprintf_filtered (stream, "%s", SYMBOL_PRINT_NAME (sym));
if (!print_signatures
|| type == NULL
|| TYPE_CODE (type) != TYPE_CODE_FUNC)
return;
if (TYPE_NFIELDS (type) > 0)
{
int i;
fprintf_filtered (stream, " (");
for (i = 0; i < TYPE_NFIELDS (type); ++i)
{
if (i > 0)
fprintf_filtered (stream, "; ");
ada_print_type (TYPE_FIELD_TYPE (type, i), NULL, stream, -1, 0,
flags);
}
fprintf_filtered (stream, ")");
}
if (TYPE_TARGET_TYPE (type) != NULL
&& TYPE_CODE (TYPE_TARGET_TYPE (type)) != TYPE_CODE_VOID)
{
fprintf_filtered (stream, " return ");
ada_print_type (TYPE_TARGET_TYPE (type), NULL, stream, -1, 0, flags);
}
}
/* Given a list of NSYMS symbols in SYMS, select up to MAX_RESULTS>0
by asking the user (if necessary), returning the number selected,
and setting the first elements of SYMS items. Error if no symbols
@ -3871,14 +3914,14 @@ See set/show multiple-symbol."));
struct symtab_and_line sal =
find_function_start_sal (syms[i].symbol, 1);
printf_unfiltered ("[%d] ", i + first_choice);
ada_print_symbol_signature (gdb_stdout, syms[i].symbol,
&type_print_raw_options);
if (sal.symtab == NULL)
printf_unfiltered (_("[%d] %s at <no source file available>:%d\n"),
i + first_choice,
SYMBOL_PRINT_NAME (syms[i].symbol),
printf_unfiltered (_(" at <no source file available>:%d\n"),
sal.line);
else
printf_unfiltered (_("[%d] %s at %s:%d\n"), i + first_choice,
SYMBOL_PRINT_NAME (syms[i].symbol),
printf_unfiltered (_(" at %s:%d\n"),
symtab_to_filename_for_display (sal.symtab),
sal.line);
continue;
@ -3895,11 +3938,14 @@ See set/show multiple-symbol."));
symtab = symbol_symtab (syms[i].symbol);
if (SYMBOL_LINE (syms[i].symbol) != 0 && symtab != NULL)
printf_unfiltered (_("[%d] %s at %s:%d\n"),
i + first_choice,
SYMBOL_PRINT_NAME (syms[i].symbol),
symtab_to_filename_for_display (symtab),
SYMBOL_LINE (syms[i].symbol));
{
printf_unfiltered ("[%d] ", i + first_choice);
ada_print_symbol_signature (gdb_stdout, syms[i].symbol,
&type_print_raw_options);
printf_unfiltered (_(" at %s:%d\n"),
symtab_to_filename_for_display (symtab),
SYMBOL_LINE (syms[i].symbol));
}
else if (is_enumeral
&& TYPE_NAME (SYMBOL_TYPE (syms[i].symbol)) != NULL)
{
@ -3909,19 +3955,22 @@ See set/show multiple-symbol."));
printf_unfiltered (_("'(%s) (enumeral)\n"),
SYMBOL_PRINT_NAME (syms[i].symbol));
}
else if (symtab != NULL)
printf_unfiltered (is_enumeral
? _("[%d] %s in %s (enumeral)\n")
: _("[%d] %s at %s:?\n"),
i + first_choice,
SYMBOL_PRINT_NAME (syms[i].symbol),
symtab_to_filename_for_display (symtab));
else
printf_unfiltered (is_enumeral
? _("[%d] %s (enumeral)\n")
: _("[%d] %s at ?\n"),
i + first_choice,
SYMBOL_PRINT_NAME (syms[i].symbol));
else
{
printf_unfiltered ("[%d] ", i + first_choice);
ada_print_symbol_signature (gdb_stdout, syms[i].symbol,
&type_print_raw_options);
if (symtab != NULL)
printf_unfiltered (is_enumeral
? _(" in %s (enumeral)\n")
: _(" at %s:?\n"),
symtab_to_filename_for_display (symtab));
else
printf_unfiltered (is_enumeral
? _(" (enumeral)\n")
: _(" at ?\n"));
}
}
}
@ -14136,6 +14185,14 @@ this incurs a slight performance penalty, so it is recommended to NOT change\n\
this option to \"off\" unless necessary."),
NULL, NULL, &set_ada_list, &show_ada_list);
add_setshow_boolean_cmd ("print-signatures", class_vars,
&print_signatures, _("\
Enable or disable the output of formal and return types for functions in the \
overloads selection menu"), _("\
Show whether the output of formal and return types for functions in the \
overloads selection menu is activated"),
NULL, NULL, NULL, &set_ada_list, &show_ada_list);
add_catch_command ("exception", _("\
Catch Ada exceptions, when raised.\n\
With an argument, catch only exceptions with the given name."),