forked from qt-creator/qt-creator
Qmake: Make finding pro-files fast
Finding the right pro-file was surprisingly slow. Make that fast again. Task-number: QTCREATORBUG-19131 Change-Id: I4b5a8887cb13c36273a553f935a00d87cee4a7b5 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
@@ -44,20 +44,21 @@ namespace QmakeProjectManager {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
QmakePriFileNode::QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
QmakePriFileNode::QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
||||||
const FileName &filePath) :
|
const FileName &filePath, QmakePriFile *pf) :
|
||||||
ProjectNode(filePath),
|
ProjectNode(filePath),
|
||||||
m_project(project),
|
m_project(project),
|
||||||
m_qmakeProFileNode(qmakeProFileNode)
|
m_qmakeProFileNode(qmakeProFileNode),
|
||||||
|
m_qmakePriFile(pf)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
QmakePriFile *QmakePriFileNode::priFile() const
|
QmakePriFile *QmakePriFileNode::priFile() const
|
||||||
{
|
{
|
||||||
return m_project->rootProFile()->findPriFile(filePath());
|
return m_qmakePriFile;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QmakePriFileNode::deploysFolder(const QString &folder) const
|
bool QmakePriFileNode::deploysFolder(const QString &folder) const
|
||||||
{
|
{
|
||||||
QmakePriFile *pri = priFile();
|
const QmakePriFile *pri = priFile();
|
||||||
return pri ? pri->deploysFolder(folder) : false;
|
return pri ? pri->deploysFolder(folder) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,7 +146,7 @@ bool QmakePriFileNode::supportsAction(ProjectAction action, const Node *node) co
|
|||||||
|
|
||||||
bool QmakePriFileNode::canAddSubProject(const QString &proFilePath) const
|
bool QmakePriFileNode::canAddSubProject(const QString &proFilePath) const
|
||||||
{
|
{
|
||||||
QmakePriFile *pri = priFile();
|
const QmakePriFile *pri = priFile();
|
||||||
return pri ? pri->canAddSubProject(proFilePath) : false;
|
return pri ? pri->canAddSubProject(proFilePath) : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -213,8 +214,8 @@ QmakeProFileNode *QmakeProFileNode::findProFileFor(const FileName &fileName) con
|
|||||||
\class QmakeProFileNode
|
\class QmakeProFileNode
|
||||||
Implements abstract ProjectNode class
|
Implements abstract ProjectNode class
|
||||||
*/
|
*/
|
||||||
QmakeProFileNode::QmakeProFileNode(QmakeProject *project, const FileName &filePath) :
|
QmakeProFileNode::QmakeProFileNode(QmakeProject *project, const FileName &filePath, QmakeProFile *pf) :
|
||||||
QmakePriFileNode(project, this, filePath)
|
QmakePriFileNode(project, this, filePath, pf)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
bool QmakeProFileNode::showInSimpleTree() const
|
bool QmakeProFileNode::showInSimpleTree() const
|
||||||
@@ -224,7 +225,7 @@ bool QmakeProFileNode::showInSimpleTree() const
|
|||||||
|
|
||||||
QmakeProFile *QmakeProFileNode::proFile() const
|
QmakeProFile *QmakeProFileNode::proFile() const
|
||||||
{
|
{
|
||||||
return m_project->rootProFile()->findProFile(filePath());
|
return static_cast<QmakeProFile*>(QmakePriFileNode::priFile());
|
||||||
}
|
}
|
||||||
|
|
||||||
FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const
|
FolderNode::AddNewInformation QmakeProFileNode::addNewInformation(const QStringList &files, Node *context) const
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ class QMAKEPROJECTMANAGER_EXPORT QmakePriFileNode : public ProjectExplorer::Proj
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
QmakePriFileNode(QmakeProject *project, QmakeProFileNode *qmakeProFileNode,
|
||||||
const Utils::FileName &filePath);
|
const Utils::FileName &filePath, QmakePriFile *pf);
|
||||||
|
|
||||||
QmakePriFile *priFile() const;
|
QmakePriFile *priFile() const;
|
||||||
|
|
||||||
@@ -73,13 +73,14 @@ protected:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
QmakeProFileNode *m_qmakeProFileNode = nullptr;
|
QmakeProFileNode *m_qmakeProFileNode = nullptr;
|
||||||
|
QmakePriFile *m_qmakePriFile = nullptr;
|
||||||
};
|
};
|
||||||
|
|
||||||
// Implements ProjectNode for qmake .pro files
|
// Implements ProjectNode for qmake .pro files
|
||||||
class QMAKEPROJECTMANAGER_EXPORT QmakeProFileNode : public QmakePriFileNode
|
class QMAKEPROJECTMANAGER_EXPORT QmakeProFileNode : public QmakePriFileNode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
QmakeProFileNode(QmakeProject *project, const Utils::FileName &filePath);
|
QmakeProFileNode(QmakeProject *project, const Utils::FileName &filePath, QmakeProFile *pf);
|
||||||
|
|
||||||
QmakeProFile *proFile() const;
|
QmakeProFile *proFile() const;
|
||||||
|
|
||||||
|
|||||||
@@ -183,12 +183,12 @@ static void createTree(const QmakePriFile *pri, QmakePriFileNode *node, const Fi
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Virtual folders:
|
// Virtual folders:
|
||||||
for (const QmakePriFile *c : pri->children()) {
|
for (QmakePriFile *c : pri->children()) {
|
||||||
QmakePriFileNode *newNode = nullptr;
|
QmakePriFileNode *newNode = nullptr;
|
||||||
if (dynamic_cast<const QmakeProFile *>(c))
|
if (auto pf = dynamic_cast<QmakeProFile *>(c))
|
||||||
newNode = new QmakeProFileNode(c->project(), c->filePath());
|
newNode = new QmakeProFileNode(c->project(), c->filePath(), pf);
|
||||||
else
|
else
|
||||||
newNode = new QmakePriFileNode(c->project(), node->proFileNode(), c->filePath());
|
newNode = new QmakePriFileNode(c->project(), node->proFileNode(), c->filePath(), c);
|
||||||
createTree(c, newNode, toExclude);
|
createTree(c, newNode, toExclude);
|
||||||
node->addNode(newNode);
|
node->addNode(newNode);
|
||||||
}
|
}
|
||||||
@@ -203,7 +203,7 @@ QmakeProFileNode *QmakeNodeTreeBuilder::buildTree(QmakeProject *project)
|
|||||||
|
|
||||||
const FileNameList toExclude = qt ? qt->directoriesToIgnoreInProjectTree() : FileNameList();
|
const FileNameList toExclude = qt ? qt->directoriesToIgnoreInProjectTree() : FileNameList();
|
||||||
|
|
||||||
auto root = new QmakeProFileNode(project, project->projectFilePath());
|
auto root = new QmakeProFileNode(project, project->projectFilePath(), project->rootProFile());
|
||||||
createTree(project->rootProFile(), root, toExclude);
|
createTree(project->rootProFile(), root, toExclude);
|
||||||
|
|
||||||
return root;
|
return root;
|
||||||
|
|||||||
@@ -199,12 +199,14 @@ QmakePriFile *QmakePriFile::findPriFile(const FileName &fileName)
|
|||||||
{
|
{
|
||||||
if (fileName == filePath())
|
if (fileName == filePath())
|
||||||
return this;
|
return this;
|
||||||
for (QmakePriFile *n : children()) {
|
return findOrDefault(m_children, [&fileName](QmakePriFile *pf) { return pf->findPriFile(fileName); });
|
||||||
if (QmakePriFile *result = n->findPriFile(fileName))
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
return nullptr;
|
|
||||||
|
|
||||||
|
const QmakePriFile *QmakePriFile::findPriFile(const FileName &fileName) const
|
||||||
|
{
|
||||||
|
if (fileName == filePath())
|
||||||
|
return this;
|
||||||
|
return findOrDefault(m_children, [&fileName](const QmakePriFile *pf) { return pf->findPriFile(fileName); });
|
||||||
}
|
}
|
||||||
|
|
||||||
void QmakePriFile::makeEmpty()
|
void QmakePriFile::makeEmpty()
|
||||||
@@ -1010,6 +1012,11 @@ QmakeProFile *QmakeProFile::findProFile(const FileName &fileName)
|
|||||||
return dynamic_cast<QmakeProFile *>(findPriFile(fileName));
|
return dynamic_cast<QmakeProFile *>(findPriFile(fileName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const QmakeProFile *QmakeProFile::findProFile(const FileName &fileName) const
|
||||||
|
{
|
||||||
|
return dynamic_cast<const QmakeProFile *>(findPriFile(fileName));
|
||||||
|
}
|
||||||
|
|
||||||
QString QmakeProFile::makefile() const
|
QString QmakeProFile::makefile() const
|
||||||
{
|
{
|
||||||
return singleVariableValue(Variable::Makefile);
|
return singleVariableValue(Variable::Makefile);
|
||||||
|
|||||||
@@ -121,6 +121,7 @@ public:
|
|||||||
QVector<QmakePriFile *> children() const;
|
QVector<QmakePriFile *> children() const;
|
||||||
|
|
||||||
QmakePriFile *findPriFile(const Utils::FileName &fileName);
|
QmakePriFile *findPriFile(const Utils::FileName &fileName);
|
||||||
|
const QmakePriFile *findPriFile(const Utils::FileName &fileName) const;
|
||||||
|
|
||||||
bool knowsFile(const Utils::FileName &filePath) const;
|
bool knowsFile(const Utils::FileName &filePath) const;
|
||||||
|
|
||||||
@@ -280,6 +281,7 @@ public:
|
|||||||
|
|
||||||
QList<QmakeProFile *> allProFiles();
|
QList<QmakeProFile *> allProFiles();
|
||||||
QmakeProFile *findProFile(const Utils::FileName &fileName);
|
QmakeProFile *findProFile(const Utils::FileName &fileName);
|
||||||
|
const QmakeProFile *findProFile(const Utils::FileName &fileName) const;
|
||||||
|
|
||||||
ProjectType projectType() const;
|
ProjectType projectType() const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user