[PATCH] Prefer simple case changes in spelling suggestions

David Malcolm dmalcolm@redhat.com
Sat May 30 17:03:57 GMT 2020


On Fri, 2020-05-29 at 10:54 -0600, Tom Tromey wrote:
> I got this error message when editing gcc and recompiling:
> 
> ../../gcc/gcc/ada/gcc-interface/decl.c:7714:39: error:
> ‘DWARF_GNAT_ENCODINGS_all’ was not declared in this scope; did you
> mean ‘DWARF_GNAT_ENCODINGS_GDB’?
>  7714 |     = debug_info && gnat_encodings ==
> DWARF_GNAT_ENCODINGS_all;
>       |                                       ^~~~~~~~~~~~~~~~~~~~~~~
> ~
>       |                                       DWARF_GNAT_ENCODINGS_GD
> B
> 
> This suggestion could be improved -- what happened here is that I
> failed to upper-case the word, and DWARF_GNAT_ENCODINGS_ALL was the
> correct spelling.
> 
> This patch changes gcc's spell checker to prefer simple case changes
> when possible.

Thanks.  I like the overall idea.

> I tested this using the self-tests.  A new self-test is also
> included.

Did the full DejaGnu testsuite get run?  There are a lot of tests in it
that make use of this code.

> gcc/ChangeLog:
> 
> 	* spellcheck.c (CASE_COST): New define.
> 	(BASE_COST): New define.
> 	(get_edit_distance): Recognize case changes.
> 	(get_edit_distance_cutoff): Update.
> 	(test_edit_distances): Update.
> 	(get_old_cutoff): Update.
> 	(test_find_closest_string): Add case sensitivity test.
> ---
>  gcc/spellcheck.c | 114 ++++++++++++++++++++++++++++++---------------
> --
>  1 file changed, 74 insertions(+), 40 deletions(-)

> diff --git a/gcc/spellcheck.c b/gcc/spellcheck.c
> index 7891260a258..9002617453f 100644
> --- a/gcc/spellcheck.c
> +++ b/gcc/spellcheck.c

[...snip...]

The patch should probably update the leading comment to
get_edit_distance.

> @@ -228,47 +241,50 @@ test_get_edit_distance_both_ways (const char
> *a, const char *b,
>  static void
>  test_edit_distances ()
>  {
> -  test_get_edit_distance_both_ways ("", "nonempty", strlen
> ("nonempty"));
> -  test_get_edit_distance_both_ways ("saturday", "sunday", 3);
> -  test_get_edit_distance_both_ways ("foo", "m_foo", 2);
> -  test_get_edit_distance_both_ways ("hello_world", "HelloWorld", 3);
> +  test_get_edit_distance_both_ways ("", "nonempty",
> +				    BASE_COST * strlen ("nonempty"));
> +  test_get_edit_distance_both_ways ("saturday", "sunday",
> +				    BASE_COST * 3);
> +  test_get_edit_distance_both_ways ("foo", "m_foo", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("hello_world", "HelloWorld", 4);
>    test_get_edit_distance_both_ways
> -    ("the quick brown fox jumps over the lazy dog", "dog", 40);
> +    ("the quick brown fox jumps over the lazy dog", "dog", BASE_COST
> * 40);
>    test_get_edit_distance_both_ways
>      ("the quick brown fox jumps over the lazy dog",
>       "the quick brown dog jumps over the lazy fox",
> -     4);
> +     BASE_COST * 4);
>    test_get_edit_distance_both_ways
>      ("Lorem ipsum dolor sit amet, consectetur adipiscing elit,",
>       "All your base are belong to us",
> -     44);
> +     BASE_COST * 44);
>    test_get_edit_distance_both_ways ("foo", "FOO", 3);
> -  test_get_edit_distance_both_ways ("fee", "deed", 2);
> -  test_get_edit_distance_both_ways ("coorzd1", "coordx1", 2);
> -  test_get_edit_distance_both_ways ("assert", "sqrt", 3);
> -  test_get_edit_distance_both_ways ("PATH_MAX", "INT8_MAX", 3);
> -  test_get_edit_distance_both_ways ("time", "nice", 2);
> -  test_get_edit_distance_both_ways ("bar", "carg", 2);
> +  test_get_edit_distance_both_ways ("fee", "deed", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("coorzd1", "coordx1", BASE_COST
> * 2);
> +  test_get_edit_distance_both_ways ("assert", "sqrt", BASE_COST *
> 3);
> +  test_get_edit_distance_both_ways ("PATH_MAX", "INT8_MAX",
> BASE_COST * 3);
> +  test_get_edit_distance_both_ways ("time", "nice", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("bar", "carg", BASE_COST * 2);
>    test_get_edit_distance_both_ways ("gtk_widget_show_all",
> -				    "GtkWidgetShowAll", 7);
> -  test_get_edit_distance_both_ways ("m_bar", "bar", 2);
> -  test_get_edit_distance_both_ways ("MACRO", "MACRAME", 3);
> -  test_get_edit_distance_both_ways ("ab", "ac", 1);
> -  test_get_edit_distance_both_ways ("ab", "a", 1);
> -  test_get_edit_distance_both_ways ("a", "b", 1);
> -  test_get_edit_distance_both_ways ("nanl", "name", 2);
> -  test_get_edit_distance_both_ways ("char", "bar", 2);
> -  test_get_edit_distance_both_ways ("-optimize", "fsanitize", 5);
> -  test_get_edit_distance_both_ways ("__DATE__", "__i386__", 4);
> +				    "GtkWidgetShowAll", 10);
> +  test_get_edit_distance_both_ways ("m_bar", "bar", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("MACRO", "MACRAME", BASE_COST *
> 3);
> +  test_get_edit_distance_both_ways ("ab", "ac", BASE_COST * 1);
> +  test_get_edit_distance_both_ways ("ab", "a", BASE_COST * 1);
> +  test_get_edit_distance_both_ways ("a", "b", BASE_COST * 1);
> +  test_get_edit_distance_both_ways ("nanl", "name", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("char", "bar", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("-optimize", "fsanitize",
> BASE_COST * 5);
> +  test_get_edit_distance_both_ways ("__DATE__", "__i386__",
> BASE_COST * 4);
>  
>    /* Examples where transposition helps.  */
> -  test_get_edit_distance_both_ways ("ab", "ba", 1);
> -  test_get_edit_distance_both_ways ("ba", "abc", 2);
> -  test_get_edit_distance_both_ways ("coorzd1", "coordz1", 1);
> +  test_get_edit_distance_both_ways ("ab", "ba", BASE_COST * 1);
> +  test_get_edit_distance_both_ways ("ba", "abc", BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("coorzd1", "coordz1", BASE_COST
> * 1);
>    test_get_edit_distance_both_ways ("abcdefghijklmnopqrstuvwxyz",
> -				    "bacdefghijklmnopqrstuvwxzy", 2);
> -  test_get_edit_distance_both_ways ("saturday", "sundya", 4);
> -  test_get_edit_distance_both_ways ("signed", "singed", 1);
> +				    "bacdefghijklmnopqrstuvwxzy",
> +				    BASE_COST * 2);
> +  test_get_edit_distance_both_ways ("saturday", "sundya", BASE_COST
> * 4);
> +  test_get_edit_distance_both_ways ("signed", "singed", BASE_COST *
> 1);

If I'm reading things correctly, the patch here updates the existing
tests to apply the BASE_COST scale factor, but I don't think it adds
any direct checks of the cost of case-conversion.  It would be good to
add those.

[...snip...]

Dave



More information about the Gcc-patches mailing list