forked from qt-creator/qt-creator
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:
@@ -47,20 +47,19 @@ QString clippedText(const QString &text, int maxLength)
|
||||
}
|
||||
|
||||
// returns success
|
||||
bool getFileContent(const QString &filePath,
|
||||
static bool getFileContent(const FilePath &filePath,
|
||||
QTextCodec *encoding,
|
||||
QString *tempString,
|
||||
const QMap<QString, QString> &fileToContentsMap)
|
||||
const QMap<FilePath, QString> &fileToContentsMap)
|
||||
{
|
||||
if (fileToContentsMap.contains(filePath)) {
|
||||
*tempString = fileToContentsMap.value(filePath);
|
||||
} else {
|
||||
QFile file(filePath);
|
||||
if (!file.open(QIODevice::ReadOnly))
|
||||
const std::optional<QByteArray> content = filePath.fileContents();
|
||||
if (!content)
|
||||
return false;
|
||||
const QByteArray content = file.readAll();
|
||||
*tempString = QTC_GUARD(encoding) ? encoding->toUnicode(content)
|
||||
: QTextCodec::codecForLocale()->toUnicode(content);
|
||||
*tempString = QTC_GUARD(encoding) ? encoding->toUnicode(*content)
|
||||
: QTextCodec::codecForLocale()->toUnicode(*content);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
@@ -68,13 +67,14 @@ bool getFileContent(const QString &filePath,
|
||||
class FileSearch
|
||||
{
|
||||
public:
|
||||
FileSearch(const QString &searchTerm, QTextDocument::FindFlags flags,
|
||||
const QMap<QString, QString> &fileToContentsMap);
|
||||
FileSearch(const QString &searchTerm,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap);
|
||||
void operator()(QFutureInterface<FileSearchResultList> &futureInterface,
|
||||
const FileIterator::Item &item) const;
|
||||
|
||||
private:
|
||||
QMap<QString, QString> fileToContentsMap;
|
||||
QMap<FilePath, QString> fileToContentsMap;
|
||||
QString searchTermLower;
|
||||
QString searchTermUpper;
|
||||
int termMaxIndex;
|
||||
@@ -88,8 +88,9 @@ private:
|
||||
class FileSearchRegExp
|
||||
{
|
||||
public:
|
||||
FileSearchRegExp(const QString &searchTerm, QTextDocument::FindFlags flags,
|
||||
const QMap<QString, QString> &fileToContentsMap);
|
||||
FileSearchRegExp(const QString &searchTerm,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap);
|
||||
FileSearchRegExp(const FileSearchRegExp &other);
|
||||
void operator()(QFutureInterface<FileSearchResultList> &futureInterface,
|
||||
const FileIterator::Item &item) const;
|
||||
@@ -97,13 +98,14 @@ public:
|
||||
private:
|
||||
QRegularExpressionMatch doGuardedMatch(const QString &line, int offset) const;
|
||||
|
||||
QMap<QString, QString> fileToContentsMap;
|
||||
QMap<FilePath, QString> fileToContentsMap;
|
||||
QRegularExpression expression;
|
||||
mutable QMutex mutex;
|
||||
};
|
||||
|
||||
FileSearch::FileSearch(const QString &searchTerm, QTextDocument::FindFlags flags,
|
||||
const QMap<QString, QString> &fileToContentsMap)
|
||||
FileSearch::FileSearch(const QString &searchTerm,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap)
|
||||
{
|
||||
this->fileToContentsMap = fileToContentsMap;
|
||||
caseSensitive = (flags & QTextDocument::FindCaseSensitively);
|
||||
@@ -190,7 +192,7 @@ void FileSearch::operator()(QFutureInterface<FileSearchResultList> &futureInterf
|
||||
}
|
||||
if (equal) {
|
||||
const QString resultItemText = clippedText(chunk, MAX_LINE_SIZE);
|
||||
results << FileSearchResult(FilePath::fromString(item.filePath),
|
||||
results << FileSearchResult(item.filePath,
|
||||
lineNr,
|
||||
resultItemText,
|
||||
regionPtr - chunkPtr,
|
||||
@@ -212,8 +214,9 @@ void FileSearch::operator()(QFutureInterface<FileSearchResultList> &futureInterf
|
||||
qCDebug(searchLog) << "- finished searching in" << item.filePath;
|
||||
}
|
||||
|
||||
FileSearchRegExp::FileSearchRegExp(const QString &searchTerm, QTextDocument::FindFlags flags,
|
||||
const QMap<QString, QString> &fileToContentsMap)
|
||||
FileSearchRegExp::FileSearchRegExp(const QString &searchTerm,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap)
|
||||
{
|
||||
this->fileToContentsMap = fileToContentsMap;
|
||||
QString term = searchTerm;
|
||||
@@ -268,8 +271,11 @@ void FileSearchRegExp::operator()(QFutureInterface<FileSearchResultList> &future
|
||||
int pos = 0;
|
||||
while ((match = doGuardedMatch(line, pos)).hasMatch()) {
|
||||
pos = match.capturedStart();
|
||||
results << FileSearchResult(FilePath::fromString(item.filePath), lineNr, resultItemText,
|
||||
pos, match.capturedLength(),
|
||||
results << FileSearchResult(item.filePath,
|
||||
lineNr,
|
||||
resultItemText,
|
||||
pos,
|
||||
match.capturedLength(),
|
||||
match.capturedTexts());
|
||||
if (match.capturedLength() == 0)
|
||||
break;
|
||||
@@ -351,8 +357,10 @@ void cleanUpFileSearch(QFutureInterface<FileSearchResultList> &futureInterface,
|
||||
|
||||
} // namespace
|
||||
|
||||
QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm, FileIterator *files,
|
||||
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap)
|
||||
QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm,
|
||||
FileIterator *files,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap)
|
||||
{
|
||||
return mapReduce(files->begin(), files->end(),
|
||||
[searchTerm, files](QFutureInterface<FileSearchResultList> &futureInterface) {
|
||||
@@ -363,8 +371,11 @@ QFuture<FileSearchResultList> Utils::findInFiles(const QString &searchTerm, File
|
||||
&cleanUpFileSearch);
|
||||
}
|
||||
|
||||
QFuture<FileSearchResultList> Utils::findInFilesRegExp(const QString &searchTerm, FileIterator *files,
|
||||
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap)
|
||||
QFuture<FileSearchResultList> Utils::findInFilesRegExp(
|
||||
const QString &searchTerm,
|
||||
FileIterator *files,
|
||||
QTextDocument::FindFlags flags,
|
||||
const QMap<FilePath, QString> &fileToContentsMap)
|
||||
{
|
||||
return mapReduce(files->begin(), files->end(),
|
||||
[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 ®) {
|
||||
return (reg.match(filePath).hasMatch()
|
||||
|| reg.match(FilePath::fromString(filePath).fileName()).hasMatch());
|
||||
return (reg.match(filePath.toString()).hasMatch()
|
||||
|| reg.match(filePath.fileName()).hasMatch());
|
||||
});
|
||||
}
|
||||
|
||||
static bool isFileIncluded(const QList<QRegularExpression> &filterRegs,
|
||||
const QList<QRegularExpression> &exclusionRegs,
|
||||
const QString &filePath)
|
||||
const FilePath &filePath)
|
||||
{
|
||||
const bool isIncluded = filterRegs.isEmpty() || matches(filterRegs, filePath);
|
||||
return isIncluded && (exclusionRegs.isEmpty() || !matches(exclusionRegs, filePath));
|
||||
}
|
||||
|
||||
std::function<bool(const QString &)>
|
||||
filterFileFunction(const QStringList &filters, const QStringList &exclusionFilters)
|
||||
std::function<bool(const FilePath &)> filterFileFunction(const QStringList &filters,
|
||||
const QStringList &exclusionFilters)
|
||||
{
|
||||
const QList<QRegularExpression> filterRegs = filtersToRegExps(filters);
|
||||
const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters);
|
||||
return [filterRegs, exclusionRegs](const QString &filePath) {
|
||||
return [filterRegs, exclusionRegs](const FilePath &filePath) {
|
||||
return isFileIncluded(filterRegs, exclusionRegs, filePath);
|
||||
};
|
||||
}
|
||||
|
||||
std::function<QStringList(const QStringList &)>
|
||||
filterFilesFunction(const QStringList &filters, const QStringList &exclusionFilters)
|
||||
std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters,
|
||||
const QStringList &exclusionFilters)
|
||||
{
|
||||
const QList<QRegularExpression> filterRegs = filtersToRegExps(filters);
|
||||
const QList<QRegularExpression> exclusionRegs = filtersToRegExps(exclusionFilters);
|
||||
return [filterRegs, exclusionRegs](const QStringList &filePaths) {
|
||||
return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const QString &filePath) {
|
||||
return [filterRegs, exclusionRegs](const FilePaths &filePaths) {
|
||||
return Utils::filtered(filePaths, [&filterRegs, &exclusionRegs](const FilePath &filePath) {
|
||||
return isFileIncluded(filterRegs, exclusionRegs, filePath);
|
||||
});
|
||||
};
|
||||
@@ -597,8 +608,7 @@ QTextCodec *encodingAt(const QList<QTextCodec *> &encodings, int index)
|
||||
return QTextCodec::codecForLocale();
|
||||
}
|
||||
|
||||
FileListIterator::FileListIterator(const QStringList &fileList,
|
||||
const QList<QTextCodec *> encodings)
|
||||
FileListIterator::FileListIterator(const FilePaths &fileList, const QList<QTextCodec *> encodings)
|
||||
: m_maxIndex(-1)
|
||||
{
|
||||
m_items.reserve(fileList.size());
|
||||
@@ -638,19 +648,20 @@ namespace {
|
||||
const int MAX_PROGRESS = 1000;
|
||||
}
|
||||
|
||||
SubDirFileIterator::SubDirFileIterator(const QStringList &directories, const QStringList &filters,
|
||||
const QStringList &exclusionFilters, QTextCodec *encoding)
|
||||
: m_filterFiles(filterFilesFunction(filters, exclusionFilters)),
|
||||
m_progress(0)
|
||||
SubDirFileIterator::SubDirFileIterator(const FilePaths &directories,
|
||||
const QStringList &filters,
|
||||
const QStringList &exclusionFilters,
|
||||
QTextCodec *encoding)
|
||||
: m_filterFiles(filterFilesFunction(filters, exclusionFilters))
|
||||
, m_progress(0)
|
||||
{
|
||||
m_encoding = (encoding == nullptr ? QTextCodec::codecForLocale() : encoding);
|
||||
qreal maxPer = qreal(MAX_PROGRESS) / directories.count();
|
||||
for (const QString &directoryEntry : directories) {
|
||||
for (const FilePath &directoryEntry : directories) {
|
||||
if (!directoryEntry.isEmpty()) {
|
||||
const QDir dir(directoryEntry);
|
||||
const QString canonicalPath = dir.canonicalPath();
|
||||
if (!canonicalPath.isEmpty() && dir.exists()) {
|
||||
m_dirs.push(dir);
|
||||
const FilePath canonicalPath = directoryEntry.canonicalPath();
|
||||
if (!canonicalPath.isEmpty() && directoryEntry.exists()) {
|
||||
m_dirs.push(directoryEntry);
|
||||
m_knownDirs.insert(canonicalPath);
|
||||
m_progressValues.push(maxPer);
|
||||
m_processedValues.push(false);
|
||||
@@ -670,31 +681,26 @@ void SubDirFileIterator::update(int index)
|
||||
return;
|
||||
// collect files from the directories until we have enough for the given index
|
||||
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 bool processed = m_processedValues.pop();
|
||||
if (dir.exists()) {
|
||||
const QString dirPath = dir.path();
|
||||
using Dir = QString;
|
||||
using CanonicalDir = QString;
|
||||
using Dir = FilePath;
|
||||
using CanonicalDir = FilePath;
|
||||
std::vector<std::pair<Dir, CanonicalDir>> subDirs;
|
||||
if (!processed) {
|
||||
for (const QFileInfo &info :
|
||||
dir.entryInfoList(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot)) {
|
||||
const QString canonicalDir = info.canonicalFilePath();
|
||||
for (const FilePath &entry :
|
||||
dir.dirEntries(QDir::Dirs | QDir::Hidden | QDir::NoDotAndDotDot)) {
|
||||
const FilePath canonicalDir = entry.canonicalPath();
|
||||
if (!m_knownDirs.contains(canonicalDir))
|
||||
subDirs.emplace_back(info.filePath(), canonicalDir);
|
||||
subDirs.emplace_back(entry, canonicalDir);
|
||||
}
|
||||
}
|
||||
if (subDirs.empty()) {
|
||||
const QStringList allFileEntries = dir.entryList(QDir::Files|QDir::Hidden);
|
||||
const QStringList allFilePaths = Utils::transform(allFileEntries,
|
||||
[&dirPath](const QString &entry) {
|
||||
return QString(dirPath + '/' + entry);
|
||||
});
|
||||
const QStringList filePaths = m_filterFiles(allFilePaths);
|
||||
const FilePaths allFilePaths = dir.dirEntries(QDir::Files | QDir::Hidden);
|
||||
const FilePaths filePaths = m_filterFiles(allFilePaths);
|
||||
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_progress += dirProgressMax;
|
||||
@@ -705,7 +711,7 @@ void SubDirFileIterator::update(int index)
|
||||
m_processedValues.push(true);
|
||||
Utils::reverseForeach(subDirs,
|
||||
[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_progressValues.push(subProgress);
|
||||
m_processedValues.push(false);
|
||||
|
||||
@@ -24,12 +24,12 @@ QT_END_NAMESPACE
|
||||
namespace Utils {
|
||||
|
||||
QTCREATOR_UTILS_EXPORT
|
||||
std::function<bool(const QString &)>
|
||||
filterFileFunction(const QStringList &filterRegs, const QStringList &exclusionRegs);
|
||||
std::function<bool(const FilePath &)> filterFileFunction(const QStringList &filterRegs,
|
||||
const QStringList &exclusionRegs);
|
||||
|
||||
QTCREATOR_UTILS_EXPORT
|
||||
std::function<QStringList(const QStringList &)>
|
||||
filterFilesFunction(const QStringList &filters, const QStringList &exclusionFilters);
|
||||
std::function<FilePaths(const FilePaths &)> filterFilesFunction(const QStringList &filters,
|
||||
const QStringList &exclusionFilters);
|
||||
|
||||
QTCREATOR_UTILS_EXPORT
|
||||
QStringList splitFilterUiText(const QString &text);
|
||||
@@ -50,10 +50,11 @@ public:
|
||||
{
|
||||
public:
|
||||
Item() = default;
|
||||
Item(const QString &path, QTextCodec *codec)
|
||||
: filePath(path), encoding(codec)
|
||||
Item(const FilePath &path, QTextCodec *codec)
|
||||
: filePath(path)
|
||||
, encoding(codec)
|
||||
{}
|
||||
QString filePath;
|
||||
FilePath filePath;
|
||||
QTextCodec *encoding = nullptr;
|
||||
};
|
||||
|
||||
@@ -106,8 +107,7 @@ protected:
|
||||
class QTCREATOR_UTILS_EXPORT FileListIterator : public FileIterator
|
||||
{
|
||||
public:
|
||||
explicit FileListIterator(const QStringList &fileList,
|
||||
const QList<QTextCodec *> encodings);
|
||||
explicit FileListIterator(const FilePaths &fileList, const QList<QTextCodec *> encodings);
|
||||
|
||||
int maxProgress() const override;
|
||||
int currentProgress() const override;
|
||||
@@ -125,7 +125,7 @@ private:
|
||||
class QTCREATOR_UTILS_EXPORT SubDirFileIterator : public FileIterator
|
||||
{
|
||||
public:
|
||||
SubDirFileIterator(const QStringList &directories,
|
||||
SubDirFileIterator(const FilePaths &directories,
|
||||
const QStringList &filters,
|
||||
const QStringList &exclusionFilters,
|
||||
QTextCodec *encoding = nullptr);
|
||||
@@ -140,10 +140,10 @@ protected:
|
||||
const Item &itemAt(int index) const override;
|
||||
|
||||
private:
|
||||
std::function<QStringList(const QStringList &)> m_filterFiles;
|
||||
std::function<FilePaths(const FilePaths &)> m_filterFiles;
|
||||
QTextCodec *m_encoding;
|
||||
QStack<QDir> m_dirs;
|
||||
QSet<QString> m_knownDirs;
|
||||
QStack<FilePath> m_dirs;
|
||||
QSet<FilePath> m_knownDirs;
|
||||
QStack<qreal> m_progressValues;
|
||||
QStack<bool> m_processedValues;
|
||||
qreal m_progress;
|
||||
@@ -184,11 +184,17 @@ public:
|
||||
|
||||
using FileSearchResultList = QList<FileSearchResult>;
|
||||
|
||||
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFiles(const QString &searchTerm, FileIterator *files,
|
||||
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap = QMap<QString, QString>());
|
||||
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFiles(
|
||||
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,
|
||||
QTextDocument::FindFlags flags, const QMap<QString, QString> &fileToContentsMap = QMap<QString, QString>());
|
||||
QTCREATOR_UTILS_EXPORT QFuture<FileSearchResultList> findInFilesRegExp(
|
||||
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 matchCaseReplacement(const QString &originalText, const QString &replaceText);
|
||||
|
||||
@@ -57,8 +57,11 @@ void DirectoryFilter::saveState(QJsonObject &object) const
|
||||
|
||||
if (displayName() != defaultDisplayName())
|
||||
object.insert(kDisplayNameKey, displayName());
|
||||
if (!m_directories.isEmpty())
|
||||
object.insert(kDirectoriesKey, QJsonArray::fromStringList(m_directories));
|
||||
if (!m_directories.isEmpty()) {
|
||||
object.insert(kDirectoriesKey,
|
||||
QJsonArray::fromStringList(
|
||||
Utils::transform(m_directories, &FilePath::toString)));
|
||||
}
|
||||
if (m_filters != kFiltersDefault)
|
||||
object.insert(kFiltersKey, QJsonArray::fromStringList(m_filters));
|
||||
if (!m_files.isEmpty())
|
||||
@@ -74,11 +77,17 @@ static QStringList toStringList(const QJsonArray &array)
|
||||
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)
|
||||
{
|
||||
QMutexLocker locker(&m_lock);
|
||||
setDisplayName(object.value(kDisplayNameKey).toString(defaultDisplayName()));
|
||||
m_directories = toStringList(object.value(kDirectoriesKey).toArray());
|
||||
m_directories = toFilePaths(object.value(kDirectoriesKey).toArray());
|
||||
m_filters = toStringList(
|
||||
object.value(kFiltersKey).toArray(QJsonArray::fromStringList(kFiltersDefault)));
|
||||
m_files = FileUtils::toFilePathList(toStringList(object.value(kFilesKey).toArray()));
|
||||
@@ -112,8 +121,11 @@ void DirectoryFilter::restoreState(const QByteArray &state)
|
||||
else
|
||||
m_exclusionFilters.clear();
|
||||
|
||||
if (m_isCustomFilter)
|
||||
m_directories = directories;
|
||||
if (m_isCustomFilter) {
|
||||
m_directories = Utils::transform(directories, [](const QString &d) {
|
||||
return FilePath::fromString(d);
|
||||
});
|
||||
}
|
||||
setDisplayName(name);
|
||||
setShortcutString(shortcut);
|
||||
setIncludedByDefault(defaultFilter);
|
||||
@@ -164,7 +176,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
|
||||
m_ui->directoryList->clear();
|
||||
// Note: assuming we only change m_directories in the Gui thread,
|
||||
// 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->nameEdit->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) {
|
||||
QMutexLocker locker(&m_lock);
|
||||
bool directoriesChanged = false;
|
||||
const QStringList oldDirectories = m_directories;
|
||||
const FilePaths oldDirectories = m_directories;
|
||||
const QStringList oldFilters = m_filters;
|
||||
const QStringList oldExclusionFilters = m_exclusionFilters;
|
||||
setDisplayName(m_ui->nameEdit->text().trimmed());
|
||||
@@ -202,7 +214,7 @@ bool DirectoryFilter::openConfigDialog(QWidget *parent, bool &needsRefresh)
|
||||
if (oldCount != newCount)
|
||||
directoriesChanged = true;
|
||||
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))
|
||||
directoriesChanged = true;
|
||||
}
|
||||
@@ -258,7 +270,8 @@ void DirectoryFilter::updateFileIterator()
|
||||
|
||||
void DirectoryFilter::refresh(QFutureInterface<void> &future)
|
||||
{
|
||||
QStringList directories, filters, exclusionFilters;
|
||||
FilePaths directories;
|
||||
QStringList filters, exclusionFilters;
|
||||
{
|
||||
QMutexLocker locker(&m_lock);
|
||||
if (m_directories.isEmpty()) {
|
||||
@@ -280,7 +293,7 @@ void DirectoryFilter::refresh(QFutureInterface<void> &future)
|
||||
for (auto it = subDirIterator.begin(); it != end; ++it) {
|
||||
if (future.isCanceled())
|
||||
break;
|
||||
filesFound << Utils::FilePath::fromString((*it).filePath);
|
||||
filesFound << (*it).filePath;
|
||||
if (future.isProgressUpdateNeeded()
|
||||
|| future.progressValue() == 0 /*workaround for regression in Qt*/) {
|
||||
future.setProgressValueAndText(subDirIterator.currentProgress(),
|
||||
@@ -303,7 +316,7 @@ void DirectoryFilter::setIsCustomFilter(bool value)
|
||||
m_isCustomFilter = value;
|
||||
}
|
||||
|
||||
void DirectoryFilter::setDirectories(const QStringList &directories)
|
||||
void DirectoryFilter::setDirectories(const FilePaths &directories)
|
||||
{
|
||||
if (directories == m_directories)
|
||||
return;
|
||||
@@ -314,19 +327,19 @@ void DirectoryFilter::setDirectories(const QStringList &directories)
|
||||
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);
|
||||
setDirectories(directories);
|
||||
}
|
||||
|
||||
QStringList DirectoryFilter::directories() const
|
||||
FilePaths DirectoryFilter::directories() const
|
||||
{
|
||||
return m_directories;
|
||||
}
|
||||
|
||||
@@ -30,10 +30,10 @@ public:
|
||||
void refresh(QFutureInterface<void> &future) override;
|
||||
|
||||
void setIsCustomFilter(bool value);
|
||||
void setDirectories(const QStringList &directories);
|
||||
void addDirectory(const QString &directory);
|
||||
void removeDirectory(const QString &directory);
|
||||
QStringList directories() const;
|
||||
void setDirectories(const Utils::FilePaths &directories);
|
||||
void addDirectory(const Utils::FilePath &directory);
|
||||
void removeDirectory(const Utils::FilePath &directory);
|
||||
Utils::FilePaths directories() const;
|
||||
void setFilters(const QStringList &filters);
|
||||
void setExclusionFilters(const QStringList &exclusionFilters);
|
||||
|
||||
@@ -48,7 +48,7 @@ private:
|
||||
void updateOptionButtons();
|
||||
void updateFileIterator();
|
||||
|
||||
QStringList m_directories;
|
||||
Utils::FilePaths m_directories;
|
||||
QStringList m_filters;
|
||||
QStringList m_exclusionFilters;
|
||||
// Our config dialog, uses in addDirectory and editDirectory
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
using namespace ProjectExplorer;
|
||||
using namespace ProjectExplorer::Internal;
|
||||
using namespace TextEditor;
|
||||
using namespace Utils;
|
||||
|
||||
AllProjectsFind::AllProjectsFind() : m_configWidget(nullptr)
|
||||
{
|
||||
@@ -43,7 +44,7 @@ bool AllProjectsFind::isEnabled() const
|
||||
return BaseFileFind::isEnabled() && SessionManager::hasProjects();
|
||||
}
|
||||
|
||||
Utils::FileIterator *AllProjectsFind::files(const QStringList &nameFilters,
|
||||
FileIterator *AllProjectsFind::files(const QStringList &nameFilters,
|
||||
const QStringList &exclusionFilters,
|
||||
const QVariant &additionalParameters) const
|
||||
{
|
||||
@@ -51,29 +52,29 @@ Utils::FileIterator *AllProjectsFind::files(const QStringList &nameFilters,
|
||||
return filesForProjects(nameFilters, exclusionFilters, SessionManager::projects());
|
||||
}
|
||||
|
||||
Utils::FileIterator *AllProjectsFind::filesForProjects(const QStringList &nameFilters,
|
||||
FileIterator *AllProjectsFind::filesForProjects(const QStringList &nameFilters,
|
||||
const QStringList &exclusionFilters,
|
||||
const QList<Project *> &projects) const
|
||||
{
|
||||
std::function<QStringList(const QStringList &)> filterFiles =
|
||||
Utils::filterFilesFunction(nameFilters, exclusionFilters);
|
||||
const QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings();
|
||||
QMap<QString, QTextCodec *> encodings;
|
||||
std::function<FilePaths(const FilePaths &)> filterFiles
|
||||
= Utils::filterFilesFunction(nameFilters, exclusionFilters);
|
||||
const QMap<FilePath, QTextCodec *> openEditorEncodings
|
||||
= TextDocument::openedTextDocumentEncodings();
|
||||
QMap<FilePath, QTextCodec *> encodings;
|
||||
for (const Project *project : projects) {
|
||||
const EditorConfiguration *config = project->editorConfiguration();
|
||||
QTextCodec *projectCodec = config->useGlobalSettings()
|
||||
? Core::EditorManager::defaultTextCodec()
|
||||
: config->textCodec();
|
||||
const QStringList filteredFiles = filterFiles(
|
||||
Utils::transform(project->files(Project::SourceFiles), &Utils::FilePath::toString));
|
||||
for (const QString &fileName : filteredFiles) {
|
||||
const FilePaths filteredFiles = filterFiles(project->files(Project::SourceFiles));
|
||||
for (const FilePath &fileName : filteredFiles) {
|
||||
QTextCodec *codec = openEditorEncodings.value(fileName);
|
||||
if (!codec)
|
||||
codec = projectCodec;
|
||||
encodings.insert(fileName, codec);
|
||||
}
|
||||
}
|
||||
return new Utils::FileListIterator(encodings.keys(), encodings.values());
|
||||
return new FileListIterator(encodings.keys(), encodings.values());
|
||||
}
|
||||
|
||||
QVariant AllProjectsFind::additionalParameters() const
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
using namespace ProjectExplorer;
|
||||
using namespace ProjectExplorer::Internal;
|
||||
using namespace TextEditor;
|
||||
using namespace Utils;
|
||||
|
||||
CurrentProjectFind::CurrentProjectFind()
|
||||
{
|
||||
@@ -51,22 +52,22 @@ QVariant CurrentProjectFind::additionalParameters() const
|
||||
{
|
||||
Project *project = ProjectTree::currentProject();
|
||||
if (project)
|
||||
return QVariant::fromValue(project->projectFilePath().toString());
|
||||
return project->projectFilePath().toVariant();
|
||||
return QVariant();
|
||||
}
|
||||
|
||||
Utils::FileIterator *CurrentProjectFind::files(const QStringList &nameFilters,
|
||||
FileIterator *CurrentProjectFind::files(const QStringList &nameFilters,
|
||||
const QStringList &exclusionFilters,
|
||||
const QVariant &additionalParameters) const
|
||||
{
|
||||
QTC_ASSERT(additionalParameters.isValid(),
|
||||
return new Utils::FileListIterator(QStringList(), QList<QTextCodec *>()));
|
||||
QString projectFile = additionalParameters.toString();
|
||||
return new FileListIterator(FilePaths(), QList<QTextCodec *>()));
|
||||
const FilePath projectFile = FilePath::fromVariant(additionalParameters);
|
||||
for (Project *project : SessionManager::projects()) {
|
||||
if (project && projectFile == project->projectFilePath().toString())
|
||||
if (project && projectFile == project->projectFilePath())
|
||||
return filesForProjects(nameFilters, exclusionFilters, {project});
|
||||
}
|
||||
return new Utils::FileListIterator(QStringList(), QList<QTextCodec *>());
|
||||
return new FileListIterator(FilePaths(), QList<QTextCodec *>());
|
||||
}
|
||||
|
||||
QString CurrentProjectFind::label() const
|
||||
@@ -84,9 +85,9 @@ void CurrentProjectFind::handleProjectChanged()
|
||||
|
||||
void CurrentProjectFind::recheckEnabled(Core::SearchResult *search)
|
||||
{
|
||||
QString projectFile = getAdditionalParameters(search).toString();
|
||||
const FilePath projectFile = FilePath::fromVariant(getAdditionalParameters(search));
|
||||
for (Project *project : SessionManager::projects()) {
|
||||
if (projectFile == project->projectFilePath().toString()) {
|
||||
if (projectFile == project->projectFilePath()) {
|
||||
search->setSearchAgainEnabled(true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -54,8 +54,7 @@ Utils::FileIterator *FilesInAllProjectsFind::files(const QStringList &nameFilter
|
||||
const QSet<FilePath> dirs = Utils::transform<QSet>(SessionManager::projects(), [](Project *p) {
|
||||
return p->projectFilePath().parentDir();
|
||||
});
|
||||
const QStringList dirStrings = Utils::transform<QStringList>(dirs, &FilePath::toString);
|
||||
return new SubDirFileIterator(dirStrings,
|
||||
return new SubDirFileIterator(FilePaths(dirs.constBegin(), dirs.constEnd()),
|
||||
nameFilters,
|
||||
exclusionFilters,
|
||||
Core::EditorManager::defaultTextCodec());
|
||||
|
||||
@@ -867,14 +867,13 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er
|
||||
dd, &ProjectExplorerPluginPrivate::loadSesssionTasks);
|
||||
|
||||
connect(sessionManager, &SessionManager::projectAdded, dd, [](ProjectExplorer::Project *project) {
|
||||
dd->m_allProjectDirectoriesFilter.addDirectory(project->projectDirectory().toString());
|
||||
dd->m_allProjectDirectoriesFilter.addDirectory(project->projectDirectory());
|
||||
});
|
||||
connect(sessionManager,
|
||||
&SessionManager::projectRemoved,
|
||||
dd,
|
||||
[](ProjectExplorer::Project *project) {
|
||||
dd->m_allProjectDirectoriesFilter.removeDirectory(
|
||||
project->projectDirectory().toString());
|
||||
dd->m_allProjectDirectoriesFilter.removeDirectory(project->projectDirectory());
|
||||
});
|
||||
|
||||
ProjectTree *tree = &dd->m_projectTree;
|
||||
|
||||
@@ -2,7 +2,6 @@
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0
|
||||
|
||||
#include "findincurrentfile.h"
|
||||
#include "texteditor.h"
|
||||
#include "textdocument.h"
|
||||
|
||||
#include <utils/filesearch.h>
|
||||
@@ -39,8 +38,9 @@ Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters,
|
||||
{
|
||||
Q_UNUSED(nameFilters)
|
||||
Q_UNUSED(exclusionFilters)
|
||||
QString fileName = additionalParameters.toString();
|
||||
QMap<QString, QTextCodec *> openEditorEncodings = TextDocument::openedTextDocumentEncodings();
|
||||
const auto fileName = Utils::FilePath::fromVariant(additionalParameters);
|
||||
QMap<Utils::FilePath, QTextCodec *> openEditorEncodings
|
||||
= TextDocument::openedTextDocumentEncodings();
|
||||
QTextCodec *codec = openEditorEncodings.value(fileName);
|
||||
if (!codec)
|
||||
codec = Core::EditorManager::defaultTextCodec();
|
||||
@@ -49,7 +49,7 @@ Utils::FileIterator *FindInCurrentFile::files(const QStringList &nameFilters,
|
||||
|
||||
QVariant FindInCurrentFile::additionalParameters() const
|
||||
{
|
||||
return QVariant::fromValue(m_currentDocument->filePath().toString());
|
||||
return m_currentDocument->filePath().toVariant();
|
||||
}
|
||||
|
||||
QString FindInCurrentFile::label() const
|
||||
|
||||
@@ -59,7 +59,7 @@ FileIterator *FindInFiles::files(const QStringList &nameFilters,
|
||||
const QStringList &exclusionFilters,
|
||||
const QVariant &additionalParameters) const
|
||||
{
|
||||
return new SubDirFileIterator({additionalParameters.toString()},
|
||||
return new SubDirFileIterator({FilePath::fromVariant(additionalParameters)},
|
||||
nameFilters,
|
||||
exclusionFilters,
|
||||
EditorManager::defaultTextCodec());
|
||||
@@ -67,7 +67,7 @@ FileIterator *FindInFiles::files(const QStringList &nameFilters,
|
||||
|
||||
QVariant FindInFiles::additionalParameters() const
|
||||
{
|
||||
return QVariant::fromValue(path().toString());
|
||||
return path().toVariant();
|
||||
}
|
||||
|
||||
QString FindInFiles::label() const
|
||||
|
||||
@@ -3,7 +3,6 @@
|
||||
|
||||
#include "findinopenfiles.h"
|
||||
#include "textdocument.h"
|
||||
#include "texteditor.h"
|
||||
|
||||
#include <utils/filesearch.h>
|
||||
#include <coreplugin/icore.h>
|
||||
@@ -40,13 +39,13 @@ Utils::FileIterator *FindInOpenFiles::files(const QStringList &nameFilters,
|
||||
Q_UNUSED(nameFilters)
|
||||
Q_UNUSED(exclusionFilters)
|
||||
Q_UNUSED(additionalParameters)
|
||||
QMap<QString, QTextCodec *> openEditorEncodings
|
||||
QMap<Utils::FilePath, QTextCodec *> openEditorEncodings
|
||||
= TextDocument::openedTextDocumentEncodings();
|
||||
QStringList fileNames;
|
||||
Utils::FilePaths fileNames;
|
||||
QList<QTextCodec *> codecs;
|
||||
const QList<Core::DocumentModel::Entry *> entries = Core::DocumentModel::entries();
|
||||
for (Core::DocumentModel::Entry *entry : entries) {
|
||||
QString fileName = entry->fileName().toString();
|
||||
const Utils::FilePath fileName = entry->fileName();
|
||||
if (!fileName.isEmpty()) {
|
||||
fileNames.append(fileName);
|
||||
QTextCodec *codec = openEditorEncodings.value(fileName);
|
||||
|
||||
@@ -235,29 +235,29 @@ TextDocument::~TextDocument()
|
||||
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();
|
||||
for (IDocument *document : documents) {
|
||||
auto textEditorDocument = qobject_cast<TextDocument *>(document);
|
||||
if (!textEditorDocument)
|
||||
continue;
|
||||
QString fileName = textEditorDocument->filePath().toString();
|
||||
const FilePath fileName = textEditorDocument->filePath();
|
||||
workingCopy[fileName] = textEditorDocument->plainText();
|
||||
}
|
||||
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();
|
||||
for (IDocument *document : documents) {
|
||||
auto textEditorDocument = qobject_cast<TextDocument *>(document);
|
||||
if (!textEditorDocument)
|
||||
continue;
|
||||
QString fileName = textEditorDocument->filePath().toString();
|
||||
const FilePath fileName = textEditorDocument->filePath();
|
||||
workingCopy[fileName] = const_cast<QTextCodec *>(textEditorDocument->codec());
|
||||
}
|
||||
return workingCopy;
|
||||
|
||||
@@ -49,8 +49,8 @@ public:
|
||||
explicit TextDocument(Utils::Id id = Utils::Id());
|
||||
~TextDocument() override;
|
||||
|
||||
static QMap<QString, QString> openedTextDocumentContents();
|
||||
static QMap<QString, QTextCodec *> openedTextDocumentEncodings();
|
||||
static QMap<Utils::FilePath, QString> openedTextDocumentContents();
|
||||
static QMap<Utils::FilePath, QTextCodec *> openedTextDocumentEncodings();
|
||||
static TextDocument *currentTextDocument();
|
||||
static TextDocument *textDocumentForFilePath(const Utils::FilePath &filePath);
|
||||
|
||||
|
||||
@@ -864,8 +864,8 @@ void TextEditorWidgetFind::selectAll(const QString &txt, FindFlags findFlags)
|
||||
m_editor->setFocus();
|
||||
});
|
||||
|
||||
const QString &fileName = m_editor->textDocument()->filePath().toString();
|
||||
QMap<QString, QString> fileToContentsMap;
|
||||
const FilePath &fileName = m_editor->textDocument()->filePath();
|
||||
QMap<FilePath, QString> fileToContentsMap;
|
||||
fileToContentsMap[fileName] = m_editor->textDocument()->plainText();
|
||||
|
||||
FileListIterator *it = new FileListIterator({fileName},
|
||||
@@ -6368,10 +6368,10 @@ void TextEditorWidgetPrivate::highlightSearchResultsInScrollBar()
|
||||
|
||||
const QTextDocument::FindFlags findFlags = textDocumentFlagsForFindFlags(m_findFlags);
|
||||
|
||||
const QString &fileName = m_document->filePath().toString();
|
||||
const FilePath &fileName = m_document->filePath();
|
||||
FileListIterator *it =
|
||||
new FileListIterator({fileName} , {const_cast<QTextCodec *>(m_document->codec())});
|
||||
QMap<QString, QString> fileToContentsMap;
|
||||
QMap<FilePath, QString> fileToContentsMap;
|
||||
fileToContentsMap[fileName] = m_document->plainText();
|
||||
|
||||
if (m_findFlags & FindRegularExpression)
|
||||
|
||||
@@ -31,7 +31,10 @@ namespace {
|
||||
const QString &term,
|
||||
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;
|
||||
QSignalSpy ready(&watcher, SIGNAL(resultsReadyAt(int,int)));
|
||||
if (regexp == tst_FileSearch::NoRegExp)
|
||||
|
||||
Reference in New Issue
Block a user