Convert file search API to FilePath

Fixes: QTCREATORBUG-28135
Change-Id: Iec8fcbae40adcccbe775de5719a657f5aa30a941
Reviewed-by: David Schulz <david.schulz@qt.io>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
This commit is contained in:
Eike Ziller
2022-09-12 10:42:51 +02:00
parent 2c51e4bc17
commit 2456f8f568
15 changed files with 183 additions and 156 deletions

View File

@@ -47,20 +47,19 @@ QString clippedText(const QString &text, int maxLength)
} }
// returns success // returns success
bool getFileContent(const QString &filePath, static bool getFileContent(const FilePath &filePath,
QTextCodec *encoding, QTextCodec *encoding,
QString *tempString, QString *tempString,
const QMap<QString, QString> &fileToContentsMap) const QMap<FilePath, QString> &fileToContentsMap)
{ {
if (fileToContentsMap.contains(filePath)) { if (fileToContentsMap.contains(filePath)) {
*tempString = fileToContentsMap.value(filePath); *tempString = fileToContentsMap.value(filePath);
} else { } else {
QFile file(filePath); const std::optional<QByteArray> content = filePath.fileContents();
if (!file.open(QIODevice::ReadOnly)) if (!content)
return false; return false;
const QByteArray content = file.readAll(); *tempString = QTC_GUARD(encoding) ? encoding->toUnicode(*content)
*tempString = QTC_GUARD(encoding) ? encoding->toUnicode(content) : QTextCodec::codecForLocale()->toUnicode(*content);
: QTextCodec::codecForLocale()->toUnicode(content);
} }
return true; return true;
} }
@@ -68,13 +67,14 @@ bool getFileContent(const QString &filePath,
class FileSearch class FileSearch
{ {
public: public:
FileSearch(const QString &searchTerm, QTextDocument::FindFlags flags, FileSearch(const QString &searchTerm,
const QMap<QString, QString> &fileToContentsMap); QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap);
void operator()(QFutureInterface<FileSearchResultList> &futureInterface, void operator()(QFutureInterface<FileSearchResultList> &futureInterface,
const FileIterator::Item &item) const; const FileIterator::Item &item) const;
private: private:
QMap<QString, QString> fileToContentsMap; QMap<FilePath, QString> fileToContentsMap;
QString searchTermLower; QString searchTermLower;
QString searchTermUpper; QString searchTermUpper;
int termMaxIndex; int termMaxIndex;
@@ -88,8 +88,9 @@ private:
class FileSearchRegExp class FileSearchRegExp
{ {
public: public:
FileSearchRegExp(const QString &searchTerm, QTextDocument::FindFlags flags, FileSearchRegExp(const QString &searchTerm,
const QMap<QString, QString> &fileToContentsMap); QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap);
FileSearchRegExp(const FileSearchRegExp &other); FileSearchRegExp(const FileSearchRegExp &other);
void operator()(QFutureInterface<FileSearchResultList> &futureInterface, void operator()(QFutureInterface<FileSearchResultList> &futureInterface,
const FileIterator::Item &item) const; const FileIterator::Item &item) const;
@@ -97,13 +98,14 @@ public:
private: private:
QRegularExpressionMatch doGuardedMatch(const QString &line, int offset) const; QRegularExpressionMatch doGuardedMatch(const QString &line, int offset) const;
QMap<QString, QString> fileToContentsMap; QMap<FilePath, QString> fileToContentsMap;
QRegularExpression expression; QRegularExpression expression;
mutable QMutex mutex; mutable QMutex mutex;
}; };
FileSearch::FileSearch(const QString &searchTerm, QTextDocument::FindFlags flags, FileSearch::FileSearch(const QString &searchTerm,
const QMap<QString, QString> &fileToContentsMap) QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap)
{ {
this->fileToContentsMap = fileToContentsMap; this->fileToContentsMap = fileToContentsMap;
caseSensitive = (flags & QTextDocument::FindCaseSensitively); caseSensitive = (flags & QTextDocument::FindCaseSensitively);
@@ -190,7 +192,7 @@ void FileSearch::operator()(QFutureInterface<FileSearchResultList> &futureInterf
} }
if (equal) { if (equal) {
const QString resultItemText = clippedText(chunk, MAX_LINE_SIZE); const QString resultItemText = clippedText(chunk, MAX_LINE_SIZE);
results << FileSearchResult(FilePath::fromString(item.filePath), results << FileSearchResult(item.filePath,
lineNr, lineNr,
resultItemText, resultItemText,
regionPtr - chunkPtr, regionPtr - chunkPtr,
@@ -212,8 +214,9 @@ void FileSearch::operator()(QFutureInterface<FileSearchResultList> &futureInterf
qCDebug(searchLog) << "- finished searching in" << item.filePath; qCDebug(searchLog) << "- finished searching in" << item.filePath;
} }
FileSearchRegExp::FileSearchRegExp(const QString &searchTerm, QTextDocument::FindFlags flags, FileSearchRegExp::FileSearchRegExp(const QString &searchTerm,
const QMap<QString, QString> &fileToContentsMap) QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap)
{ {
this->fileToContentsMap = fileToContentsMap; this->fileToContentsMap = fileToContentsMap;
QString term = searchTerm; QString term = searchTerm;
@@ -268,9 +271,12 @@ void FileSearchRegExp::operator()(QFutureInterface<FileSearchResultList> &future
int pos = 0; int pos = 0;
while ((match = doGuardedMatch(line, pos)).hasMatch()) { while ((match = doGuardedMatch(line, pos)).hasMatch()) {
pos = match.capturedStart(); pos = match.capturedStart();
results << FileSearchResult(FilePath::fromString(item.filePath), lineNr, resultItemText, results << FileSearchResult(item.filePath,
pos, match.capturedLength(), lineNr,
match.capturedTexts()); resultItemText,
pos,
match.capturedLength(),
match.capturedTexts());
if (match.capturedLength() == 0) if (match.capturedLength() == 0)
break; break;
pos += match.capturedLength(); pos += match.capturedLength();
@@ -351,8 +357,10 @@ void cleanUpFileSearch(QFutureInterface<FileSearchResultList> &futureInterface,
} // namespace } // namespace
QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm, FileIterator *files, QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm,
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap) FileIterator *files,
QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap)
{ {
return mapReduce(files->begin(), files->end(), return mapReduce(files->begin(), files->end(),
[searchTerm, files](QFutureInterface<FileSearchResultList> &futureInterface) { [searchTerm, files](QFutureInterface<FileSearchResultList> &futureInterface) {
@@ -363,8 +371,11 @@ QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm, File
&cleanUpFileSearch); &cleanUpFileSearch);
} }
QFuture<FileSearchResultList> Utils::findInFilesRegExp(const QString &searchTerm, FileIterator *files, QFuture<FileSearchResultList> Utils::findInFilesRegExp(
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap) const QString &searchTerm,
FileIterator *files,
QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap)
{ {
return mapReduce(files->begin(), files->end(), return mapReduce(files->begin(), files->end(),
[searchTerm, files](QFutureInterface<FileSearchResultList> &futureInterface) { [searchTerm, files](QFutureInterface<FileSearchResultList> &futureInterface) {
@@ -471,39 +482,39 @@ static QList<QRegularExpression> filtersToRegExps(const QStringList &filters)
}); });
} }
static bool matches(const QList<QRegularExpression> &exprList, const QString &filePath) static bool matches(const QList<QRegularExpression> &exprList, const FilePath &filePath)
{ {
return Utils::anyOf(exprList, [&filePath](const QRegularExpression &reg) { return Utils::anyOf(exprList, [&filePath](const QRegularExpression &reg) {
return (reg.match(filePath).hasMatch() return (reg.match(filePath.toString()).hasMatch()
|| reg.match(FilePath::fromString(filePath).fileName()).hasMatch()); || reg.match(filePath.fileName()).hasMatch());
}); });
} }
static bool isFileIncluded(const QList<QRegularExpression> &filterRegs, static bool isFileIncluded(const QList<QRegularExpression> &filterRegs,
const QList<QRegularExpression> &exclusionRegs, const QList<QRegularExpression> &exclusionRegs,
const QString &filePath) const FilePath &filePath)
{ {
const bool isIncluded = filterRegs.isEmpty() || matches(filterRegs, filePath); const bool isIncluded = filterRegs.isEmpty() || matches(filterRegs, filePath);
return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath)); return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath));
} }
std::function<bool(const QString &)> std::function<bool(const FilePath &)> filterFileFunction(const QStringList &filters,
filterFileFunction(const QStringList &filters, const QStringList &exclusionFilters) const QStringList &exclusionFilters)
{ {
const QList<QRegularExpression> filterRegs = filtersToRegExps(filters); const QList<QRegularExpression> filterRegs = filtersToRegExps(filters);
const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters); const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters);
return [filterRegs, exclusionRegs](const QString &filePath) { return [filterRegs, exclusionRegs](const FilePath &filePath) {
return isFileIncluded(filterRegs, exclusionRegs, filePath); return isFileIncluded(filterRegs, exclusionRegs, filePath);
}; };
} }
std::function<QStringList(const QStringList &)> std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters,
filterFilesFunction(const QStringList &filters, const QStringList &exclusionFilters) const QStringList &exclusionFilters)
{ {
const QList<QRegularExpression> filterRegs = filtersToRegExps(filters); const QList<QRegularExpression> filterRegs = filtersToRegExps(filters);
const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters); const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters);
return [filterRegs, exclusionRegs](const QStringList &filePaths) { return [filterRegs, exclusionRegs](const FilePaths &filePaths) {
return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const QString &filePath) { return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const FilePath &filePath) {
return isFileIncluded(filterRegs, exclusionRegs, filePath); return isFileIncluded(filterRegs, exclusionRegs, filePath);
}); });
}; };
@@ -597,8 +608,7 @@ QTextCodec *encodingAt(const QList<QTextCodec *> &encodings, int index)
return QTextCodec::codecForLocale(); return QTextCodec::codecForLocale();
} }
FileListIterator::FileListIterator(const QStringList &fileList, FileListIterator::FileListIterator(const FilePaths &fileList, const QList<QTextCodec *> encodings)
const QList<QTextCodec *> encodings)
: m_maxIndex(-1) : m_maxIndex(-1)
{ {
m_items.reserve(fileList.size()); m_items.reserve(fileList.size());
@@ -638,19 +648,20 @@ namespace {
const int MAX_PROGRESS = 1000; const int MAX_PROGRESS = 1000;
} }
SubDirFileIterator::SubDirFileIterator(const QStringList &directories, const QStringList &filters, SubDirFileIterator::SubDirFileIterator(const FilePaths &directories,
const QStringList &exclusionFilters, QTextCodec *encoding) const QStringList &filters,
: m_filterFiles(filterFilesFunction(filters, exclusionFilters)), const QStringList &exclusionFilters,
m_progress(0) QTextCodec *encoding)
: m_filterFiles(filterFilesFunction(filters, exclusionFilters))
, m_progress(0)
{ {
m_encoding = (encoding == nullptr ? QTextCodec::codecForLocale() : encoding); m_encoding = (encoding == nullptr ? QTextCodec::codecForLocale() : encoding);
qreal maxPer = qreal(MAX_PROGRESS) / directories.count(); qreal maxPer = qreal(MAX_PROGRESS) / directories.count();
for (const QString &directoryEntry : directories) { for (const FilePath &directoryEntry : directories) {
if (!directoryEntry.isEmpty()) { if (!directoryEntry.isEmpty()) {
const QDir dir(directoryEntry); const FilePath canonicalPath = directoryEntry.canonicalPath();
const QString canonicalPath = dir.canonicalPath(); if (!canonicalPath.isEmpty() && directoryEntry.exists()) {
if (!canonicalPath.isEmpty() && dir.exists()) { m_dirs.push(directoryEntry);
m_dirs.push(dir);
m_knownDirs.insert(canonicalPath); m_knownDirs.insert(canonicalPath);
m_progressValues.push(maxPer); m_progressValues.push(maxPer);
m_processedValues.push(false); m_processedValues.push(false);
@@ -670,31 +681,26 @@ void SubDirFileIterator::update(int index)
return; return;
// collect files from the directories until we have enough for the given index // collect files from the directories until we have enough for the given index
while (!m_dirs.isEmpty() && index >= m_items.size()) { while (!m_dirs.isEmpty() && index >= m_items.size()) {
QDir dir = m_dirs.pop(); FilePath dir = m_dirs.pop();
const qreal dirProgressMax = m_progressValues.pop(); const qreal dirProgressMax = m_progressValues.pop();
const bool processed = m_processedValues.pop(); const bool processed = m_processedValues.pop();
if (dir.exists()) { if (dir.exists()) {
const QString dirPath = dir.path(); using Dir = FilePath;
using Dir = QString; using CanonicalDir = FilePath;
using CanonicalDir = QString;
std::vector<std::pair<Dir, CanonicalDir>> subDirs; std::vector<std::pair<Dir, CanonicalDir>> subDirs;
if (!processed) { if (!processed) {
for (const QFileInfo &info : for (const FilePath &entry :
dir.entryInfoList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot)) { dir.dirEntries(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot)) {
const QString canonicalDir = info.canonicalFilePath(); const FilePath canonicalDir = entry.canonicalPath();
if (!m_knownDirs.contains(canonicalDir)) if (!m_knownDirs.contains(canonicalDir))
subDirs.emplace_back(info.filePath(), canonicalDir); subDirs.emplace_back(entry, canonicalDir);
} }
} }
if (subDirs.empty()) { if (subDirs.empty()) {
const QStringList allFileEntries = dir.entryList(QDir::Files|QDir::Hidden); const FilePaths allFilePaths = dir.dirEntries(QDir::Files | QDir::Hidden);
const QStringList allFilePaths = Utils::transform(allFileEntries, const FilePaths filePaths = m_filterFiles(allFilePaths);
[&dirPath](const QString &entry) {
return QString(dirPath + '/' + entry);
});
const QStringList filePaths = m_filterFiles(allFilePaths);
m_items.reserve(m_items.size() + filePaths.size()); m_items.reserve(m_items.size() + filePaths.size());
Utils::reverseForeach(filePaths, [this](const QString &file) { Utils::reverseForeach(filePaths, [this](const FilePath &file) {
m_items.append(new Item(file, m_encoding)); m_items.append(new Item(file, m_encoding));
}); });
m_progress += dirProgressMax; m_progress += dirProgressMax;
@@ -705,7 +711,7 @@ void SubDirFileIterator::update(int index)
m_processedValues.push(true); m_processedValues.push(true);
Utils::reverseForeach(subDirs, Utils::reverseForeach(subDirs,
[this, subProgress](const std::pair<Dir, CanonicalDir> &dir) { [this, subProgress](const std::pair<Dir, CanonicalDir> &dir) {
m_dirs.push(QDir(dir.first)); m_dirs.push(dir.first);
m_knownDirs.insert(dir.second); m_knownDirs.insert(dir.second);
m_progressValues.push(subProgress); m_progressValues.push(subProgress);
m_processedValues.push(false); m_processedValues.push(false);

View File

@@ -24,12 +24,12 @@ QT_END_NAMESPACE
namespace Utils { namespace Utils {
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
std::function<bool(const QString &)> std::function<bool(const FilePath &)> filterFileFunction(const QStringList &filterRegs,
filterFileFunction(const QStringList &filterRegs, const QStringList &exclusionRegs); const QStringList &exclusionRegs);
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
std::function<QStringList(const QStringList &)> std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters,
filterFilesFunction(const QStringList &filters, const QStringList &exclusionFilters); const QStringList &exclusionFilters);
QTCREATOR_UTILS_EXPORT QTCREATOR_UTILS_EXPORT
QStringList splitFilterUiText(const QString &text); QStringList splitFilterUiText(const QString &text);
@@ -50,10 +50,11 @@ public:
{ {
public: public:
Item() = default; Item() = default;
Item(const QString &path, QTextCodec *codec) Item(const FilePath &path, QTextCodec *codec)
: filePath(path), encoding(codec) : filePath(path)
, encoding(codec)
{} {}
QString filePath; FilePath filePath;
QTextCodec *encoding = nullptr; QTextCodec *encoding = nullptr;
}; };
@@ -106,8 +107,7 @@ protected:
class QTCREATOR_UTILS_EXPORT FileListIterator : public FileIterator class QTCREATOR_UTILS_EXPORT FileListIterator : public FileIterator
{ {
public: public:
explicit FileListIterator(const QStringList &fileList, explicit FileListIterator(const FilePaths &fileList, const QList<QTextCodec *> encodings);
const QList<QTextCodec *> encodings);
int maxProgress() const override; int maxProgress() const override;
int currentProgress() const override; int currentProgress() const override;
@@ -125,7 +125,7 @@ private:
class QTCREATOR_UTILS_EXPORT SubDirFileIterator : public FileIterator class QTCREATOR_UTILS_EXPORT SubDirFileIterator : public FileIterator
{ {
public: public:
SubDirFileIterator(const QStringList &directories, SubDirFileIterator(const FilePaths &directories,
const QStringList &filters, const QStringList &filters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
QTextCodec *encoding = nullptr); QTextCodec *encoding = nullptr);
@@ -140,10 +140,10 @@ protected:
const Item &itemAt(int index) const override; const Item &itemAt(int index) const override;
private: private:
std::function<QStringList(const QStringList &)> m_filterFiles; std::function<FilePaths(const FilePaths &)> m_filterFiles;
QTextCodec *m_encoding; QTextCodec *m_encoding;
QStack<QDir> m_dirs; QStack<FilePath> m_dirs;
QSet<QString> m_knownDirs; QSet<FilePath> m_knownDirs;
QStack<qreal> m_progressValues; QStack<qreal> m_progressValues;
QStack<bool> m_processedValues; QStack<bool> m_processedValues;
qreal m_progress; qreal m_progress;
@@ -184,11 +184,17 @@ public:
using FileSearchResultList = QList<FileSearchResult>; using FileSearchResultList = QList<FileSearchResult>;
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFiles(const QString &searchTerm, FileIterator *files, QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFiles(
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap = QMap<QString, QString>()); const QString &searchTerm,
FileIterator *files,
QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap = QMap<FilePath, QString>());
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFilesRegExp(const QString &searchTerm, FileIterator *files, QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFilesRegExp(
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap = QMap<QString, QString>()); const QString &searchTerm,
FileIterator *files,
QTextDocument::FindFlags flags,
const QMap<FilePath, QString> &fileToContentsMap = QMap<FilePath, QString>());
QTCREATOR_UTILS_EXPORT QString expandRegExpReplacement(const QString &replaceText, const QStringList &capturedTexts); QTCREATOR_UTILS_EXPORT QString expandRegExpReplacement(const QString &replaceText, const QStringList &capturedTexts);
QTCREATOR_UTILS_EXPORT QString matchCaseReplacement(const QString &originalText, const QString &replaceText); QTCREATOR_UTILS_EXPORT QString matchCaseReplacement(const QString &originalText, const QString &replaceText);

View File

@@ -57,8 +57,11 @@ void DirectoryFilter::saveState(QJsonObject &object) const
if (displayName() != defaultDisplayName()) if (displayName() != defaultDisplayName())
object.insert(kDisplayNameKey, displayName()); object.insert(kDisplayNameKey, displayName());
if (!m_directories.isEmpty()) if (!m_directories.isEmpty()) {
object.insert(kDirectoriesKey, QJsonArray::fromStringList(m_directories)); object.insert(kDirectoriesKey,
QJsonArray::fromStringList(
Utils::transform(m_directories, &FilePath::toString)));
}
if (m_filters != kFiltersDefault) if (m_filters != kFiltersDefault)
object.insert(kFiltersKey, QJsonArray::fromStringList(m_filters)); object.insert(kFiltersKey, QJsonArray::fromStringList(m_filters));
if (!m_files.isEmpty()) if (!m_files.isEmpty())
@@ -74,11 +77,17 @@ static QStringList toStringList(const QJsonArray &array)
return Utils::transform(array.toVariantList(), &QVariant::toString); return Utils::transform(array.toVariantList(), &QVariant::toString);
} }
static FilePaths toFilePaths(const QJsonArray &array)
{
return Utils::transform(array.toVariantList(),
[](const QVariant &v) { return FilePath::fromString(v.toString()); });
}
void DirectoryFilter::restoreState(const QJsonObject &object) void DirectoryFilter::restoreState(const QJsonObject &object)
{ {
QMutexLocker locker(&m_lock); QMutexLocker locker(&m_lock);
setDisplayName(object.value(kDisplayNameKey).toString(defaultDisplayName())); setDisplayName(object.value(kDisplayNameKey).toString(defaultDisplayName()));
m_directories = toStringList(object.value(kDirectoriesKey).toArray()); m_directories = toFilePaths(object.value(kDirectoriesKey).toArray());
m_filters = toStringList( m_filters = toStringList(
object.value(kFiltersKey).toArray(QJsonArray::fromStringList(kFiltersDefault))); object.value(kFiltersKey).toArray(QJsonArray::fromStringList(kFiltersDefault)));
m_files = FileUtils::toFilePathList(toStringList(object.value(kFilesKey).toArray())); m_files = FileUtils::toFilePathList(toStringList(object.value(kFilesKey).toArray()));
@@ -112,8 +121,11 @@ void DirectoryFilter::restoreState(const QByteArray &state)
else else
m_exclusionFilters.clear(); m_exclusionFilters.clear();
if (m_isCustomFilter) if (m_isCustomFilter) {
m_directories = directories; m_directories = Utils::transform(directories, [](const QString &d) {
return FilePath::fromString(d);
});
}
setDisplayName(name); setDisplayName(name);
setShortcutString(shortcut); setShortcutString(shortcut);
setIncludedByDefault(defaultFilter); setIncludedByDefault(defaultFilter);
@@ -164,7 +176,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
m_ui->directoryList->clear(); m_ui->directoryList->clear();
// Note: assuming we only change m_directories in the Gui thread, // Note: assuming we only change m_directories in the Gui thread,
// we don't need to protect it here with mutex // we don't need to protect it here with mutex
m_ui->directoryList->addItems(m_directories); m_ui->directoryList->addItems(Utils::transform(m_directories, &FilePath::toString));
m_ui->nameLabel->setVisible(m_isCustomFilter); m_ui->nameLabel->setVisible(m_isCustomFilter);
m_ui->nameEdit->setVisible(m_isCustomFilter); m_ui->nameEdit->setVisible(m_isCustomFilter);
m_ui->directoryLabel->setVisible(m_isCustomFilter); m_ui->directoryLabel->setVisible(m_isCustomFilter);
@@ -192,7 +204,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (dialog.exec() == QDialog::Accepted) { if (dialog.exec() == QDialog::Accepted) {
QMutexLocker locker(&m_lock); QMutexLocker locker(&m_lock);
bool directoriesChanged = false; bool directoriesChanged = false;
const QStringList oldDirectories = m_directories; const FilePaths oldDirectories = m_directories;
const QStringList oldFilters = m_filters; const QStringList oldFilters = m_filters;
const QStringList oldExclusionFilters = m_exclusionFilters; const QStringList oldExclusionFilters = m_exclusionFilters;
setDisplayName(m_ui->nameEdit->text().trimmed()); setDisplayName(m_ui->nameEdit->text().trimmed());
@@ -202,7 +214,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
if (oldCount != newCount) if (oldCount != newCount)
directoriesChanged = true; directoriesChanged = true;
for (int i = 0; i < newCount; ++i) { for (int i = 0; i < newCount; ++i) {
m_directories.append(m_ui->directoryList->item(i)->text()); m_directories.append(FilePath::fromString(m_ui->directoryList->item(i)->text()));
if (!directoriesChanged && m_directories.at(i) != oldDirectories.at(i)) if (!directoriesChanged && m_directories.at(i) != oldDirectories.at(i))
directoriesChanged = true; directoriesChanged = true;
} }
@@ -258,7 +270,8 @@ void DirectoryFilter::updateFileIterator()
void DirectoryFilter::refresh(QFutureInterface<void> &future) void DirectoryFilter::refresh(QFutureInterface<void> &future)
{ {
QStringList directories, filters, exclusionFilters; FilePaths directories;
QStringList filters, exclusionFilters;
{ {
QMutexLocker locker(&m_lock); QMutexLocker locker(&m_lock);
if (m_directories.isEmpty()) { if (m_directories.isEmpty()) {
@@ -280,7 +293,7 @@ void DirectoryFilter::refresh(QFutureInterface<void> &future)
for (auto it = subDirIterator.begin(); it != end; ++it) { for (auto it = subDirIterator.begin(); it != end; ++it) {
if (future.isCanceled()) if (future.isCanceled())
break; break;
filesFound << Utils::FilePath::fromString((*it).filePath); filesFound << (*it).filePath;
if (future.isProgressUpdateNeeded() if (future.isProgressUpdateNeeded()
|| future.progressValue() == 0 /*workaround for regression in Qt*/) { || future.progressValue() == 0 /*workaround for regression in Qt*/) {
future.setProgressValueAndText(subDirIterator.currentProgress(), future.setProgressValueAndText(subDirIterator.currentProgress(),
@@ -303,7 +316,7 @@ void DirectoryFilter::setIsCustomFilter(bool value)
m_isCustomFilter = value; m_isCustomFilter = value;
} }
void DirectoryFilter::setDirectories(const QStringList &directories) void DirectoryFilter::setDirectories(const FilePaths &directories)
{ {
if (directories == m_directories) if (directories == m_directories)
return; return;
@@ -314,19 +327,19 @@ void DirectoryFilter::setDirectories(const QStringList &directories)
Internal::Locator::instance()->refresh({this}); Internal::Locator::instance()->refresh({this});
} }
void DirectoryFilter::addDirectory(const QString &directory) void DirectoryFilter::addDirectory(const FilePath &directory)
{ {
setDirectories(m_directories + QStringList(directory)); setDirectories(m_directories + FilePaths{directory});
} }
void DirectoryFilter::removeDirectory(const QString &directory) void DirectoryFilter::removeDirectory(const FilePath &directory)
{ {
QStringList directories = m_directories; FilePaths directories = m_directories;
directories.removeOne(directory); directories.removeOne(directory);
setDirectories(directories); setDirectories(directories);
} }
QStringList DirectoryFilter::directories() const FilePaths DirectoryFilter::directories() const
{ {
return m_directories; return m_directories;
} }

View File

@@ -30,10 +30,10 @@ public:
void refresh(QFutureInterface<void> &future) override; void refresh(QFutureInterface<void> &future) override;
void setIsCustomFilter(bool value); void setIsCustomFilter(bool value);
void setDirectories(const QStringList &directories); void setDirectories(const Utils::FilePaths &directories);
void addDirectory(const QString &directory); void addDirectory(const Utils::FilePath &directory);
void removeDirectory(const QString &directory); void removeDirectory(const Utils::FilePath &directory);
QStringList directories() const; Utils::FilePaths directories() const;
void setFilters(const QStringList &filters); void setFilters(const QStringList &filters);
void setExclusionFilters(const QStringList &exclusionFilters); void setExclusionFilters(const QStringList &exclusionFilters);
@@ -48,7 +48,7 @@ private:
void updateOptionButtons(); void updateOptionButtons();
void updateFileIterator(); void updateFileIterator();
QStringList m_directories; Utils::FilePaths m_directories;
QStringList m_filters; QStringList m_filters;
QStringList m_exclusionFilters; QStringList m_exclusionFilters;
// Our config dialog, uses in addDirectory and editDirectory // Our config dialog, uses in addDirectory and editDirectory

View File

@@ -21,6 +21,7 @@
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal; using namespace ProjectExplorer::Internal;
using namespace TextEditor; using namespace TextEditor;
using namespace Utils;
AllProjectsFind::AllProjectsFind() : m_configWidget(nullptr) AllProjectsFind::AllProjectsFind() : m_configWidget(nullptr)
{ {
@@ -43,37 +44,37 @@ bool AllProjectsFind::isEnabled() const
return BaseFileFind::isEnabled() && SessionManager::hasProjects(); return BaseFileFind::isEnabled() && SessionManager::hasProjects();
} }
Utils::FileIterator *AllProjectsFind::files(const QStringList &nameFilters, FileIterator *AllProjectsFind::files(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QVariant &additionalParameters) const const QVariant &additionalParameters) const
{ {
Q_UNUSED(additionalParameters) Q_UNUSED(additionalParameters)
return filesForProjects(nameFilters, exclusionFilters, SessionManager::projects()); return filesForProjects(nameFilters, exclusionFilters, SessionManager::projects());
} }
Utils::FileIterator *AllProjectsFind::filesForProjects(const QStringList &nameFilters, FileIterator *AllProjectsFind::filesForProjects(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QList<Project *> &projects) const const QList<Project *> &projects) const
{ {
std::function<QStringList(const QStringList &)> filterFiles = std::function<FilePaths(const FilePaths &)> filterFiles
Utils::filterFilesFunction(nameFilters, exclusionFilters); = Utils::filterFilesFunction(nameFilters, exclusionFilters);
const QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings(); const QMap<FilePath, QTextCodec *> openEditorEncodings
QMap<QString, QTextCodec *> encodings; = TextDocument::openedTextDocumentEncodings();
QMap<FilePath, QTextCodec *> encodings;
for (const Project *project : projects) { for (const Project *project : projects) {
const EditorConfiguration *config = project->editorConfiguration(); const EditorConfiguration *config = project->editorConfiguration();
QTextCodec *projectCodec = config->useGlobalSettings() QTextCodec *projectCodec = config->useGlobalSettings()
? Core::EditorManager::defaultTextCodec() ? Core::EditorManager::defaultTextCodec()
: config->textCodec(); : config->textCodec();
const QStringList filteredFiles = filterFiles( const FilePaths filteredFiles = filterFiles(project->files(Project::SourceFiles));
Utils::transform(project->files(Project::SourceFiles), &Utils::FilePath::toString)); for (const FilePath &fileName : filteredFiles) {
for (const QString &fileName : filteredFiles) {
QTextCodec *codec = openEditorEncodings.value(fileName); QTextCodec *codec = openEditorEncodings.value(fileName);
if (!codec) if (!codec)
codec = projectCodec; codec = projectCodec;
encodings.insert(fileName, codec); encodings.insert(fileName, codec);
} }
} }
return new Utils::FileListIterator(encodings.keys(), encodings.values()); return new FileListIterator(encodings.keys(), encodings.values());
} }
QVariant AllProjectsFind::additionalParameters() const QVariant AllProjectsFind::additionalParameters() const

View File

@@ -16,6 +16,7 @@
using namespace ProjectExplorer; using namespace ProjectExplorer;
using namespace ProjectExplorer::Internal; using namespace ProjectExplorer::Internal;
using namespace TextEditor; using namespace TextEditor;
using namespace Utils;
CurrentProjectFind::CurrentProjectFind() CurrentProjectFind::CurrentProjectFind()
{ {
@@ -51,22 +52,22 @@ QVariant CurrentProjectFind::additionalParameters() const
{ {
Project *project = ProjectTree::currentProject(); Project *project = ProjectTree::currentProject();
if (project) if (project)
return QVariant::fromValue(project->projectFilePath().toString()); return project->projectFilePath().toVariant();
return QVariant(); return QVariant();
} }
Utils::FileIterator *CurrentProjectFind::files(const QStringList &nameFilters, FileIterator *CurrentProjectFind::files(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QVariant &additionalParameters) const const QVariant &additionalParameters) const
{ {
QTC_ASSERT(additionalParameters.isValid(), QTC_ASSERT(additionalParameters.isValid(),
return new Utils::FileListIterator(QStringList(), QList<QTextCodec *>())); return new FileListIterator(FilePaths(), QList<QTextCodec *>()));
QString projectFile = additionalParameters.toString(); const FilePath projectFile = FilePath::fromVariant(additionalParameters);
for (Project *project : SessionManager::projects()) { for (Project *project : SessionManager::projects()) {
if (project && projectFile == project->projectFilePath().toString()) if (project && projectFile == project->projectFilePath())
return filesForProjects(nameFilters, exclusionFilters, {project}); return filesForProjects(nameFilters, exclusionFilters, {project});
} }
return new Utils::FileListIterator(QStringList(), QList<QTextCodec *>()); return new FileListIterator(FilePaths(), QList<QTextCodec *>());
} }
QString CurrentProjectFind::label() const QString CurrentProjectFind::label() const
@@ -84,9 +85,9 @@ void CurrentProjectFind::handleProjectChanged()
void CurrentProjectFind::recheckEnabled(Core::SearchResult *search) void CurrentProjectFind::recheckEnabled(Core::SearchResult *search)
{ {
QString projectFile = getAdditionalParameters(search).toString(); const FilePath projectFile = FilePath::fromVariant(getAdditionalParameters(search));
for (Project *project : SessionManager::projects()) { for (Project *project : SessionManager::projects()) {
if (projectFile == project->projectFilePath().toString()) { if (projectFile == project->projectFilePath()) {
search->setSearchAgainEnabled(true); search->setSearchAgainEnabled(true);
return; return;
} }

View File

@@ -54,8 +54,7 @@ Utils::FileIterator *FilesInAllProjectsFind::files(const QStringList &nameFilter
const QSet<FilePath> dirs = Utils::transform<QSet>(SessionManager::projects(), [](Project *p) { const QSet<FilePath> dirs = Utils::transform<QSet>(SessionManager::projects(), [](Project *p) {
return p->projectFilePath().parentDir(); return p->projectFilePath().parentDir();
}); });
const QStringList dirStrings = Utils::transform<QStringList>(dirs, &FilePath::toString); return new SubDirFileIterator(FilePaths(dirs.constBegin(), dirs.constEnd()),
return new SubDirFileIterator(dirStrings,
nameFilters, nameFilters,
exclusionFilters, exclusionFilters,
Core::EditorManager::defaultTextCodec()); Core::EditorManager::defaultTextCodec());

View File

@@ -867,14 +867,13 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
dd, &ProjectExplorerPluginPrivate::loadSesssionTasks); dd, &ProjectExplorerPluginPrivate::loadSesssionTasks);
connect(sessionManager, &SessionManager::projectAdded, dd, [](ProjectExplorer::Project *project) { connect(sessionManager, &SessionManager::projectAdded, dd, [](ProjectExplorer::Project *project) {
dd->m_allProjectDirectoriesFilter.addDirectory(project->projectDirectory().toString()); dd->m_allProjectDirectoriesFilter.addDirectory(project->projectDirectory());
}); });
connect(sessionManager, connect(sessionManager,
&SessionManager::projectRemoved, &SessionManager::projectRemoved,
dd, dd,
[](ProjectExplorer::Project *project) { [](ProjectExplorer::Project *project) {
dd->m_allProjectDirectoriesFilter.removeDirectory( dd->m_allProjectDirectoriesFilter.removeDirectory(project->projectDirectory());
project->projectDirectory().toString());
}); });
ProjectTree *tree = &dd->m_projectTree; ProjectTree *tree = &dd->m_projectTree;

View File

@@ -2,7 +2,6 @@
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0 // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
#include "findincurrentfile.h" #include "findincurrentfile.h"
#include "texteditor.h"
#include "textdocument.h" #include "textdocument.h"
#include <utils/filesearch.h> #include <utils/filesearch.h>
@@ -39,8 +38,9 @@ Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters,
{ {
Q_UNUSED(nameFilters) Q_UNUSED(nameFilters)
Q_UNUSED(exclusionFilters) Q_UNUSED(exclusionFilters)
QString fileName = additionalParameters.toString(); const auto fileName = Utils::FilePath::fromVariant(additionalParameters);
QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings(); QMap<Utils::FilePath, QTextCodec *> openEditorEncodings
= TextDocument::openedTextDocumentEncodings();
QTextCodec *codec = openEditorEncodings.value(fileName); QTextCodec *codec = openEditorEncodings.value(fileName);
if (!codec) if (!codec)
codec = Core::EditorManager::defaultTextCodec(); codec = Core::EditorManager::defaultTextCodec();
@@ -49,7 +49,7 @@ Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters,
QVariant FindInCurrentFile::additionalParameters() const QVariant FindInCurrentFile::additionalParameters() const
{ {
return QVariant::fromValue(m_currentDocument->filePath().toString()); return m_currentDocument->filePath().toVariant();
} }
QString FindInCurrentFile::label() const QString FindInCurrentFile::label() const

View File

@@ -59,7 +59,7 @@ FileIterator *FindInFiles::files(const QStringList &nameFilters,
const QStringList &exclusionFilters, const QStringList &exclusionFilters,
const QVariant &additionalParameters) const const QVariant &additionalParameters) const
{ {
return new SubDirFileIterator({additionalParameters.toString()}, return new SubDirFileIterator({FilePath::fromVariant(additionalParameters)},
nameFilters, nameFilters,
exclusionFilters, exclusionFilters,
EditorManager::defaultTextCodec()); EditorManager::defaultTextCodec());
@@ -67,7 +67,7 @@ FileIterator *FindInFiles::files(const QStringList &nameFilters,
QVariant FindInFiles::additionalParameters() const QVariant FindInFiles::additionalParameters() const
{ {
return QVariant::fromValue(path().toString()); return path().toVariant();
} }
QString FindInFiles::label() const QString FindInFiles::label() const

View File

@@ -3,7 +3,6 @@
#include "findinopenfiles.h" #include "findinopenfiles.h"
#include "textdocument.h" #include "textdocument.h"
#include "texteditor.h"
#include <utils/filesearch.h> #include <utils/filesearch.h>
#include <coreplugin/icore.h> #include <coreplugin/icore.h>
@@ -40,13 +39,13 @@ Utils::FileIterator *FindInOpenFiles::files(const QStringList &nameFilters,
Q_UNUSED(nameFilters) Q_UNUSED(nameFilters)
Q_UNUSED(exclusionFilters) Q_UNUSED(exclusionFilters)
Q_UNUSED(additionalParameters) Q_UNUSED(additionalParameters)
QMap<QString, QTextCodec *> openEditorEncodings QMap<Utils::FilePath, QTextCodec *> openEditorEncodings
= TextDocument::openedTextDocumentEncodings(); = TextDocument::openedTextDocumentEncodings();
QStringList fileNames; Utils::FilePaths fileNames;
QList<QTextCodec *> codecs; QList<QTextCodec *> codecs;
const QList<Core::DocumentModel::Entry *> entries = Core::DocumentModel::entries(); const QList<Core::DocumentModel::Entry *> entries = Core::DocumentModel::entries();
for (Core::DocumentModel::Entry *entry : entries) { for (Core::DocumentModel::Entry *entry : entries) {
QString fileName = entry->fileName().toString(); const Utils::FilePath fileName = entry->fileName();
if (!fileName.isEmpty()) { if (!fileName.isEmpty()) {
fileNames.append(fileName); fileNames.append(fileName);
QTextCodec *codec = openEditorEncodings.value(fileName); QTextCodec *codec = openEditorEncodings.value(fileName);

View File

@@ -235,29 +235,29 @@ TextDocument::~TextDocument()
delete d; delete d;
} }
QMap<QString, QString> TextDocument::openedTextDocumentContents() QMap<FilePath, QString> TextDocument::openedTextDocumentContents()
{ {
QMap<QString, QString> workingCopy; QMap<FilePath, QString> workingCopy;
const QList<IDocument *> documents = DocumentModel::openedDocuments(); const QList<IDocument *> documents = DocumentModel::openedDocuments();
for (IDocument *document : documents) { for (IDocument *document : documents) {
auto textEditorDocument = qobject_cast<TextDocument *>(document); auto textEditorDocument = qobject_cast<TextDocument *>(document);
if (!textEditorDocument) if (!textEditorDocument)
continue; continue;
QString fileName = textEditorDocument->filePath().toString(); const FilePath fileName = textEditorDocument->filePath();
workingCopy[fileName] = textEditorDocument->plainText(); workingCopy[fileName] = textEditorDocument->plainText();
} }
return workingCopy; return workingCopy;
} }
QMap<QString, QTextCodec *> TextDocument::openedTextDocumentEncodings() QMap<FilePath, QTextCodec *> TextDocument::openedTextDocumentEncodings()
{ {
QMap<QString, QTextCodec *> workingCopy; QMap<FilePath, QTextCodec *> workingCopy;
const QList<IDocument *> documents = DocumentModel::openedDocuments(); const QList<IDocument *> documents = DocumentModel::openedDocuments();
for (IDocument *document : documents) { for (IDocument *document : documents) {
auto textEditorDocument = qobject_cast<TextDocument *>(document); auto textEditorDocument = qobject_cast<TextDocument *>(document);
if (!textEditorDocument) if (!textEditorDocument)
continue; continue;
QString fileName = textEditorDocument->filePath().toString(); const FilePath fileName = textEditorDocument->filePath();
workingCopy[fileName] = const_cast<QTextCodec *>(textEditorDocument->codec()); workingCopy[fileName] = const_cast<QTextCodec *>(textEditorDocument->codec());
} }
return workingCopy; return workingCopy;

View File

@@ -49,8 +49,8 @@ public:
explicit TextDocument(Utils::Id id = Utils::Id()); explicit TextDocument(Utils::Id id = Utils::Id());
~TextDocument() override; ~TextDocument() override;
static QMap<QString, QString> openedTextDocumentContents(); static QMap<Utils::FilePath, QString> openedTextDocumentContents();
static QMap<QString, QTextCodec *> openedTextDocumentEncodings(); static QMap<Utils::FilePath, QTextCodec *> openedTextDocumentEncodings();
static TextDocument *currentTextDocument(); static TextDocument *currentTextDocument();
static TextDocument *textDocumentForFilePath(const Utils::FilePath &filePath); static TextDocument *textDocumentForFilePath(const Utils::FilePath &filePath);

View File

@@ -864,8 +864,8 @@ void TextEditorWidgetFind::selectAll(const QString &txt, FindFlags findFlags)
m_editor->setFocus(); m_editor->setFocus();
}); });
const QString &fileName = m_editor->textDocument()->filePath().toString(); const FilePath &fileName = m_editor->textDocument()->filePath();
QMap<QString, QString> fileToContentsMap; QMap<FilePath, QString> fileToContentsMap;
fileToContentsMap[fileName] = m_editor->textDocument()->plainText(); fileToContentsMap[fileName] = m_editor->textDocument()->plainText();
FileListIterator *it = new FileListIterator({fileName}, FileListIterator *it = new FileListIterator({fileName},
@@ -6368,10 +6368,10 @@ void TextEditorWidgetPrivate::highlightSearchResultsInScrollBar()
const QTextDocument::FindFlags findFlags = textDocumentFlagsForFindFlags(m_findFlags); const QTextDocument::FindFlags findFlags = textDocumentFlagsForFindFlags(m_findFlags);
const QString &fileName = m_document->filePath().toString(); const FilePath &fileName = m_document->filePath();
FileListIterator *it = FileListIterator *it =
new FileListIterator({fileName} , {const_cast<QTextCodec *>(m_document->codec())}); new FileListIterator({fileName} , {const_cast<QTextCodec *>(m_document->codec())});
QMap<QString, QString> fileToContentsMap; QMap<FilePath, QString> fileToContentsMap;
fileToContentsMap[fileName] = m_document->plainText(); fileToContentsMap[fileName] = m_document->plainText();
if (m_findFlags & FindRegularExpression) if (m_findFlags & FindRegularExpression)

View File

@@ -31,7 +31,10 @@ namespace {
const QString &term, const QString &term,
QTextDocument::FindFlags flags, tst_FileSearch::RegExpFlag regexp = tst_FileSearch::NoRegExp) QTextDocument::FindFlags flags, tst_FileSearch::RegExpFlag regexp = tst_FileSearch::NoRegExp)
{ {
Utils::FileIterator *it = new Utils::FileListIterator(QStringList(QLatin1String(FILENAME)), QList<QTextCodec *>() << QTextCodec::codecForLocale()); Utils::FileIterator *it = new Utils::FileListIterator(FilePaths{FilePath::fromString(
FILENAME)},
QList<QTextCodec *>()
<< QTextCodec::codecForLocale());
QFutureWatcher<Utils::FileSearchResultList> watcher; QFutureWatcher<Utils::FileSearchResultList> watcher;
QSignalSpy ready(&watcher, SIGNAL(resultsReadyAt(int,int))); QSignalSpy ready(&watcher, SIGNAL(resultsReadyAt(int,int)));
if (regexp == tst_FileSearch::NoRegExp) if (regexp == tst_FileSearch::NoRegExp)