forked from eranif/codelite
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWordCompletionThread.cpp
73 lines (65 loc) · 2.24 KB
/
WordCompletionThread.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
#include "WordCompletionThread.h"
#include "wordcompletion.h"
#include "WordsTokens.h"
#include "macros.h"
#include "WordCompletionSettings.h"
WordCompletionThread::WordCompletionThread(WordCompletionPlugin* plugin)
: m_plugin(plugin)
{
}
WordCompletionThread::~WordCompletionThread() {}
void WordCompletionThread::ProcessRequest(ThreadRequest* request)
{
WordCompletionThreadRequest* req = dynamic_cast<WordCompletionThreadRequest*>(request);
CHECK_PTR_RET(req);
wxStringSet_t suggestsions;
void* scanner = ::wordsLexerNew(req->buffer);
CHECK_PTR_RET(scanner);
WordToken token;
WordCompletionSettings settings;
size_t flags = settings.Load().GetCompleteTypes();
// Parse and send back the reply
WordCompletionThreadReply reply;
reply.filename = req->filename;
reply.filter = req->filter;
while(::wordsLexerNext(scanner, token)) {
switch(token.type) {
case kWORD_T_NUMBER:
if(flags & WordCompletionSettings::kCompleteNumbers) {
reply.suggest.insert(token.word);
}
break;
case kWORD_T_WORD:
if(flags & WordCompletionSettings::kCompleteWords) {
reply.suggest.insert(token.word);
}
break;
case kWORD_T_STRING:
if(flags & WordCompletionSettings::kCompleteStrings) {
reply.suggest.insert(token.word);
}
break;
default:
break;
}
}
::wordsLexerDestroy(&scanner);
// Remove non matched words
wxStringSet_t::iterator iter = reply.suggest.begin();
wxStringSet_t filterdSet;
for(; iter != reply.suggest.end(); ++iter) {
wxString lcFilter = req->filter.Lower();
wxString lcKey = iter->Lower();
if(settings.GetComparisonMethod() == WordCompletionSettings::kComparisonStartsWith) {
if(lcKey.StartsWith(lcFilter) && req->filter != (*iter)) {
filterdSet.insert(*iter);
}
} else {
if(lcKey.Contains(lcFilter) && req->filter != (*iter)) {
filterdSet.insert(*iter);
}
}
}
reply.suggest.swap(filterdSet);
m_plugin->CallAfter(&WordCompletionPlugin::OnSuggestThread, reply);
}