forked from qt-creator/qt-creator
ModelEditor: Do not query all files in the project for their mime type
Consulting the mime type database is much too expensive to do it for all files in a project, so take a shortcut. Example benchmark: When loading the Qt Creator super project (with all the commercial plugins) on my Linux machine, with this patch the time spent in ModelIndexer::scanProject() goes down from ~8 seconds to under 300 milliseconds. Note that the UI is frozen during that period. Task-number: QTCREATORBUG-18533 Change-Id: Id75d6bbcf37b4f4e41383a089e9e0dc5262cfbae Reviewed-by: hjk <hjk@qt.io> Reviewed-by: Jochen Becher <jochen_becher@gmx.de>
This commit is contained in:
@@ -399,17 +399,20 @@ void ModelIndexer::scanProject(ProjectExplorer::Project *project)
|
||||
QQueue<QueuedFile> filesQueue;
|
||||
QSet<QueuedFile> filesSet;
|
||||
|
||||
for (const Utils::FilePath &file : files) {
|
||||
QFileInfo fileInfo = file.toFileInfo();
|
||||
Utils::MimeType mimeType = Utils::mimeTypeForFile(fileInfo);
|
||||
if (mimeType.name() == QLatin1String(Constants::MIME_TYPE_MODEL)) {
|
||||
QueuedFile queuedFile(file.toString(), project, fileInfo.lastModified());
|
||||
filesQueue.append(queuedFile);
|
||||
filesSet.insert(queuedFile);
|
||||
const Utils::MimeType modelMimeType = Utils::mimeTypeForName(Constants::MIME_TYPE_MODEL);
|
||||
if (modelMimeType.isValid()) {
|
||||
for (const Utils::FilePath &file : files) {
|
||||
const QFileInfo fileInfo = file.toFileInfo();
|
||||
if (modelMimeType.suffixes().contains(fileInfo.completeSuffix())) {
|
||||
QueuedFile queuedFile(file.toString(), project, fileInfo.lastModified());
|
||||
filesQueue.append(queuedFile);
|
||||
filesSet.insert(queuedFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QString defaultModelFile = findFirstModel(project->rootProjectNode());
|
||||
// FIXME: This potentially iterates over all files again.
|
||||
QString defaultModelFile = findFirstModel(project->rootProjectNode(), modelMimeType);
|
||||
|
||||
bool filesAreQueued = false;
|
||||
{
|
||||
@@ -460,15 +463,17 @@ void ModelIndexer::scanProject(ProjectExplorer::Project *project)
|
||||
emit filesQueued();
|
||||
}
|
||||
|
||||
QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode)
|
||||
QString ModelIndexer::findFirstModel(ProjectExplorer::FolderNode *folderNode,
|
||||
const Utils::MimeType &mimeType)
|
||||
{
|
||||
if (!mimeType.isValid())
|
||||
return QString();
|
||||
foreach (ProjectExplorer::FileNode *fileNode, folderNode->fileNodes()) {
|
||||
Utils::MimeType mimeType = Utils::mimeTypeForFile(fileNode->filePath().toFileInfo());
|
||||
if (mimeType.name() == QLatin1String(Constants::MIME_TYPE_MODEL))
|
||||
if (mimeType.suffixes().contains(fileNode->filePath().toFileInfo().completeSuffix()))
|
||||
return fileNode->filePath().toString();
|
||||
}
|
||||
foreach (ProjectExplorer::FolderNode *subFolderNode, folderNode->folderNodes()) {
|
||||
QString modelFileName = findFirstModel(subFolderNode);
|
||||
QString modelFileName = findFirstModel(subFolderNode, mimeType);
|
||||
if (!modelFileName.isEmpty())
|
||||
return modelFileName;
|
||||
}
|
||||
|
@@ -34,6 +34,8 @@ class Project;
|
||||
class FolderNode;
|
||||
}
|
||||
|
||||
namespace Utils { class MimeType; }
|
||||
|
||||
namespace ModelEditor {
|
||||
namespace Internal {
|
||||
|
||||
@@ -72,7 +74,8 @@ private:
|
||||
|
||||
private:
|
||||
void scanProject(ProjectExplorer::Project *project);
|
||||
QString findFirstModel(ProjectExplorer::FolderNode *folderNode);
|
||||
QString findFirstModel(ProjectExplorer::FolderNode *folderNode,
|
||||
const Utils::MimeType &mimeType);
|
||||
void forgetProject(ProjectExplorer::Project *project);
|
||||
void removeModelFile(const QString &file, ProjectExplorer::Project *project);
|
||||
void removeDiagramReferenceFile(const QString &file, ProjectExplorer::Project *project);
|
||||
|
Reference in New Issue
Block a user