diff options
author | Bernhard Reutner-Fischer <aldot@gcc.gnu.org> | 2017-10-19 09:24:33 +0200 |
---|---|---|
committer | Bernhard Reutner-Fischer <aldot@gcc.gnu.org> | 2017-10-19 09:24:33 +0200 |
commit | bcc478b9647e2af4b715fda6676d98f1e129d16b (patch) | |
tree | 78eb982a4151306d46381aacdf1b5298544bdac2 /gcc/fortran/misc.c | |
parent | fba832054d9467a296d126754cc3a5efca707bdf (diff) | |
download | gcc-bcc478b9647e2af4b715fda6676d98f1e129d16b.zip gcc-bcc478b9647e2af4b715fda6676d98f1e129d16b.tar.gz gcc-bcc478b9647e2af4b715fda6676d98f1e129d16b.tar.bz2 |
Use Levenshtein spelling suggestions in Fortran FE
gcc/fortran/ChangeLog
2017-10-19 Bernhard Reutner-Fischer <aldot@gcc.gnu.org>
* gfortran.h (gfc_lookup_function_fuzzy): New declaration.
(gfc_closest_fuzzy_match): New declaration.
(vec_push): New definition.
* misc.c (gfc_closest_fuzzy_match): New definition.
* resolve.c: Include spellcheck.h.
(lookup_function_fuzzy_find_candidates): New static function.
(lookup_uop_fuzzy_find_candidates): Likewise.
(lookup_uop_fuzzy): Likewise.
(resolve_operator) <INTRINSIC_USER>: Call lookup_uop_fuzzy.
(gfc_lookup_function_fuzzy): New definition.
(resolve_unknown_f): Call gfc_lookup_function_fuzzy.
* interface.c (check_interface0): Likewise.
(lookup_arg_fuzzy_find_candidates): New static function.
(lookup_arg_fuzzy ): Likewise.
(compare_actual_formal): Call lookup_arg_fuzzy.
* symbol.c: Include spellcheck.h.
(lookup_symbol_fuzzy_find_candidates): New static function.
(lookup_symbol_fuzzy): Likewise.
(gfc_set_default_type): Call lookup_symbol_fuzzy.
(lookup_component_fuzzy_find_candidates): New static function.
(lookup_component_fuzzy): Likewise.
(gfc_find_component): Call lookup_component_fuzzy.
gcc/testsuite/ChangeLog
2017-10-19 Bernhard Reutner-Fischer <aldot@gcc.gnu.org>
* gfortran.dg/spellcheck-operator.f90: New testcase.
* gfortran.dg/spellcheck-procedure_1.f90: New testcase.
* gfortran.dg/spellcheck-procedure_2.f90: New testcase.
* gfortran.dg/spellcheck-structure.f90: New testcase.
* gfortran.dg/spellcheck-parameter.f90: New testcase.
From-SVN: r253877
Diffstat (limited to 'gcc/fortran/misc.c')
-rw-r--r-- | gcc/fortran/misc.c | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/gcc/fortran/misc.c b/gcc/fortran/misc.c index a2c199e..f47d111 100644 --- a/gcc/fortran/misc.c +++ b/gcc/fortran/misc.c @@ -22,6 +22,7 @@ along with GCC; see the file COPYING3. If not see #include "system.h" #include "coretypes.h" #include "gfortran.h" +#include "spellcheck.h" /* Initialize a typespec to unknown. */ @@ -280,3 +281,43 @@ get_c_kind(const char *c_kind_name, CInteropKind_t kinds_table[]) return ISOCBINDING_INVALID; } + + +/* For a given name TYPO, determine the best candidate from CANDIDATES + perusing Levenshtein distance. Frees CANDIDATES before returning. */ + +const char * +gfc_closest_fuzzy_match (const char *typo, char **candidates) +{ + /* Determine closest match. */ + const char *best = NULL; + char **cand = candidates; + edit_distance_t best_distance = MAX_EDIT_DISTANCE; + const size_t tl = strlen (typo); + + while (cand && *cand) + { + edit_distance_t dist = levenshtein_distance (typo, tl, *cand, + strlen (*cand)); + if (dist < best_distance) + { + best_distance = dist; + best = *cand; + } + cand++; + } + /* If more than half of the letters were misspelled, the suggestion is + likely to be meaningless. */ + if (best) + { + unsigned int cutoff = MAX (tl, strlen (best)) / 2; + + if (best_distance > cutoff) + { + XDELETEVEC (candidates); + return NULL; + } + XDELETEVEC (candidates); + } + return best; +} |