@@ -19,7 +19,7 @@ void CodeSpellChecker::LoadDictionary(std::string_view path)
1919
2020void CodeSpellChecker::LoadDictionaryFromBuffer (std::string_view buffer)
2121{
22- _symSpell->LoadWordDictionaryFromBuffer (buffer);
22+ _symSpell->LoadWordDictionaryFromBuffer (buffer);
2323}
2424
2525void CodeSpellChecker::Analysis (DiagnosisContext& ctx)
@@ -36,9 +36,118 @@ void CodeSpellChecker::Analysis(DiagnosisContext& ctx)
3636 }
3737}
3838
39- std::vector<SuggestItem> CodeSpellChecker::GetSuggests (const std::string& word)
39+ std::vector<SuggestItem> CodeSpellChecker::GetSuggests (std::string word)
4040{
41- return _symSpell->LookUp (word);
41+ enum class ParseState
42+ {
43+ Unknown,
44+ FirstUpper,
45+ AllUpper,
46+ Lower,
47+ } state = ParseState::Unknown;
48+
49+ std::vector<SuggestItem> suggests;
50+
51+ for (std::size_t i = 0 ; i != word.size (); i++)
52+ {
53+ char & c = word[i];
54+ if (c < 0 || !std::isalpha (c))
55+ {
56+ return suggests;
57+ }
58+
59+ switch (state)
60+ {
61+ case ParseState::Unknown:
62+ {
63+ if (std::isupper (c))
64+ {
65+ state = ParseState::AllUpper;
66+ c = static_cast <char >(std::tolower (c));
67+ }
68+ else // lower
69+ {
70+ state = ParseState::Lower;
71+ }
72+
73+ break ;
74+ }
75+ case ParseState::AllUpper:
76+ {
77+ if (std::islower (c))
78+ {
79+ if (i == 1 )
80+ {
81+ state = ParseState::FirstUpper;
82+ }
83+ else
84+ {
85+ return suggests;
86+ }
87+ }
88+ c = static_cast <char >(std::tolower (c));
89+ break ;
90+ }
91+ case ParseState::FirstUpper:
92+ {
93+ if (!std::islower (c))
94+ {
95+ return suggests;
96+ }
97+ break ;
98+ }
99+ case ParseState::Lower:
100+ {
101+ if (std::isupper (c))
102+ {
103+ return suggests;
104+ }
105+ break ;
106+ }
107+ }
108+ }
109+
110+ if (state == ParseState::Unknown)
111+ {
112+ return suggests;
113+ }
114+
115+ suggests = _symSpell->LookUp (word);
116+
117+ switch (state)
118+ {
119+ case ParseState::FirstUpper:
120+ {
121+ for (auto & suggest : suggests)
122+ {
123+ if (!suggest.Term .empty ())
124+ {
125+ suggest.Term [0 ] = std::toupper (suggest.Term [0 ]);
126+ }
127+ }
128+ break ;
129+ }
130+ case ParseState::AllUpper:
131+ {
132+ for (auto & suggest : suggests)
133+ {
134+ if (!suggest.Term .empty ())
135+ {
136+ for (auto & ch : suggest.Term )
137+ {
138+ ch = std::toupper (ch);
139+ }
140+ }
141+ }
142+ break ;
143+ }
144+ default :
145+ {
146+ break ;
147+ }
148+ }
149+
150+ return suggests;
42151}
43152
44153void CodeSpellChecker::IdentifyAnalysis (DiagnosisContext& ctx, LuaToken& token)
@@ -54,7 +163,7 @@ void CodeSpellChecker::IdentifyAnalysis(DiagnosisContext& ctx, LuaToken& token)
54163 {
55164 parser = std::make_shared<IdentifyParser>(token.Text );
56165 parser->Parse ();
57- _caches.insert ({ text, parser });
166+ _caches.insert ({text, parser});
58167 }
59168
60169 auto & words = parser->GetWords ();
0 commit comments