annotate gcc/spellcheck-tree.c @ 120:f93fa5091070

fix conv1.c
author mir3636
date Thu, 08 Mar 2018 14:53:42 +0900
parents 04ced10e8804
children 84e7813d76e9
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Find near-matches for identifiers.
kono
parents:
diff changeset
2 Copyright (C) 2015-2017 Free Software Foundation, Inc.
kono
parents:
diff changeset
3
kono
parents:
diff changeset
4 This file is part of GCC.
kono
parents:
diff changeset
5
kono
parents:
diff changeset
6 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
7 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
8 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
9 version.
kono
parents:
diff changeset
10
kono
parents:
diff changeset
11 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
12 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
13 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
14 for more details.
kono
parents:
diff changeset
15
kono
parents:
diff changeset
16 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
17 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
18 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
19
kono
parents:
diff changeset
20 #include "config.h"
kono
parents:
diff changeset
21 #include "system.h"
kono
parents:
diff changeset
22 #include "coretypes.h"
kono
parents:
diff changeset
23 #include "tm.h"
kono
parents:
diff changeset
24 #include "tree.h"
kono
parents:
diff changeset
25 #include "cpplib.h"
kono
parents:
diff changeset
26 #include "spellcheck-tree.h"
kono
parents:
diff changeset
27 #include "selftest.h"
kono
parents:
diff changeset
28 #include "stringpool.h"
kono
parents:
diff changeset
29
kono
parents:
diff changeset
30 /* Calculate Levenshtein distance between two identifiers. */
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 edit_distance_t
kono
parents:
diff changeset
33 levenshtein_distance (tree ident_s, tree ident_t)
kono
parents:
diff changeset
34 {
kono
parents:
diff changeset
35 gcc_assert (TREE_CODE (ident_s) == IDENTIFIER_NODE);
kono
parents:
diff changeset
36 gcc_assert (TREE_CODE (ident_t) == IDENTIFIER_NODE);
kono
parents:
diff changeset
37
kono
parents:
diff changeset
38 return levenshtein_distance (IDENTIFIER_POINTER (ident_s),
kono
parents:
diff changeset
39 IDENTIFIER_LENGTH (ident_s),
kono
parents:
diff changeset
40 IDENTIFIER_POINTER (ident_t),
kono
parents:
diff changeset
41 IDENTIFIER_LENGTH (ident_t));
kono
parents:
diff changeset
42 }
kono
parents:
diff changeset
43
kono
parents:
diff changeset
44 /* Given TARGET, an identifier, and CANDIDATES, a vec of identifiers,
kono
parents:
diff changeset
45 determine which element within CANDIDATES has the lowest edit
kono
parents:
diff changeset
46 distance to TARGET. If there are multiple elements with the
kono
parents:
diff changeset
47 same minimal distance, the first in the vector wins.
kono
parents:
diff changeset
48
kono
parents:
diff changeset
49 If more than half of the letters were misspelled, the suggestion is
kono
parents:
diff changeset
50 likely to be meaningless, so return NULL_TREE for this case. */
kono
parents:
diff changeset
51
kono
parents:
diff changeset
52 tree
kono
parents:
diff changeset
53 find_closest_identifier (tree target, const auto_vec<tree> *candidates)
kono
parents:
diff changeset
54 {
kono
parents:
diff changeset
55 gcc_assert (TREE_CODE (target) == IDENTIFIER_NODE);
kono
parents:
diff changeset
56
kono
parents:
diff changeset
57 best_match<tree, tree> bm (target);
kono
parents:
diff changeset
58 int i;
kono
parents:
diff changeset
59 tree identifier;
kono
parents:
diff changeset
60 FOR_EACH_VEC_ELT (*candidates, i, identifier)
kono
parents:
diff changeset
61 {
kono
parents:
diff changeset
62 gcc_assert (TREE_CODE (identifier) == IDENTIFIER_NODE);
kono
parents:
diff changeset
63 bm.consider (identifier);
kono
parents:
diff changeset
64 }
kono
parents:
diff changeset
65
kono
parents:
diff changeset
66 return bm.get_best_meaningful_candidate ();
kono
parents:
diff changeset
67 }
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69 /* A callback for cpp_forall_identifiers, for use by best_macro_match's ctor.
kono
parents:
diff changeset
70 Process HASHNODE and update the best_macro_match instance pointed to be
kono
parents:
diff changeset
71 USER_DATA. */
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 static int
kono
parents:
diff changeset
74 find_closest_macro_cpp_cb (cpp_reader *, cpp_hashnode *hashnode,
kono
parents:
diff changeset
75 void *user_data)
kono
parents:
diff changeset
76 {
kono
parents:
diff changeset
77 if (hashnode->type != NT_MACRO)
kono
parents:
diff changeset
78 return 1;
kono
parents:
diff changeset
79
kono
parents:
diff changeset
80 best_macro_match *bmm = (best_macro_match *)user_data;
kono
parents:
diff changeset
81 bmm->consider (hashnode);
kono
parents:
diff changeset
82
kono
parents:
diff changeset
83 /* Keep iterating. */
kono
parents:
diff changeset
84 return 1;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86
kono
parents:
diff changeset
87 /* Constructor for best_macro_match.
kono
parents:
diff changeset
88 Use find_closest_macro_cpp_cb to find the closest matching macro to
kono
parents:
diff changeset
89 NAME within distance < best_distance_so_far. */
kono
parents:
diff changeset
90
kono
parents:
diff changeset
91 best_macro_match::best_macro_match (tree goal,
kono
parents:
diff changeset
92 edit_distance_t best_distance_so_far,
kono
parents:
diff changeset
93 cpp_reader *reader)
kono
parents:
diff changeset
94 : best_match <goal_t, candidate_t> (goal, best_distance_so_far)
kono
parents:
diff changeset
95 {
kono
parents:
diff changeset
96 cpp_forall_identifiers (reader, find_closest_macro_cpp_cb, this);
kono
parents:
diff changeset
97 }
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 #if CHECKING_P
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 namespace selftest {
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 /* Selftests. */
kono
parents:
diff changeset
104
kono
parents:
diff changeset
105 /* Verify that find_closest_identifier is sane. */
kono
parents:
diff changeset
106
kono
parents:
diff changeset
107 static void
kono
parents:
diff changeset
108 test_find_closest_identifier ()
kono
parents:
diff changeset
109 {
kono
parents:
diff changeset
110 auto_vec<tree> candidates;
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 /* Verify that it can handle an empty vec. */
kono
parents:
diff changeset
113 ASSERT_EQ (NULL, find_closest_identifier (get_identifier (""), &candidates));
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 /* Verify that it works sanely for non-empty vecs. */
kono
parents:
diff changeset
116 tree apple = get_identifier ("apple");
kono
parents:
diff changeset
117 tree banana = get_identifier ("banana");
kono
parents:
diff changeset
118 tree cherry = get_identifier ("cherry");
kono
parents:
diff changeset
119 candidates.safe_push (apple);
kono
parents:
diff changeset
120 candidates.safe_push (banana);
kono
parents:
diff changeset
121 candidates.safe_push (cherry);
kono
parents:
diff changeset
122
kono
parents:
diff changeset
123 ASSERT_EQ (apple, find_closest_identifier (get_identifier ("app"),
kono
parents:
diff changeset
124 &candidates));
kono
parents:
diff changeset
125 ASSERT_EQ (banana, find_closest_identifier (get_identifier ("banyan"),
kono
parents:
diff changeset
126 &candidates));;
kono
parents:
diff changeset
127 ASSERT_EQ (cherry, find_closest_identifier (get_identifier ("berry"),
kono
parents:
diff changeset
128 &candidates));
kono
parents:
diff changeset
129 ASSERT_EQ (NULL,
kono
parents:
diff changeset
130 find_closest_identifier (get_identifier ("not like the others"),
kono
parents:
diff changeset
131 &candidates));
kono
parents:
diff changeset
132 }
kono
parents:
diff changeset
133
kono
parents:
diff changeset
134 /* Run all of the selftests within this file. */
kono
parents:
diff changeset
135
kono
parents:
diff changeset
136 void
kono
parents:
diff changeset
137 spellcheck_tree_c_tests ()
kono
parents:
diff changeset
138 {
kono
parents:
diff changeset
139 test_find_closest_identifier ();
kono
parents:
diff changeset
140 }
kono
parents:
diff changeset
141
kono
parents:
diff changeset
142 } // namespace selftest
kono
parents:
diff changeset
143
kono
parents:
diff changeset
144 #endif /* #if CHECKING_P */