Improve performance for "Find in Files" and ""Find all in..."

Fix #11878, close #12048
This commit is contained in:
Ashfaaq18 2022-08-28 23:37:04 +05:30 committed by Don Ho
parent 9809e2fc2c
commit adcace3380
2 changed files with 45 additions and 11 deletions

View File

@ -664,15 +664,18 @@ vector<generic_string> Finder::getResultFilePaths() const
return paths;
}
bool Finder::canFind(const TCHAR *fileName, size_t lineNumber) const
bool Finder::canFind(const TCHAR *fileName, size_t lineNumber, size_t* indexToStartFrom) const
{
size_t len = _pMainFoundInfos->size();
for (size_t i = 0; i < len; ++i)
for (size_t i = *indexToStartFrom; i < len; ++i)
{
if ((*_pMainFoundInfos)[i]._fullPath == fileName)
{
if (lineNumber == (*_pMainFoundInfos)[i]._lineNumber)
{
*indexToStartFrom = i;
return true;
}
}
}
return false;
@ -2738,6 +2741,10 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
bool findAllFileNameAdded = false;
// A temporary string which is used to populate the search result window
std::unique_ptr<std::string> text2AddUtf8(new std::string());
size_t indexBuffer = 0;
while (targetStart >= 0)
{
targetStart = pEditView->searchInTarget(pTextFind, stringSizeFind, findReplaceInfo._startRange, findReplaceInfo._endRange);
@ -2794,8 +2801,15 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
SearchResultMarkingLine srml;
srml._segmentPostions.push_back(std::pair<intptr_t, intptr_t>(start_mark, end_mark));
_pFinder->add(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber);
text2AddUtf8->append(_pFinder->foundLine(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber));
if (text2AddUtf8->length() > FINDTEMPSTRING_MAXSIZE)
{
_pFinder->setFinderReadOnly(false);
_pFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast<LPARAM>(text2AddUtf8->c_str()));
_pFinder->setFinderReadOnly(true);
text2AddUtf8->clear();
}
break;
}
@ -2828,7 +2842,7 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
SearchResultMarkingLine srml;
srml._segmentPostions.push_back(std::pair<intptr_t, intptr_t>(start_mark, end_mark));
processed = (!pOptions->_isMatchLineNumber) || (pFindersInfo->_pSourceFinder->canFind(pFileName, lineNumber + 1));
processed = (!pOptions->_isMatchLineNumber) || (pFindersInfo->_pSourceFinder->canFind(pFileName, lineNumber + 1, &indexBuffer));
if (processed)
{
if (!findAllFileNameAdded) //add new filetitle in hits if we haven't already
@ -2836,7 +2850,15 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
pFindersInfo->_pDestFinder->addFileNameTitle(pFileName);
findAllFileNameAdded = true;
}
pFindersInfo->_pDestFinder->add(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber);
text2AddUtf8->append(pFindersInfo->_pDestFinder->foundLine(FoundInfo(targetStart, targetEnd, lineNumber + 1, pFileName), srml, line.c_str(), totalLineNumber));
if (text2AddUtf8->length() > FINDTEMPSTRING_MAXSIZE)
{
pFindersInfo->_pDestFinder->setFinderReadOnly(false);
pFindersInfo->_pDestFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast<LPARAM>(text2AddUtf8->c_str()));
pFindersInfo->_pDestFinder->setFinderReadOnly(true);
text2AddUtf8->clear();
}
}
break;
}
@ -2947,12 +2969,22 @@ int FindReplaceDlg::processRange(ProcessOperation op, FindReplaceInfo & findRepl
Finder *pFinder = nullptr;
if (op == ProcessFindAll)
{
_pFinder->setFinderReadOnly(false);
_pFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast<LPARAM>(text2AddUtf8->c_str()));
_pFinder->setFinderReadOnly(true);
text2AddUtf8->clear();
pFinder = _pFinder;
}
else if (op == ProcessFindInFinder)
{
if (pFindersInfo && pFindersInfo->_pDestFinder)
{
pFindersInfo->_pDestFinder->setFinderReadOnly(false);
pFindersInfo->_pDestFinder->_scintView.execute(SCI_ADDTEXT, text2AddUtf8->length(), reinterpret_cast<LPARAM>(text2AddUtf8->c_str()));
pFindersInfo->_pDestFinder->setFinderReadOnly(true);
text2AddUtf8->clear();
pFinder = pFindersInfo->_pDestFinder;
}
else
pFinder = _pFinder;
}
@ -4467,7 +4499,7 @@ void Finder::addSearchHitCount(int count, int countSearched, bool isMatchLines,
setFinderReadOnly(true);
}
void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foundline, size_t totalLineNumber)
const char* Finder::foundLine(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foundline, size_t totalLineNumber)
{
bool isRepeatedLine = false;
@ -4514,6 +4546,7 @@ void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foun
// Add start and end markers into the previous line's info for colourizing
_pMainMarkings->back()._segmentPostions.push_back(std::pair<intptr_t, intptr_t>(miLine._segmentPostions[0].first, miLine._segmentPostions[0].second));
_pMainFoundInfos->back()._ranges.push_back(fi._ranges.back());
return "";
}
else // default mode: allow same found line has several entries in search result if the searched occurrence is matched several times in the same line
{
@ -4533,10 +4566,9 @@ void Finder::add(FoundInfo fi, SearchResultMarkingLine miLine, const TCHAR* foun
len = cut + lenEndOfLongLine;
}
setFinderReadOnly(false);
_scintView.execute(SCI_ADDTEXT, len, reinterpret_cast<LPARAM>(text2AddUtf8));
setFinderReadOnly(true);
_pMainMarkings->push_back(miLine);
return text2AddUtf8;
}
}

View File

@ -29,6 +29,8 @@
#define FINDREPLACE_MAXLENGTH 2048
#define FINDTEMPSTRING_MAXSIZE 1024*1024
enum DIALOG_TYPE {FIND_DLG, REPLACE_DLG, FINDINFILES_DLG, FINDINPROJECTS_DLG, MARK_DLG};
#define DIR_DOWN true
@ -121,7 +123,7 @@ public:
void addFileNameTitle(const TCHAR * fileName);
void addFileHitCount(int count);
void addSearchHitCount(int count, int countSearched, bool isMatchLines, bool searchedEntireNotSelection);
void add(FoundInfo fi, SearchResultMarkingLine mi, const TCHAR* foundline, size_t totalLineNumber);
const char* foundLine(FoundInfo fi, SearchResultMarkingLine mi, const TCHAR* foundline, size_t totalLineNumber);
void setFinderStyle();
void removeAll();
void openAll();
@ -136,7 +138,7 @@ public:
std::pair<intptr_t, intptr_t> gotoFoundLine(size_t nOccurrence = 0); // value 0 means this argument is not used
void deleteResult();
std::vector<generic_string> getResultFilePaths() const;
bool canFind(const TCHAR *fileName, size_t lineNumber) const;
bool canFind(const TCHAR *fileName, size_t lineNumber, size_t* indexToStartFrom) const;
void setVolatiled(bool val) { _canBeVolatiled = val; };
generic_string getHitsString(int count) const;