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