forked from qt-creator/qt-creator
qmake: Introduce tree structure into QmakePriFiles
Change-Id: I0071c54a08d4775a34ab91e61be25f98352a5ed0 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -216,6 +216,7 @@ Q_LOGGING_CATEGORY(qmakeParse, "qtc.qmake.parsing");
|
||||
uint qHash(Variable key, uint seed) { return ::qHash(static_cast<int>(key), seed); }
|
||||
|
||||
namespace Internal {
|
||||
|
||||
class QmakeEvalInput
|
||||
{
|
||||
public:
|
||||
@@ -293,9 +294,20 @@ FileName QmakePriFile::directoryPath() const
|
||||
return filePath().parentDir();
|
||||
}
|
||||
|
||||
QmakePriFile *QmakePriFile::parent() const
|
||||
{
|
||||
return m_parent;
|
||||
}
|
||||
|
||||
QVector<QmakePriFile *> QmakePriFile::children() const
|
||||
{
|
||||
return m_children;
|
||||
}
|
||||
|
||||
QmakePriFile::~QmakePriFile()
|
||||
{
|
||||
watchFolders(QSet<QString>());
|
||||
qDeleteAll(m_children);
|
||||
}
|
||||
|
||||
void QmakePriFile::scheduleUpdate()
|
||||
@@ -419,10 +431,6 @@ void QmakePriFile::processValues(QmakePriFileEvalResult &result)
|
||||
|
||||
void QmakePriFile::update(const Internal::QmakePriFileEvalResult &result)
|
||||
{
|
||||
// add project file node
|
||||
if (fileNodes().isEmpty())
|
||||
addNode(new FileNode(filePath(), FileType::Project, false));
|
||||
|
||||
m_recursiveEnumerateFiles = result.recursiveEnumerateFiles;
|
||||
watchFolders(result.folders.toSet());
|
||||
|
||||
@@ -958,6 +966,20 @@ void QmakePriFile::changeFiles(const QString &mimeType,
|
||||
includeFile->deref();
|
||||
}
|
||||
|
||||
void QmakePriFile::addChild(QmakePriFile *pf)
|
||||
{
|
||||
QTC_ASSERT(!m_children.contains(pf), return);
|
||||
QTC_ASSERT(!pf->parent(), return);
|
||||
m_children.append(pf);
|
||||
pf->setParent(this);
|
||||
}
|
||||
|
||||
void QmakePriFile::setParent(QmakePriFile *p)
|
||||
{
|
||||
QTC_ASSERT(!m_parent, return);
|
||||
m_parent = p;
|
||||
}
|
||||
|
||||
bool QmakePriFile::setProVariable(const QString &var, const QStringList &values, const QString &scope, int flags)
|
||||
{
|
||||
if (!prepareForChange())
|
||||
@@ -1748,9 +1770,9 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
|
||||
for (QmakeIncludedPriFile *priFile : tree->children) {
|
||||
// Loop preventation, make sure that exact same node is not in our parent chain
|
||||
bool loop = false;
|
||||
Node *n = pn;
|
||||
while ((n = n->parentFolderNode())) {
|
||||
if (dynamic_cast<QmakePriFile *>(n) && n->filePath() == priFile->name) {
|
||||
QmakePriFile *n = pn;
|
||||
while ((n = n->parent())) {
|
||||
if (n->filePath() == priFile->name) {
|
||||
loop = true;
|
||||
break;
|
||||
}
|
||||
@@ -1761,14 +1783,14 @@ void QmakeProFile::applyEvaluate(QmakeEvalResult *evalResult)
|
||||
|
||||
if (priFile->proFile) {
|
||||
QmakePriFile *qmakePriFileNode = new QmakePriFile(m_project, this, priFile->name);
|
||||
pn->addNode(qmakePriFileNode);
|
||||
pn->addChild(qmakePriFileNode);
|
||||
qmakePriFileNode->setIncludedInExactParse(
|
||||
(result->state == QmakeEvalResult::EvalOk) && pn->includedInExactParse());
|
||||
qmakePriFileNode->update(priFile->result);
|
||||
toCompare.append(qMakePair(qmakePriFileNode, priFile));
|
||||
} else {
|
||||
QmakeProFile *qmakeProFileNode = new QmakeProFile(m_project, priFile->name);
|
||||
pn->addNode(qmakeProFileNode);
|
||||
pn->addChild(qmakeProFileNode);
|
||||
qmakeProFileNode->setIncludedInExactParse(
|
||||
result->exactSubdirs.contains(qmakeProFileNode->filePath())
|
||||
&& pn->includedInExactParse());
|
||||
|
||||
@@ -101,7 +101,6 @@ enum class Variable {
|
||||
uint qHash(Variable key, uint seed = 0);
|
||||
|
||||
namespace Internal {
|
||||
|
||||
class QmakeEvalInput;
|
||||
class QmakeEvalResult;
|
||||
class QmakePriFileEvalResult;
|
||||
@@ -119,6 +118,9 @@ public:
|
||||
Utils::FileName filePath() const;
|
||||
Utils::FileName directoryPath() const;
|
||||
|
||||
QmakePriFile *parent() const;
|
||||
QVector<QmakePriFile *> children() const;
|
||||
|
||||
void update(const Internal::QmakePriFileEvalResult &result);
|
||||
|
||||
// ProjectNode interface
|
||||
@@ -181,8 +183,11 @@ protected:
|
||||
ChangeType change,
|
||||
Change mode = Change::Save);
|
||||
|
||||
void addChild(QmakePriFile *pf);
|
||||
|
||||
private:
|
||||
void setParent(QmakePriFile *p);
|
||||
|
||||
bool prepareForChange();
|
||||
static bool ensureWriteableProFile(const QString &file);
|
||||
static QPair<ProFile *, QStringList> readProFile(const QString &file);
|
||||
@@ -206,6 +211,8 @@ private:
|
||||
|
||||
QmakeProject *m_project = nullptr;
|
||||
QmakeProFile *m_qmakeProFile = nullptr;
|
||||
QmakePriFile *m_parent = nullptr;
|
||||
QVector<QmakePriFile *> m_children;
|
||||
|
||||
std::unique_ptr<Core::IDocument> m_priFileDocument;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user