Project: Add setRootProjectNode method

Add setRootProjectNode method and a default implementation of
rootProjectNode to Project. Use that in all derived classes.

Change-Id: Id28cde04457a20a8963d43020785ef9d77fea57c
Reviewed-by: Niels Weber <niels.weber@theqtcompany.com>
Reviewed-by: Tobias Hunger <tobias.hunger@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2016-01-08 12:49:00 +01:00
parent 219b2d9c16
commit d144ea58e0
28 changed files with 101 additions and 159 deletions

View File

@@ -78,24 +78,18 @@ AutotoolsProject::AutotoolsProject(AutotoolsManager *manager, const QString &fil
setId(Constants::AUTOTOOLS_PROJECT_ID); setId(Constants::AUTOTOOLS_PROJECT_ID);
setProjectManager(manager); setProjectManager(manager);
setDocument(new AutotoolsProjectFile(fileName)); setDocument(new AutotoolsProjectFile(fileName));
m_rootNode = new AutotoolsProjectNode(projectFilePath()); setRootProjectNode(new AutotoolsProjectNode(projectFilePath()));
setProjectContext(Core::Context(Constants::PROJECT_CONTEXT)); setProjectContext(Core::Context(Constants::PROJECT_CONTEXT));
setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
const QFileInfo fileInfo = projectFilePath().toFileInfo(); const QFileInfo fileInfo = projectFilePath().toFileInfo();
m_projectName = fileInfo.absoluteDir().dirName(); m_projectName = fileInfo.absoluteDir().dirName();
m_rootNode->setDisplayName(fileInfo.absoluteDir().dirName()); rootProjectNode()->setDisplayName(m_projectName);
} }
AutotoolsProject::~AutotoolsProject() AutotoolsProject::~AutotoolsProject()
{ {
// Although ProjectExplorer::ProjectNode is a QObject, the ctor setRootProjectNode(0);
// does not allow to specify the parent. Manually setting the
// parent would be possible, but we use the same approach as in the
// other project managers and delete the node manually (TBD).
//
delete m_rootNode;
m_rootNode = 0;
if (m_makefileParserThread != 0) { if (m_makefileParserThread != 0) {
m_makefileParserThread->wait(); m_makefileParserThread->wait();
@@ -114,11 +108,6 @@ QString AutotoolsProject::defaultBuildDirectory(const QString &projectPath)
return QFileInfo(projectPath).absolutePath(); return QFileInfo(projectPath).absolutePath();
} }
ProjectNode *AutotoolsProject::rootProjectNode() const
{
return m_rootNode;
}
QStringList AutotoolsProject::files(FilesMode fileMode) const QStringList AutotoolsProject::files(FilesMode fileMode) const
{ {
Q_UNUSED(fileMode); Q_UNUSED(fileMode);
@@ -261,7 +250,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
// This allows to reuse existing nodes and to remove obsolete // This allows to reuse existing nodes and to remove obsolete
// nodes later. // nodes later.
QHash<QString, Node *> nodeHash; QHash<QString, Node *> nodeHash;
foreach (Node * node, nodes(m_rootNode)) foreach (Node *node, nodes(rootProjectNode()))
nodeHash.insert(node->filePath().toString(), node); nodeHash.insert(node->filePath().toString(), node);
// Add the sources to the filenode project tree. Sources // Add the sources to the filenode project tree. Sources
@@ -291,7 +280,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
parentFolder = insertFolderNode(QDir(subDir), nodeHash); parentFolder = insertFolderNode(QDir(subDir), nodeHash);
if (parentFolder == 0) { if (parentFolder == 0) {
// No node gets created for the root folder // No node gets created for the root folder
parentFolder = m_rootNode; parentFolder = rootProjectNode();
} }
} }
QTC_ASSERT(parentFolder, return); QTC_ASSERT(parentFolder, return);
@@ -332,7 +321,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
FolderNode *grandParent = parent->parentFolderNode(); FolderNode *grandParent = parent->parentFolderNode();
grandParent->removeFolderNodes(QList<FolderNode *>() << parent); grandParent->removeFolderNodes(QList<FolderNode *>() << parent);
parent = grandParent; parent = grandParent;
if (parent == m_rootNode) if (parent == rootProjectNode())
break; break;
} }
} }
@@ -343,7 +332,7 @@ void AutotoolsProject::buildFileNodeTree(const QDir &directory,
FolderNode *AutotoolsProject::insertFolderNode(const QDir &nodeDir, QHash<QString, Node *> &nodes) FolderNode *AutotoolsProject::insertFolderNode(const QDir &nodeDir, QHash<QString, Node *> &nodes)
{ {
const Utils::FileName nodePath = Utils::FileName::fromString(nodeDir.absolutePath()); const Utils::FileName nodePath = Utils::FileName::fromString(nodeDir.absolutePath());
QFileInfo rootInfo = m_rootNode->filePath().toFileInfo(); QFileInfo rootInfo = rootProjectNode()->filePath().toFileInfo();
const Utils::FileName rootPath = Utils::FileName::fromString(rootInfo.absolutePath()); const Utils::FileName rootPath = Utils::FileName::fromString(rootInfo.absolutePath());
// Do not create a folder for the root node // Do not create a folder for the root node
@@ -356,7 +345,7 @@ FolderNode *AutotoolsProject::insertFolderNode(const QDir &nodeDir, QHash<QStrin
// Get parent-folder. If it does not exist, create it recursively. // Get parent-folder. If it does not exist, create it recursively.
// Take care that the m_rootNode is considered as top folder. // Take care that the m_rootNode is considered as top folder.
FolderNode *parentFolder = m_rootNode; FolderNode *parentFolder = rootProjectNode();
if ((rootPath != folder->filePath()) && dir.cdUp()) { if ((rootPath != folder->filePath()) && dir.cdUp()) {
const QString parentDir = dir.absolutePath(); const QString parentDir = dir.absolutePath();
if (!nodes.contains(parentDir)) { if (!nodes.contains(parentDir)) {

View File

@@ -74,7 +74,6 @@ public:
~AutotoolsProject() override; ~AutotoolsProject() override;
QString displayName() const override; QString displayName() const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override;
QStringList files(FilesMode fileMode) const override; QStringList files(FilesMode fileMode) const override;
static QString defaultBuildDirectory(const QString &projectPath); static QString defaultBuildDirectory(const QString &projectPath);
QStringList buildTargets() const; QStringList buildTargets() const;
@@ -140,9 +139,6 @@ private:
/// Return value for AutotoolsProject::files() /// Return value for AutotoolsProject::files()
QStringList m_files; QStringList m_files;
/// Return value for AutotoolsProject::rootProjectNode()
AutotoolsProjectNode *m_rootNode;
/// Watches project files for changes. /// Watches project files for changes.
Utils::FileSystemWatcher *m_fileWatcher; Utils::FileSystemWatcher *m_fileWatcher;
QStringList m_watchedFiles; QStringList m_watchedFiles;

View File

@@ -88,16 +88,16 @@ using namespace Utils;
\class CMakeProject \class CMakeProject
*/ */
CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) : CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) :
m_rootNode(new CMakeProjectNode(fileName)),
m_watcher(new QFileSystemWatcher(this)) m_watcher(new QFileSystemWatcher(this))
{ {
setId(Constants::CMAKEPROJECT_ID); setId(Constants::CMAKEPROJECT_ID);
setProjectManager(manager); setProjectManager(manager);
setDocument(new CMakeFile(fileName)); setDocument(new CMakeFile(fileName));
setRootProjectNode(new CMakeProjectNode(fileName));
setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT)); setProjectContext(Core::Context(CMakeProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguages(Core::Context(ProjectExplorer::Constants::LANG_CXX));
m_rootNode->setDisplayName(fileName.parentDir().fileName()); rootProjectNode()->setDisplayName(fileName.parentDir().fileName());
connect(this, &CMakeProject::buildTargetsChanged, this, &CMakeProject::updateRunConfigurations); connect(this, &CMakeProject::buildTargetsChanged, this, &CMakeProject::updateRunConfigurations);
connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &CMakeProject::fileChanged); connect(m_watcher, &QFileSystemWatcher::fileChanged, this, &CMakeProject::fileChanged);
@@ -106,7 +106,6 @@ CMakeProject::CMakeProject(CMakeManager *manager, const FileName &fileName) :
CMakeProject::~CMakeProject() CMakeProject::~CMakeProject()
{ {
m_codeModelFuture.cancel(); m_codeModelFuture.cancel();
delete m_rootNode;
} }
void CMakeProject::fileChanged(const QString &fileName) void CMakeProject::fileChanged(const QString &fileName)
@@ -265,7 +264,7 @@ bool CMakeProject::parseCMakeLists()
Kit *k = activeTarget()->kit(); Kit *k = activeTarget()->kit();
// setFolderName // setFolderName
m_rootNode->setDisplayName(QFileInfo(cbpFile).completeBaseName()); rootProjectNode()->setDisplayName(QFileInfo(cbpFile).completeBaseName());
CMakeCbpParser cbpparser; CMakeCbpParser cbpparser;
// Parsing // Parsing
//qDebug()<<"Parsing file "<<cbpFile; //qDebug()<<"Parsing file "<<cbpFile;
@@ -282,7 +281,7 @@ bool CMakeProject::parseCMakeLists()
// how can we ensure that it is completely written? // how can we ensure that it is completely written?
m_watcher->addPath(cbpFile); m_watcher->addPath(cbpFile);
m_rootNode->setDisplayName(cbpparser.projectName()); rootProjectNode()->setDisplayName(cbpparser.projectName());
//qDebug()<<"Building Tree"; //qDebug()<<"Building Tree";
QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList(); QList<ProjectExplorer::FileNode *> fileList = cbpparser.fileList();
@@ -306,7 +305,7 @@ bool CMakeProject::parseCMakeLists()
m_files.append(fn->filePath().toString()); m_files.append(fn->filePath().toString());
m_files.sort(); m_files.sort();
buildTree(m_rootNode, fileList); buildTree(static_cast<CMakeProjectNode *>(rootProjectNode()), fileList);
//qDebug()<<"Adding Targets"; //qDebug()<<"Adding Targets";
m_buildTargets = cbpparser.buildTargets(); m_buildTargets = cbpparser.buildTargets();
@@ -506,15 +505,9 @@ ProjectExplorer::FolderNode *CMakeProject::findOrCreateFolder(CMakeProjectNode *
QString CMakeProject::displayName() const QString CMakeProject::displayName() const
{ {
return m_rootNode->displayName(); return rootProjectNode()->displayName();
} }
ProjectExplorer::ProjectNode *CMakeProject::rootProjectNode() const
{
return m_rootNode;
}
QStringList CMakeProject::files(FilesMode fileMode) const QStringList CMakeProject::files(FilesMode fileMode) const
{ {
Q_UNUSED(fileMode) Q_UNUSED(fileMode)

View File

@@ -100,8 +100,6 @@ public:
QString displayName() const override; QString displayName() const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override;
QStringList files(FilesMode fileMode) const override; QStringList files(FilesMode fileMode) const override;
QStringList buildTargetTitles(bool runnable = false) const; QStringList buildTargetTitles(bool runnable = false) const;
QList<CMakeBuildTarget> buildTargets() const; QList<CMakeBuildTarget> buildTargets() const;
@@ -149,7 +147,6 @@ private:
ProjectExplorer::Target *m_activeTarget = 0; ProjectExplorer::Target *m_activeTarget = 0;
// TODO probably need a CMake specific node structure // TODO probably need a CMake specific node structure
Internal::CMakeProjectNode *m_rootNode;
QStringList m_files; QStringList m_files;
QList<CMakeBuildTarget> m_buildTargets; QList<CMakeBuildTarget> m_buildTargets;
QFileSystemWatcher *m_watcher; QFileSystemWatcher *m_watcher;

View File

@@ -50,7 +50,6 @@ public:
~TestProject() override; ~TestProject() override;
QString displayName() const override { return m_name; } QString displayName() const override { return m_name; }
ProjectExplorer::ProjectNode *rootProjectNode() const override { return 0; }
QStringList files(FilesMode fileMode) const override { Q_UNUSED(fileMode); return QStringList(); } QStringList files(FilesMode fileMode) const override { Q_UNUSED(fileMode); return QStringList(); }

View File

@@ -72,6 +72,7 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
setId(Constants::GENERICPROJECT_ID); setId(Constants::GENERICPROJECT_ID);
setProjectManager(manager); setProjectManager(manager);
setDocument(new GenericProjectFile(this, fileName, GenericProject::Everything)); setDocument(new GenericProjectFile(this, fileName, GenericProject::Everything));
setRootProjectNode(new GenericProjectNode(this));
setProjectContext(Context(GenericProjectManager::Constants::PROJECTCONTEXT)); setProjectContext(Context(GenericProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
@@ -92,8 +93,6 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
DocumentManager::addDocument(m_includesIDocument); DocumentManager::addDocument(m_includesIDocument);
DocumentManager::addDocument(m_configIDocument); DocumentManager::addDocument(m_configIDocument);
m_rootNode = new GenericProjectNode(this);
FileNode *projectFilesNode = new FileNode(Utils::FileName::fromString(m_filesFileName), FileNode *projectFilesNode = new FileNode(Utils::FileName::fromString(m_filesFileName),
ProjectFileType, ProjectFileType,
/* generated = */ false); /* generated = */ false);
@@ -106,10 +105,8 @@ GenericProject::GenericProject(Manager *manager, const QString &fileName)
ProjectFileType, ProjectFileType,
/* generated = */ false); /* generated = */ false);
m_rootNode->addFileNodes(QList<FileNode *>() rootProjectNode()->addFileNodes(QList<FileNode *>() << projectFilesNode
<< projectFilesNode << projectIncludesNode << projectConfigNode);
<< projectIncludesNode
<< projectConfigNode);
projectManager()->registerProject(this); projectManager()->registerProject(this);
} }
@@ -118,8 +115,6 @@ GenericProject::~GenericProject()
{ {
m_codeModelFuture.cancel(); m_codeModelFuture.cancel();
projectManager()->unregisterProject(this); projectManager()->unregisterProject(this);
delete m_rootNode;
} }
QString GenericProject::filesFileName() const QString GenericProject::filesFileName() const
@@ -281,7 +276,7 @@ void GenericProject::refresh(RefreshOptions options)
parseProject(options); parseProject(options);
if (options & Files) if (options & Files)
m_rootNode->refresh(oldFileList); static_cast<GenericProjectNode *>(rootProjectNode())->refresh(oldFileList);
refreshCppCodeModel(); refreshCppCodeModel();
} }
@@ -392,11 +387,6 @@ Manager *GenericProject::projectManager() const
return static_cast<Manager *>(Project::projectManager()); return static_cast<Manager *>(Project::projectManager());
} }
GenericProjectNode *GenericProject::rootProjectNode() const
{
return m_rootNode;
}
QStringList GenericProject::files(FilesMode fileMode) const QStringList GenericProject::files(FilesMode fileMode) const
{ {
Q_UNUSED(fileMode); Q_UNUSED(fileMode);

View File

@@ -63,7 +63,6 @@ public:
QString displayName() const override; QString displayName() const override;
Manager *projectManager() const override; Manager *projectManager() const override;
GenericProjectNode *rootProjectNode() const override;
QStringList files(FilesMode fileMode) const override; QStringList files(FilesMode fileMode) const override;
QStringList buildTargets() const; QStringList buildTargets() const;
@@ -109,7 +108,6 @@ private:
QStringList m_rawProjectIncludePaths; QStringList m_rawProjectIncludePaths;
QStringList m_projectIncludePaths; QStringList m_projectIncludePaths;
GenericProjectNode *m_rootNode;
QFuture<void> m_codeModelFuture; QFuture<void> m_codeModelFuture;
}; };

View File

@@ -207,7 +207,7 @@ QString IosRunConfiguration::applicationName() const
QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project()); QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project());
const QmakeProFileNode *node = 0; const QmakeProFileNode *node = 0;
if (pro) if (pro)
node = pro->rootQmakeProjectNode(); node = pro->rootProjectNode();
if (node) if (node)
node = node->findProFileFor(profilePath()); node = node->findProFileFor(profilePath());
if (node) { if (node) {
@@ -233,7 +233,7 @@ FileName IosRunConfiguration::bundleDirectory() const
QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project()); QmakeProject *pro = qobject_cast<QmakeProject *>(target()->project());
const QmakeProFileNode *node = 0; const QmakeProFileNode *node = 0;
if (pro) if (pro)
node = pro->rootQmakeProjectNode(); node = pro->rootProjectNode();
if (node) if (node)
node = node->findProFileFor(profilePath()); node = node->findProFileFor(profilePath());
if (node) { if (node) {

View File

@@ -36,6 +36,7 @@
#include "editorconfiguration.h" #include "editorconfiguration.h"
#include "kit.h" #include "kit.h"
#include "projectexplorer.h" #include "projectexplorer.h"
#include "projectnodes.h"
#include "target.h" #include "target.h"
#include "session.h" #include "session.h"
#include "settingsaccessor.h" #include "settingsaccessor.h"
@@ -95,6 +96,7 @@ public:
Core::Id m_id; Core::Id m_id;
Core::IDocument *m_document = 0; Core::IDocument *m_document = 0;
IProjectManager *m_manager = 0; IProjectManager *m_manager = 0;
ProjectNode *m_rootProjectNode = 0;
QList<Target *> m_targets; QList<Target *> m_targets;
Target *m_activeTarget = 0; Target *m_activeTarget = 0;
EditorConfiguration m_editorConfiguration; EditorConfiguration m_editorConfiguration;
@@ -111,8 +113,13 @@ public:
ProjectPrivate::~ProjectPrivate() ProjectPrivate::~ProjectPrivate()
{ {
delete m_accessor; // Make sure our root node is 0 when deleting
ProjectNode *oldNode = m_rootProjectNode;
m_rootProjectNode = 0;
delete oldNode;
delete m_document; delete m_document;
delete m_accessor;
} }
Project::Project() : d(new ProjectPrivate) Project::Project() : d(new ProjectPrivate)
@@ -432,6 +439,13 @@ void Project::setProjectManager(IProjectManager *manager)
d->m_manager = manager; d->m_manager = manager;
} }
void Project::setRootProjectNode(ProjectNode *root)
{
ProjectNode *oldNode = d->m_rootProjectNode;
d->m_rootProjectNode = root;
delete oldNode;
}
Target *Project::restoreTarget(const QVariantMap &data) Target *Project::restoreTarget(const QVariantMap &data)
{ {
Core::Id id = idFromMap(data); Core::Id id = idFromMap(data);
@@ -522,6 +536,11 @@ IProjectManager *Project::projectManager() const
return d->m_manager; return d->m_manager;
} }
ProjectNode *Project::rootProjectNode() const
{
return d->m_rootProjectNode;
}
Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage) Project::RestoreResult Project::fromMap(const QVariantMap &map, QString *errorMessage)
{ {
Q_UNUSED(errorMessage); Q_UNUSED(errorMessage);

View File

@@ -88,6 +88,8 @@ public:
virtual IProjectManager *projectManager() const; virtual IProjectManager *projectManager() const;
virtual ProjectNode *rootProjectNode() const;
bool hasActiveBuildSettings() const; bool hasActiveBuildSettings() const;
// EditorConfiguration: // EditorConfiguration:
@@ -112,8 +114,6 @@ public:
enum class RestoreResult { Ok, Error, UserAbort }; enum class RestoreResult { Ok, Error, UserAbort };
RestoreResult restoreSettings(QString *errorMessage); RestoreResult restoreSettings(QString *errorMessage);
virtual ProjectNode *rootProjectNode() const = 0;
enum FilesMode { AllFiles, ExcludeGeneratedFiles }; enum FilesMode { AllFiles, ExcludeGeneratedFiles };
virtual QStringList files(FilesMode fileMode) const = 0; virtual QStringList files(FilesMode fileMode) const = 0;
// TODO: generalize to find source(s) of generated files? // TODO: generalize to find source(s) of generated files?
@@ -175,6 +175,7 @@ protected:
void setId(Core::Id id); void setId(Core::Id id);
void setDocument(Core::IDocument *doc); // takes ownership! void setDocument(Core::IDocument *doc); // takes ownership!
void setProjectManager(IProjectManager *manager); void setProjectManager(IProjectManager *manager);
void setRootProjectNode(ProjectNode *root); // takes ownership!
void setProjectContext(Core::Context context); void setProjectContext(Core::Context context);
void setProjectLanguages(Core::Context language); void setProjectLanguages(Core::Context language);
void addProjectLanguage(Core::Id id); void addProjectLanguage(Core::Id id);

View File

@@ -251,7 +251,6 @@ public:
QString displayName() const override { return m_projectName; } QString displayName() const override { return m_projectName; }
PythonProjectManager *projectManager() const override; PythonProjectManager *projectManager() const override;
ProjectNode *rootProjectNode() const override;
QStringList files(FilesMode) const override { return m_files; } QStringList files(FilesMode) const override { return m_files; }
QStringList files() const { return m_files; } QStringList files() const { return m_files; }
@@ -274,8 +273,6 @@ private:
QStringList m_rawFileList; QStringList m_rawFileList;
QStringList m_files; QStringList m_files;
QHash<QString, QString> m_rawListEntries; QHash<QString, QString> m_rawListEntries;
ProjectNode *m_rootNode;
}; };
class PythonProjectFile : public Core::IDocument class PythonProjectFile : public Core::IDocument
@@ -620,6 +617,7 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
setProjectManager(manager); setProjectManager(manager);
setDocument(new PythonProjectFile(this, fileName)); setDocument(new PythonProjectFile(this, fileName));
DocumentManager::addDocument(document()); DocumentManager::addDocument(document());
setRootProjectNode(new PythonProjectNode(this));
setProjectContext(Context(PythonProjectContext)); setProjectContext(Context(PythonProjectContext));
setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
@@ -627,7 +625,6 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
QFileInfo fileInfo = projectFilePath().toFileInfo(); QFileInfo fileInfo = projectFilePath().toFileInfo();
m_projectName = fileInfo.completeBaseName(); m_projectName = fileInfo.completeBaseName();
m_rootNode = new PythonProjectNode(this);
projectManager()->registerProject(this); projectManager()->registerProject(this);
} }
@@ -635,8 +632,6 @@ PythonProject::PythonProject(PythonProjectManager *manager, const QString &fileN
PythonProject::~PythonProject() PythonProject::~PythonProject()
{ {
projectManager()->unregisterProject(this); projectManager()->unregisterProject(this);
delete m_rootNode;
} }
PythonProjectManager *PythonProject::projectManager() const PythonProjectManager *PythonProject::projectManager() const
@@ -775,7 +770,7 @@ private:
void PythonProject::refresh() void PythonProject::refresh()
{ {
m_rootNode->removeFileNodes(m_rootNode->fileNodes()); rootProjectNode()->removeFileNodes(rootProjectNode()->fileNodes());
parseProject(); parseProject();
QDir baseDir(projectDirectory().toString()); QDir baseDir(projectDirectory().toString());
@@ -786,7 +781,7 @@ void PythonProject::refresh()
fileNodes.append(new PythonFileNode(FileName::fromString(file), displayName)); fileNodes.append(new PythonFileNode(FileName::fromString(file), displayName));
} }
m_rootNode->addFileNodes(fileNodes); rootProjectNode()->addFileNodes(fileNodes);
} }
/** /**
@@ -844,11 +839,6 @@ QStringList PythonProject::processEntries(const QStringList &paths,
return absolutePaths; return absolutePaths;
} }
ProjectNode *PythonProject::rootProjectNode() const
{
return m_rootNode;
}
Project::RestoreResult PythonProject::fromMap(const QVariantMap &map, QString *errorMessage) Project::RestoreResult PythonProject::fromMap(const QVariantMap &map, QString *errorMessage)
{ {
Project::RestoreResult res = Project::fromMap(map, errorMessage); Project::RestoreResult res = Project::fromMap(map, errorMessage);

View File

@@ -101,7 +101,6 @@ static const char CONFIG_PRECOMPILEDHEADER[] = "precompiledHeader";
QbsProject::QbsProject(QbsManager *manager, const QString &fileName) : QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
m_projectName(QFileInfo(fileName).completeBaseName()), m_projectName(QFileInfo(fileName).completeBaseName()),
m_rootProjectNode(0),
m_qbsProjectParser(0), m_qbsProjectParser(0),
m_qbsUpdateFutureInterface(0), m_qbsUpdateFutureInterface(0),
m_parsingScheduled(false), m_parsingScheduled(false),
@@ -112,9 +111,9 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
setId(Constants::PROJECT_ID); setId(Constants::PROJECT_ID);
setProjectManager(manager); setProjectManager(manager);
setDocument(new QbsProjectFile(this, fileName)); setDocument(new QbsProjectFile(this, fileName));
DocumentManager::addDocument(document()); DocumentManager::addDocument(document());
setRootProjectNode(new QbsRootProjectNode(this));
setProjectContext(Context(Constants::PROJECT_ID)); setProjectContext(Context(Constants::PROJECT_ID));
setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX)); setProjectLanguages(Context(ProjectExplorer::Constants::LANG_CXX));
@@ -126,9 +125,6 @@ QbsProject::QbsProject(QbsManager *manager, const QString &fileName) :
connect(this, SIGNAL(environmentChanged()), this, SLOT(delayParsing())); connect(this, SIGNAL(environmentChanged()), this, SLOT(delayParsing()));
connect(&m_parsingDelay, SIGNAL(timeout()), this, SLOT(startParsing())); connect(&m_parsingDelay, SIGNAL(timeout()), this, SLOT(startParsing()));
// NOTE: QbsProjectNode does not use this as a parent!
m_rootProjectNode = new QbsRootProjectNode(this); // needs documents to be initialized!
} }
QbsProject::~QbsProject() QbsProject::~QbsProject()
@@ -141,12 +137,6 @@ QbsProject::~QbsProject()
delete m_qbsUpdateFutureInterface; delete m_qbsUpdateFutureInterface;
m_qbsUpdateFutureInterface = 0; m_qbsUpdateFutureInterface = 0;
} }
// Deleting the root node triggers a few things, make sure rootProjectNode
// returns 0 already
QbsProjectNode *root = m_rootProjectNode;
m_rootProjectNode = 0;
delete root;
} }
QString QbsProject::displayName() const QString QbsProject::displayName() const
@@ -159,9 +149,9 @@ QbsManager *QbsProject::projectManager() const
return static_cast<QbsManager *>(Project::projectManager()); return static_cast<QbsManager *>(Project::projectManager());
} }
ProjectNode *QbsProject::rootProjectNode() const QbsRootProjectNode *QbsProject::rootProjectNode() const
{ {
return m_rootProjectNode; return static_cast<QbsRootProjectNode *>(Project::rootProjectNode());
} }
static void collectFilesForProject(const qbs::ProjectData &project, QSet<QString> &result) static void collectFilesForProject(const qbs::ProjectData &project, QSet<QString> &result)
@@ -286,7 +276,7 @@ bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData),
allPaths, QFileInfo(productFilePath).absolutePath(), true); allPaths, QFileInfo(productFilePath).absolutePath(), true);
m_rootProjectNode->update(); rootProjectNode()->update();
emit fileListChanged(); emit fileListChanged();
} }
return notAdded->isEmpty(); return notAdded->isEmpty();
@@ -315,7 +305,7 @@ bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringL
m_projectData = m_qbsProject.projectData(); m_projectData = m_qbsProject.projectData();
QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths, QbsGroupNode::setupFiles(node, reRetrieveGroupData(productData, groupData), allPaths,
QFileInfo(productFilePath).absolutePath(), true); QFileInfo(productFilePath).absolutePath(), true);
m_rootProjectNode->update(); rootProjectNode()->update();
emit fileListChanged(); emit fileListChanged();
} }
return notRemoved->isEmpty(); return notRemoved->isEmpty();
@@ -454,7 +444,7 @@ void QbsProject::handleQbsParsingDone(bool success)
if (projectData != m_projectData) { if (projectData != m_projectData) {
m_projectData = projectData; m_projectData = projectData;
m_rootProjectNode->update(); rootProjectNode()->update();
updateDocuments(m_qbsProject.isValid() updateDocuments(m_qbsProject.isValid()
? m_qbsProject.buildSystemFiles() : QSet<QString>() << projectFilePath().toString()); ? m_qbsProject.buildSystemFiles() : QSet<QString>() << projectFilePath().toString());
@@ -767,7 +757,7 @@ void QbsProject::updateCppCodeModel()
foreach (const QString &file, grp.allFilePaths()) { foreach (const QString &file, grp.allFilePaths()) {
if (file.endsWith(QLatin1String(".ui"))) { if (file.endsWith(QLatin1String(".ui"))) {
QStringList generated = m_rootProjectNode->qbsProject() QStringList generated = rootProjectNode()->qbsProject()
.generatedFiles(prd, file, QStringList(QLatin1String("hpp"))); .generatedFiles(prd, file, QStringList(QLatin1String("hpp")));
if (generated.count() == 1) if (generated.count() == 1)
uiFiles.insert(file, generated.at(0)); uiFiles.insert(file, generated.at(0));

View File

@@ -33,6 +33,8 @@
#include "qbsprojectmanager.h" #include "qbsprojectmanager.h"
#include "qbsnodes.h"
#include <cpptools/cppprojects.h> #include <cpptools/cppprojects.h>
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
@@ -53,7 +55,6 @@ namespace QbsProjectManager {
namespace Internal { namespace Internal {
class QbsBaseProjectNode; class QbsBaseProjectNode;
class QbsProjectNode; class QbsProjectNode;
class QbsRootProjectNode;
class QbsProjectParser; class QbsProjectParser;
class QbsBuildConfiguration; class QbsBuildConfiguration;
@@ -67,8 +68,7 @@ public:
QString displayName() const override; QString displayName() const override;
QbsManager *projectManager() const override; QbsManager *projectManager() const override;
QbsRootProjectNode *rootProjectNode() const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override;
QStringList files(FilesMode fileMode) const override; QStringList files(FilesMode fileMode) const override;
@@ -149,7 +149,6 @@ private:
qbs::Project m_qbsProject; qbs::Project m_qbsProject;
qbs::ProjectData m_projectData; qbs::ProjectData m_projectData;
QSet<Core::IDocument *> m_qbsDocuments; QSet<Core::IDocument *> m_qbsDocuments;
QbsRootProjectNode *m_rootProjectNode;
QbsProjectParser *m_qbsProjectParser; QbsProjectParser *m_qbsProjectParser;

View File

@@ -123,7 +123,7 @@ QmakeProjectManager::QmakeProFileNode *AndroidExtraLibraryListModel::activeNode(
if (!qarc) if (!qarc)
return 0; return 0;
auto project = static_cast<QmakeProject *>(m_target->project()); auto project = static_cast<QmakeProject *>(m_target->project());
return project->rootQmakeProjectNode()->findProFileFor(qarc->proFilePath()); return project->rootProjectNode()->findProFileFor(qarc->proFilePath());
} }
void AndroidExtraLibraryListModel::proFileUpdated(QmakeProjectManager::QmakeProFileNode *node) void AndroidExtraLibraryListModel::proFileUpdated(QmakeProjectManager::QmakeProFileNode *node)

View File

@@ -211,7 +211,7 @@ CreateAndroidManifestWizard::CreateAndroidManifestWizard(ProjectExplorer::Target
const QmakeProFileNode *currentRunNode = 0; const QmakeProFileNode *currentRunNode = 0;
ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration(); ProjectExplorer::RunConfiguration *rc = target->activeRunConfiguration();
if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc))
currentRunNode = project->rootQmakeProjectNode()->findProFileFor(qrc->proFilePath()); currentRunNode = project->rootProjectNode()->findProFileFor(qrc->proFilePath());
if (nodes.isEmpty()) { if (nodes.isEmpty()) {
// oh uhm can't create anything // oh uhm can't create anything

View File

@@ -158,7 +158,7 @@ Utils::FileName QmakeAndroidBuildApkStep::androidPackageSourceDir() const
{ {
QmakeProjectManager::QmakeProject *pro = static_cast<QmakeProjectManager::QmakeProject *>(project()); QmakeProjectManager::QmakeProject *pro = static_cast<QmakeProjectManager::QmakeProject *>(project());
const QmakeProjectManager::QmakeProFileNode *node const QmakeProjectManager::QmakeProFileNode *node
= pro->rootQmakeProjectNode()->findProFileFor(proFilePathForInputFile()); = pro->rootProjectNode()->findProFileFor(proFilePathForInputFile());
if (!node) if (!node)
return Utils::FileName(); return Utils::FileName();
return Utils::FileName::fromString(node->singleVariableValue(QmakeProjectManager::AndroidPackageSourceDir)); return Utils::FileName::fromString(node->singleVariableValue(QmakeProjectManager::AndroidPackageSourceDir));
@@ -199,7 +199,7 @@ bool QmakeAndroidBuildApkStep::init(QList<const BuildStep *> &earlierSteps)
QString outputDir = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString(); QString outputDir = bc->buildDirectory().appendPath(QLatin1String(Constants::ANDROID_BUILDDIRECTORY)).toString();
const auto *pro = static_cast<QmakeProjectManager::QmakeProject *>(project()); const auto *pro = static_cast<QmakeProjectManager::QmakeProject *>(project());
const QmakeProjectManager::QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(proFilePathForInputFile()); const QmakeProjectManager::QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(proFilePathForInputFile());
m_skipBuilding = !node; m_skipBuilding = !node;
if (m_skipBuilding) if (m_skipBuilding)
return true; return true;

View File

@@ -112,7 +112,7 @@ QVariantMap QmakeAndroidRunConfiguration::toMap() const
QString QmakeAndroidRunConfiguration::defaultDisplayName() QString QmakeAndroidRunConfiguration::defaultDisplayName()
{ {
auto project = static_cast<QmakeProject *>(target()->project()); auto project = static_cast<QmakeProject *>(target()->project());
const QmakeProjectManager::QmakeProFileNode *root = project->rootQmakeProjectNode(); const QmakeProjectManager::QmakeProFileNode *root = project->rootProjectNode();
if (root) { if (root) {
const QmakeProjectManager::QmakeProFileNode *node = root->findProFileFor(m_proFilePath); const QmakeProjectManager::QmakeProFileNode *node = root->findProFileFor(m_proFilePath);
if (node) // should always be found if (node) // should always be found

View File

@@ -114,7 +114,7 @@ Utils::FileName QmakeAndroidSupport::androiddeployJsonPath(ProjectExplorer::Targ
return Utils::FileName(); return Utils::FileName();
const QmakeProFileNode *node = const QmakeProFileNode *node =
pro->rootQmakeProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile()); pro->rootProjectNode()->findProFileFor(buildApkStep->proFilePathForInputFile());
if (!node) // should never happen if (!node) // should never happen
return Utils::FileName(); return Utils::FileName();
@@ -138,7 +138,7 @@ Utils::FileName QmakeAndroidSupport::manifestSourcePath(const ProjectExplorer::T
if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) { if (auto qrc = qobject_cast<QmakeAndroidRunConfiguration *>(rc)) {
Utils::FileName proFilePath = qrc->proFilePath(); Utils::FileName proFilePath = qrc->proFilePath();
const auto project = static_cast<QmakeProjectManager::QmakeProject *>(target->project()); const auto project = static_cast<QmakeProjectManager::QmakeProject *>(target->project());
const QmakeProFileNode *node = project->rootQmakeProjectNode()->findProFileFor(proFilePath); const QmakeProFileNode *node = project->rootProjectNode()->findProFileFor(proFilePath);
if (node) { if (node) {
QString packageSource = node->singleVariableValue(AndroidPackageSourceDir); QString packageSource = node->singleVariableValue(AndroidPackageSourceDir);
if (!packageSource.isEmpty()) { if (!packageSource.isEmpty()) {

View File

@@ -352,7 +352,7 @@ bool DesktopQmakeRunConfiguration::fromMap(const QVariantMap &map)
QString DesktopQmakeRunConfiguration::executable() const QString DesktopQmakeRunConfiguration::executable() const
{ {
QmakeProject *pro = static_cast<QmakeProject *>(target()->project()); QmakeProject *pro = static_cast<QmakeProject *>(target()->project());
const QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(m_proFilePath); const QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(m_proFilePath);
return extractWorkingDirAndExecutable(node).second; return extractWorkingDirAndExecutable(node).second;
} }
@@ -399,7 +399,7 @@ QString DesktopQmakeRunConfiguration::workingDirectory() const
QString DesktopQmakeRunConfiguration::baseWorkingDirectory() const QString DesktopQmakeRunConfiguration::baseWorkingDirectory() const
{ {
QmakeProject *pro = static_cast<QmakeProject *>(target()->project()); QmakeProject *pro = static_cast<QmakeProject *>(target()->project());
const QmakeProFileNode *node = pro->rootQmakeProjectNode()->findProFileFor(m_proFilePath); const QmakeProFileNode *node = pro->rootProjectNode()->findProFileFor(m_proFilePath);
return extractWorkingDirAndExecutable(node).first; return extractWorkingDirAndExecutable(node).first;
} }
@@ -416,7 +416,7 @@ void DesktopQmakeRunConfiguration::addToBaseEnvironment(Environment &env) const
// The user could be linking to a library found via a -L/some/dir switch // The user could be linking to a library found via a -L/some/dir switch
// to find those libraries while actually running we explicitly prepend those // to find those libraries while actually running we explicitly prepend those
// dirs to the library search path // dirs to the library search path
const QmakeProFileNode *node = static_cast<QmakeProject *>(target()->project())->rootQmakeProjectNode()->findProFileFor(m_proFilePath); const QmakeProFileNode *node = static_cast<QmakeProject *>(target()->project())->rootProjectNode()->findProFileFor(m_proFilePath);
if (m_isUsingLibrarySearchPath && node) { if (m_isUsingLibrarySearchPath && node) {
const QStringList libDirectories = node->variableValue(LibDirectoriesVar); const QStringList libDirectories = node->variableValue(LibDirectoriesVar);
if (!libDirectories.isEmpty()) { if (!libDirectories.isEmpty()) {
@@ -444,7 +444,7 @@ Utils::FileName DesktopQmakeRunConfiguration::proFilePath() const
QString DesktopQmakeRunConfiguration::defaultDisplayName() QString DesktopQmakeRunConfiguration::defaultDisplayName()
{ {
auto project = static_cast<QmakeProject *>(target()->project()); auto project = static_cast<QmakeProject *>(target()->project());
const QmakeProFileNode *root = project->rootQmakeProjectNode(); const QmakeProFileNode *root = project->rootProjectNode();
if (root) { if (root) {
const QmakeProFileNode *node = root->findProFileFor(m_proFilePath); const QmakeProFileNode *node = root->findProFileFor(m_proFilePath);
if (node) // should always be found if (node) // should always be found

View File

@@ -264,7 +264,7 @@ bool MakeStep::init(QList<const BuildStep *> &earlierSteps)
appendOutputParser(new QMakeParser); // make may cause qmake to be run, add last to make sure appendOutputParser(new QMakeParser); // make may cause qmake to be run, add last to make sure
// it has a low priority. // it has a low priority.
m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootQmakeProjectNode()->projectType() == ScriptTemplate); m_scriptTarget = (static_cast<QmakeProject *>(bc->target()->project())->rootProjectNode()->projectType() == ScriptTemplate);
return AbstractProcessStep::init(earlierSteps); return AbstractProcessStep::init(earlierSteps);
} }

View File

@@ -238,7 +238,7 @@ void QmakeBuildConfiguration::setBuildDirectory(const FileName &directory)
QString QmakeBuildConfiguration::makefile() const QString QmakeBuildConfiguration::makefile() const
{ {
return static_cast<QmakeProject *>(target()->project())->rootQmakeProjectNode()->makefile(); return static_cast<QmakeProject *>(target()->project())->rootProjectNode()->makefile();
} }
BaseQtVersion::QmakeBuildConfigs QmakeBuildConfiguration::qmakeBuildConfiguration() const BaseQtVersion::QmakeBuildConfigs QmakeBuildConfiguration::qmakeBuildConfiguration() const

View File

@@ -2538,7 +2538,7 @@ QString QmakeProFileNode::sourceDir() const
QString QmakeProFileNode::buildDir(QmakeBuildConfiguration *bc) const QString QmakeProFileNode::buildDir(QmakeBuildConfiguration *bc) const
{ {
const QDir srcDirRoot = m_project->rootQmakeProjectNode()->sourceDir(); const QDir srcDirRoot = m_project->rootProjectNode()->sourceDir();
const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir); const QString relativeDir = srcDirRoot.relativeFilePath(m_projectDir);
if (!bc && m_project->activeTarget()) if (!bc && m_project->activeTarget())
bc = static_cast<QmakeBuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration()); bc = static_cast<QmakeBuildConfiguration *>(m_project->activeTarget()->activeBuildConfiguration());

View File

@@ -337,11 +337,6 @@ QmakeProject::~QmakeProject()
projectManager()->unregisterProject(this); projectManager()->unregisterProject(this);
delete m_projectFiles; delete m_projectFiles;
m_cancelEvaluate = true; m_cancelEvaluate = true;
// Deleting the root node triggers a few things, make sure rootProjectNode
// returns 0 already
QmakeProFileNode *root = m_rootProjectNode;
m_rootProjectNode = 0;
delete root;
Q_ASSERT(m_qmakeGlobalsRefCnt == 0); Q_ASSERT(m_qmakeGlobalsRefCnt == 0);
delete m_qmakeVfs; delete m_qmakeVfs;
} }
@@ -349,7 +344,7 @@ QmakeProject::~QmakeProject()
void QmakeProject::updateFileList() void QmakeProject::updateFileList()
{ {
QmakeProjectFiles newFiles; QmakeProjectFiles newFiles;
ProjectFilesVisitor::findProjectFiles(m_rootProjectNode, &newFiles); ProjectFilesVisitor::findProjectFiles(rootProjectNode(), &newFiles);
if (newFiles != *m_projectFiles) { if (newFiles != *m_projectFiles) {
*m_projectFiles = newFiles; *m_projectFiles = newFiles;
emit fileListChanged(); emit fileListChanged();
@@ -376,7 +371,7 @@ Project::RestoreResult QmakeProject::fromMap(const QVariantMap &map, QString *er
projectManager()->registerProject(this); projectManager()->registerProject(this);
m_rootProjectNode = new QmakeProFileNode(this, projectFilePath()); setRootProjectNode(new QmakeProFileNode(this, projectFilePath()));
// On active buildconfiguration changes, reevaluate the .pro files // On active buildconfiguration changes, reevaluate the .pro files
m_activeTarget = activeTarget(); m_activeTarget = activeTarget();
@@ -702,7 +697,7 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay)
m_cancelEvaluate = true; m_cancelEvaluate = true;
m_asyncUpdateState = AsyncFullUpdatePending; m_asyncUpdateState = AsyncFullUpdatePending;
enableActiveQmakeBuildConfiguration(activeTarget(), false); enableActiveQmakeBuildConfiguration(activeTarget(), false);
m_rootProjectNode->setParseInProgressRecursive(true); rootProjectNode()->setParseInProgressRecursive(true);
return; return;
} }
@@ -710,7 +705,7 @@ void QmakeProject::scheduleAsyncUpdate(QmakeProFileNode::AsyncUpdateDelay delay)
qDebug()<<" starting timer for full update, setting state to full update pending"; qDebug()<<" starting timer for full update, setting state to full update pending";
m_partialEvaluate.clear(); m_partialEvaluate.clear();
enableActiveQmakeBuildConfiguration(activeTarget(), false); enableActiveQmakeBuildConfiguration(activeTarget(), false);
m_rootProjectNode->setParseInProgressRecursive(true); rootProjectNode()->setParseInProgressRecursive(true);
m_asyncUpdateState = AsyncFullUpdatePending; m_asyncUpdateState = AsyncFullUpdatePending;
// Cancel running code model update // Cancel running code model update
@@ -805,7 +800,7 @@ void QmakeProject::asyncUpdate()
if (m_asyncUpdateState == AsyncFullUpdatePending) { if (m_asyncUpdateState == AsyncFullUpdatePending) {
if (debug) if (debug)
qDebug()<<" full update, starting with root node"; qDebug()<<" full update, starting with root node";
m_rootProjectNode->asyncUpdate(); rootProjectNode()->asyncUpdate();
} else { } else {
if (debug) if (debug)
qDebug()<<" partial update,"<<m_partialEvaluate.size()<<"nodes to update"; qDebug()<<" partial update,"<<m_partialEvaluate.size()<<"nodes to update";
@@ -883,8 +878,8 @@ QString QmakeProject::generatedUiHeader(const FileName &formFile) const
{ {
// Look in sub-profiles as SessionManager::projectForFile returns // Look in sub-profiles as SessionManager::projectForFile returns
// the top-level project only. // the top-level project only.
if (m_rootProjectNode) if (rootProjectNode())
if (const QmakeProFileNode *pro = proFileNodeOf(m_rootProjectNode, FormType, formFile)) if (const QmakeProFileNode *pro = proFileNodeOf(rootProjectNode(), FormType, formFile))
return QmakeProFileNode::uiHeaderFile( return QmakeProFileNode::uiHeaderFile(
pro->uiDirectory(Utils::FileName::fromString(pro->buildDir())), pro->uiDirectory(Utils::FileName::fromString(pro->buildDir())),
formFile, pro->singleVariableValue(QmakeVariable::UiHeaderExtensionVar)); formFile, pro->singleVariableValue(QmakeVariable::UiHeaderExtensionVar));
@@ -927,14 +922,14 @@ QtSupport::ProFileReader *QmakeProject::createProFileReader(const QmakeProFileNo
m_qmakeGlobals->qmake_abslocation = QDir::cleanPath(qtVersion->qmakeCommand().toString()); m_qmakeGlobals->qmake_abslocation = QDir::cleanPath(qtVersion->qmakeCommand().toString());
m_qmakeGlobals->setProperties(qtVersion->versionInfo()); m_qmakeGlobals->setProperties(qtVersion->versionInfo());
} }
m_qmakeGlobals->setDirectories(m_rootProjectNode->sourceDir(), m_rootProjectNode->buildDir()); m_qmakeGlobals->setDirectories(rootProjectNode()->sourceDir(), rootProjectNode()->buildDir());
m_qmakeGlobals->sysroot = systemRoot; m_qmakeGlobals->sysroot = systemRoot;
Environment::const_iterator eit = env.constBegin(), eend = env.constEnd(); Environment::const_iterator eit = env.constBegin(), eend = env.constEnd();
for (; eit != eend; ++eit) for (; eit != eend; ++eit)
m_qmakeGlobals->environment.insert(env.key(eit), env.value(eit)); m_qmakeGlobals->environment.insert(env.key(eit), env.value(eit));
m_qmakeGlobals->setCommandLineArguments(m_rootProjectNode->buildDir(), qmakeArgs); m_qmakeGlobals->setCommandLineArguments(rootProjectNode()->buildDir(), qmakeArgs);
QtSupport::ProFileCacheManager::instance()->incRefCount(); QtSupport::ProFileCacheManager::instance()->incRefCount();
@@ -986,29 +981,24 @@ void QmakeProject::destroyProFileReader(QtSupport::ProFileReader *reader)
} }
} }
ProjectNode *QmakeProject::rootProjectNode() const QmakeProFileNode *QmakeProject::rootProjectNode() const
{ {
return m_rootProjectNode; return static_cast<QmakeProFileNode *>(Project::rootProjectNode());
}
QmakeProFileNode *QmakeProject::rootQmakeProjectNode() const
{
return m_rootProjectNode;
} }
bool QmakeProject::validParse(const FileName &proFilePath) const bool QmakeProject::validParse(const FileName &proFilePath) const
{ {
if (!m_rootProjectNode) if (!rootProjectNode())
return false; return false;
const QmakeProFileNode *node = m_rootProjectNode->findProFileFor(proFilePath); const QmakeProFileNode *node = rootProjectNode()->findProFileFor(proFilePath);
return node && node->validParse(); return node && node->validParse();
} }
bool QmakeProject::parseInProgress(const FileName &proFilePath) const bool QmakeProject::parseInProgress(const FileName &proFilePath) const
{ {
if (!m_rootProjectNode) if (!rootProjectNode())
return false; return false;
const QmakeProFileNode *node = m_rootProjectNode->findProFileFor(proFilePath); const QmakeProFileNode *node = rootProjectNode()->findProFileFor(proFilePath);
return node && node->parseInProgress(); return node && node->parseInProgress();
} }
@@ -1035,7 +1025,7 @@ QList<QmakeProFileNode *> QmakeProject::allProFiles(const QList<QmakeProjectType
QList<QmakeProFileNode *> list; QList<QmakeProFileNode *> list;
if (!rootProjectNode()) if (!rootProjectNode())
return list; return list;
collectAllProFiles(list, rootQmakeProjectNode(), parse, projectTypes); collectAllProFiles(list, rootProjectNode(), parse, projectTypes);
return list; return list;
} }
@@ -1116,7 +1106,7 @@ void QmakeProject::notifyChanged(const FileName &name)
{ {
if (files(QmakeProject::ExcludeGeneratedFiles).contains(name.toString())) { if (files(QmakeProject::ExcludeGeneratedFiles).contains(name.toString())) {
QList<QmakeProFileNode *> list; QList<QmakeProFileNode *> list;
findProFile(name, rootQmakeProjectNode(), list); findProFile(name, rootProjectNode(), list);
foreach (QmakeProFileNode *node, list) { foreach (QmakeProFileNode *node, list) {
QtSupport::ProFileCacheManager::instance()->discardFile(name.toString()); QtSupport::ProFileCacheManager::instance()->discardFile(name.toString());
node->scheduleUpdate(QmakeProFileNode::ParseNow); node->scheduleUpdate(QmakeProFileNode::ParseNow);
@@ -1357,10 +1347,10 @@ QString QmakeProject::disabledReasonForRunConfiguration(const FileName &proFileP
return tr("The .pro file \"%1\" does not exist.") return tr("The .pro file \"%1\" does not exist.")
.arg(proFilePath.fileName()); .arg(proFilePath.fileName());
if (!m_rootProjectNode) // Shutting down if (!rootProjectNode()) // Shutting down
return QString(); return QString();
if (!m_rootProjectNode->findProFileFor(proFilePath)) if (!rootProjectNode()->findProFileFor(proFilePath))
return tr("The .pro file \"%1\" is not part of the project.") return tr("The .pro file \"%1\" is not part of the project.")
.arg(proFilePath.fileName()); .arg(proFilePath.fileName());
@@ -1381,7 +1371,7 @@ void QmakeProject::updateBuildSystemData()
Target * const target = activeTarget(); Target * const target = activeTarget();
if (!target) if (!target)
return; return;
const QmakeProFileNode * const rootNode = rootQmakeProjectNode(); const QmakeProFileNode * const rootNode = rootProjectNode();
if (!rootNode || rootNode->parseInProgress()) if (!rootNode || rootNode->parseInProgress())
return; return;

View File

@@ -76,8 +76,7 @@ public:
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const override; bool supportsKit(ProjectExplorer::Kit *k, QString *errorMesage) const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override; QmakeProFileNode *rootProjectNode() const override;
QmakeProFileNode *rootQmakeProjectNode() const;
bool validParse(const Utils::FileName &proFilePath) const; bool validParse(const Utils::FileName &proFilePath) const;
bool parseInProgress(const Utils::FileName &proFilePath) const; bool parseInProgress(const Utils::FileName &proFilePath) const;
@@ -180,8 +179,6 @@ private:
void startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay); void startAsyncTimer(QmakeProFileNode::AsyncUpdateDelay delay);
bool matchesKit(const ProjectExplorer::Kit *kit); bool matchesKit(const ProjectExplorer::Kit *kit);
QmakeProFileNode *m_rootProjectNode = 0;
// Current configuration // Current configuration
QString m_oldQtIncludePath; QString m_oldQtIncludePath;
QString m_oldQtLibsPath; QString m_oldQtLibsPath;

View File

@@ -207,7 +207,7 @@ void QmakeProjectConfigWidget::updateProblemLabel()
} }
QmakeProject *p = static_cast<QmakeProject *>(m_buildConfiguration->target()->project()); QmakeProject *p = static_cast<QmakeProject *>(m_buildConfiguration->target()->project());
if (p->rootQmakeProjectNode()->parseInProgress() || !p->rootQmakeProjectNode()->validParse()) { if (p->rootProjectNode()->parseInProgress() || !p->rootProjectNode()->validParse()) {
setProblemLabel(QString()); setProblemLabel(QString());
return; return;
} }

View File

@@ -227,7 +227,7 @@ bool QMakeStep::init(QList<const BuildStep *> &earlierSteps)
setOutputParser(new QMakeParser); setOutputParser(new QMakeParser);
QmakeProFileNode *node = static_cast<QmakeProject *>(qt4bc->target()->project())->rootQmakeProjectNode(); QmakeProFileNode *node = static_cast<QmakeProject *>(qt4bc->target()->project())->rootProjectNode();
if (qt4bc->subNodeBuild()) if (qt4bc->subNodeBuild())
node = qt4bc->subNodeBuild(); node = qt4bc->subNodeBuild();
QString proFile = node->filePath().toString(); QString proFile = node->filePath().toString();

View File

@@ -65,14 +65,13 @@ QmlProject::QmlProject(Internal::Manager *manager, const Utils::FileName &fileNa
setProjectManager(manager); setProjectManager(manager);
setDocument(new Internal::QmlProjectFile(this, fileName)); setDocument(new Internal::QmlProjectFile(this, fileName));
DocumentManager::addDocument(document(), true); DocumentManager::addDocument(document(), true);
setRootProjectNode(new Internal::QmlProjectNode(this));
setProjectContext(Context(QmlProjectManager::Constants::PROJECTCONTEXT)); setProjectContext(Context(QmlProjectManager::Constants::PROJECTCONTEXT));
setProjectLanguages(Context(ProjectExplorer::Constants::LANG_QMLJS)); setProjectLanguages(Context(ProjectExplorer::Constants::LANG_QMLJS));
m_projectName = projectFilePath().toFileInfo().completeBaseName(); m_projectName = projectFilePath().toFileInfo().completeBaseName();
m_rootNode = new Internal::QmlProjectNode(this);
projectManager()->registerProject(this); projectManager()->registerProject(this);
} }
@@ -81,7 +80,6 @@ QmlProject::~QmlProject()
projectManager()->unregisterProject(this); projectManager()->unregisterProject(this);
delete m_projectItem.data(); delete m_projectItem.data();
delete m_rootNode;
} }
void QmlProject::addedTarget(Target *target) void QmlProject::addedTarget(Target *target)
@@ -177,7 +175,7 @@ void QmlProject::parseProject(RefreshOptions options)
} }
} }
} }
m_rootNode->refresh(); rootProjectNode()->refresh();
} }
if (options & Configuration) { if (options & Configuration) {
@@ -193,7 +191,7 @@ void QmlProject::refresh(RefreshOptions options)
parseProject(options); parseProject(options);
if (options & Files) if (options & Files)
m_rootNode->refresh(); rootProjectNode()->refresh();
if (!modelManager()) if (!modelManager())
return; return;
@@ -323,9 +321,9 @@ bool QmlProject::supportsKit(Kit *k, QString *errorMessage) const
return true; return true;
} }
ProjectNode *QmlProject::rootProjectNode() const Internal::QmlProjectNode *QmlProject::rootProjectNode() const
{ {
return m_rootNode; return static_cast<Internal::QmlProjectNode *>(Project::rootProjectNode());
} }
QStringList QmlProject::files(FilesMode) const QStringList QmlProject::files(FilesMode) const

View File

@@ -34,6 +34,7 @@
#include "qmlprojectmanager_global.h" #include "qmlprojectmanager_global.h"
#include "qmlprojectmanager.h" #include "qmlprojectmanager.h"
#include "qmlprojectnodes.h"
#include <projectexplorer/project.h> #include <projectexplorer/project.h>
@@ -47,10 +48,7 @@ namespace QmlProjectManager {
class QmlProjectItem; class QmlProjectItem;
namespace Internal { namespace Internal { class QmlProjectFile; }
class QmlProjectFile;
class QmlProjectNode;
} // namespace Internal
class QMLPROJECTMANAGER_EXPORT QmlProject : public ProjectExplorer::Project class QMLPROJECTMANAGER_EXPORT QmlProject : public ProjectExplorer::Project
{ {
@@ -67,7 +65,7 @@ public:
bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override; bool supportsKit(ProjectExplorer::Kit *k, QString *errorMessage) const override;
ProjectExplorer::ProjectNode *rootProjectNode() const override; Internal::QmlProjectNode *rootProjectNode() const override;
QStringList files(FilesMode fileMode) const override; QStringList files(FilesMode fileMode) const override;
bool validProjectFile() const; bool validProjectFile() const;
@@ -118,8 +116,6 @@ private:
QStringList m_files; QStringList m_files;
QPointer<QmlProjectItem> m_projectItem; QPointer<QmlProjectItem> m_projectItem;
Internal::QmlProjectNode *m_rootNode;
}; };
} // namespace QmlProjectManager } // namespace QmlProjectManager