aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Jenssen <tim.jenssen@qt.io>2017-03-01 17:53:15 +0100
committerTobias Hunger <tobias.hunger@qt.io>2017-03-02 09:31:23 +0000
commitf2b8e9acd1c710fa2e24bf5b73d36041893041f0 (patch)
tree24bb6d301e004f0e151722d0fe62413bd3ce9c95
parent0a09ba7319d56d0d77175bf35399fbb776c20d1b (diff)
SessionManager: Clean up methods around projects
Clean up methods around projects() and update its usages to modern language standards. Change-Id: Ia0a4574d014ce41e0d511a392e4eed4680981d0e Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
-rw-r--r--src/plugins/android/androidmanifesteditorwidget.cpp2
-rw-r--r--src/plugins/classview/classviewparser.cpp11
-rw-r--r--src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp2
-rw-r--r--src/plugins/cpptools/cppincludesfilter.cpp2
-rw-r--r--src/plugins/cpptools/symbolsfindfilter.cpp2
-rw-r--r--src/plugins/designer/resourcehandler.cpp2
-rw-r--r--src/plugins/modeleditor/componentviewcontroller.cpp2
-rw-r--r--src/plugins/projectexplorer/allprojectsfilter.cpp2
-rw-r--r--src/plugins/projectexplorer/currentprojectfind.cpp4
-rw-r--r--src/plugins/projectexplorer/miniprojecttargetselector.cpp10
-rw-r--r--src/plugins/projectexplorer/projectexplorer.cpp6
-rw-r--r--src/plugins/projectexplorer/projecttree.cpp2
-rw-r--r--src/plugins/projectexplorer/session.cpp48
-rw-r--r--src/plugins/projectexplorer/session.h3
-rw-r--r--src/plugins/valgrind/memchecktool.cpp2
-rw-r--r--src/plugins/valgrind/suppressiondialog.cpp2
-rw-r--r--src/plugins/vcsbase/vcsbaseeditor.cpp2
-rw-r--r--src/plugins/vcsbase/vcsprojectcache.cpp2
18 files changed, 54 insertions, 52 deletions
diff --git a/src/plugins/android/androidmanifesteditorwidget.cpp b/src/plugins/android/androidmanifesteditorwidget.cpp
index 9d7bb67662..70d1ece18e 100644
--- a/src/plugins/android/androidmanifesteditorwidget.cpp
+++ b/src/plugins/android/androidmanifesteditorwidget.cpp
@@ -86,7 +86,7 @@ bool checkPackageName(const QString &packageName)
Project *androidProject(const Utils::FileName &fileName)
{
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
if (!project->activeTarget())
continue;
Kit *kit = project->activeTarget()->kit();
diff --git a/src/plugins/classview/classviewparser.cpp b/src/plugins/classview/classviewparser.cpp
index c9f7080511..901edacf91 100644
--- a/src/plugins/classview/classviewparser.cpp
+++ b/src/plugins/classview/classviewparser.cpp
@@ -284,10 +284,7 @@ ParserTreeItem::ConstPtr Parser::parse()
ParserTreeItem::Ptr rootItem(new ParserTreeItem());
// check all projects
- foreach (const Project *prj, SessionManager::projects()) {
- if (!prj)
- continue;
-
+ for (const Project *prj : SessionManager::projects()) {
ParserTreeItem::Ptr item;
QString prjName(prj->displayName());
QString prjType(prjName);
@@ -644,10 +641,8 @@ void Parser::resetData(const CPlusPlus::Snapshot &snapshot)
QStringList fileList;
// check all projects
- foreach (const Project *prj, SessionManager::projects()) {
- if (prj)
- fileList += prj->files(Project::SourceFiles);
- }
+ for (const Project *prj : SessionManager::projects())
+ fileList += prj->files(Project::SourceFiles);
setFileList(fileList);
emit resetDataDone();
diff --git a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
index 39b892d966..11b7696bae 100644
--- a/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakelocatorfilter.cpp
@@ -60,7 +60,7 @@ CMakeLocatorFilter::CMakeLocatorFilter()
void CMakeLocatorFilter::prepareSearch(const QString &entry)
{
m_result.clear();
- foreach (Project *p, SessionManager::projects()) {
+ for (Project *p : SessionManager::projects()) {
CMakeProject *cmakeProject = qobject_cast<CMakeProject *>(p);
if (!cmakeProject)
continue;
diff --git a/src/plugins/cpptools/cppincludesfilter.cpp b/src/plugins/cpptools/cppincludesfilter.cpp
index 053ad8d70a..3f8c2d6af7 100644
--- a/src/plugins/cpptools/cppincludesfilter.cpp
+++ b/src/plugins/cpptools/cppincludesfilter.cpp
@@ -158,7 +158,7 @@ void CppIncludesFilter::prepareSearch(const QString &entry)
if (m_needsUpdate) {
m_needsUpdate = false;
QSet<QString> seedPaths;
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
foreach (const QString &filePath, project->files(Project::AllFiles))
seedPaths.insert(filePath);
}
diff --git a/src/plugins/cpptools/symbolsfindfilter.cpp b/src/plugins/cpptools/symbolsfindfilter.cpp
index 78d8dda01c..104cac2ba8 100644
--- a/src/plugins/cpptools/symbolsfindfilter.cpp
+++ b/src/plugins/cpptools/symbolsfindfilter.cpp
@@ -132,7 +132,7 @@ void SymbolsFindFilter::startSearch(SearchResult *search)
SymbolSearcher::Parameters parameters = search->userData().value<SymbolSearcher::Parameters>();
QSet<QString> projectFileNames;
if (parameters.scope == SymbolSearcher::SearchProjectsOnly) {
- foreach (ProjectExplorer::Project *project, ProjectExplorer::SessionManager::projects())
+ for (ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects())
projectFileNames += project->files(ProjectExplorer::Project::AllFiles).toSet();
}
diff --git a/src/plugins/designer/resourcehandler.cpp b/src/plugins/designer/resourcehandler.cpp
index 8a3f905331..0a8b913392 100644
--- a/src/plugins/designer/resourcehandler.cpp
+++ b/src/plugins/designer/resourcehandler.cpp
@@ -60,7 +60,7 @@ void ResourceHandler::ensureInitialized()
connect(p, &Project::fileListChanged, this, &ResourceHandler::updateResources);
};
- foreach (Project *p, SessionManager::projects())
+ for (Project *p : SessionManager::projects())
connector(p);
connect(SessionManager::instance(), &SessionManager::projectAdded, this, connector);
diff --git a/src/plugins/modeleditor/componentviewcontroller.cpp b/src/plugins/modeleditor/componentviewcontroller.cpp
index 86e9df81b7..c893967122 100644
--- a/src/plugins/modeleditor/componentviewcontroller.cpp
+++ b/src/plugins/modeleditor/componentviewcontroller.cpp
@@ -255,7 +255,7 @@ bool UpdateIncludeDependenciesVisitor::haveMatchingStereotypes(const qmt::MObjec
QStringList UpdateIncludeDependenciesVisitor::findFilePathOfComponent(const qmt::MComponent *component)
{
QMultiHash<QString, Node> filePaths;
- foreach (const ProjectExplorer::Project *project, ProjectExplorer::SessionManager::projects()) {
+ for (const ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) {
ProjectExplorer::ProjectNode *projectNode = project->rootProjectNode();
if (projectNode)
collectElementPaths(projectNode, &filePaths);
diff --git a/src/plugins/projectexplorer/allprojectsfilter.cpp b/src/plugins/projectexplorer/allprojectsfilter.cpp
index fa82b38052..f03e5eef49 100644
--- a/src/plugins/projectexplorer/allprojectsfilter.cpp
+++ b/src/plugins/projectexplorer/allprojectsfilter.cpp
@@ -58,7 +58,7 @@ void AllProjectsFilter::prepareSearch(const QString &entry)
Q_UNUSED(entry)
if (!fileIterator()) {
QStringList paths;
- foreach (Project *project, SessionManager::projects())
+ for (Project *project : SessionManager::projects())
paths.append(project->files(Project::AllFiles));
Utils::sort(paths);
setFileIterator(new BaseFileFilter::ListIterator(paths));
diff --git a/src/plugins/projectexplorer/currentprojectfind.cpp b/src/plugins/projectexplorer/currentprojectfind.cpp
index c67c26a62f..b595f8f041 100644
--- a/src/plugins/projectexplorer/currentprojectfind.cpp
+++ b/src/plugins/projectexplorer/currentprojectfind.cpp
@@ -79,7 +79,7 @@ Utils::FileIterator *CurrentProjectFind::files(const QStringList &nameFilters,
QTC_ASSERT(additionalParameters.isValid(),
return new Utils::FileListIterator(QStringList(), QList<QTextCodec *>()));
QString projectFile = additionalParameters.toString();
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
if (project->document() && projectFile == project->projectFilePath().toString())
return filesForProjects(nameFilters, exclusionFilters, QList<Project *>() << project);
}
@@ -105,7 +105,7 @@ void CurrentProjectFind::recheckEnabled()
if (!search)
return;
QString projectFile = getAdditionalParameters(search).toString();
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
if (projectFile == project->projectFilePath().toString()) {
search->setSearchAgainEnabled(true);
return;
diff --git a/src/plugins/projectexplorer/miniprojecttargetselector.cpp b/src/plugins/projectexplorer/miniprojecttargetselector.cpp
index 357494ebcb..1826ef5b5f 100644
--- a/src/plugins/projectexplorer/miniprojecttargetselector.cpp
+++ b/src/plugins/projectexplorer/miniprojecttargetselector.cpp
@@ -1172,7 +1172,7 @@ void MiniProjectTargetSelector::updateProjectListVisible()
void MiniProjectTargetSelector::updateTargetListVisible()
{
int maxCount = 0;
- foreach (Project *p, SessionManager::projects())
+ for (Project *p : SessionManager::projects())
maxCount = qMax(p->targets().size(), maxCount);
bool visible = maxCount > 1;
@@ -1185,7 +1185,7 @@ void MiniProjectTargetSelector::updateTargetListVisible()
void MiniProjectTargetSelector::updateBuildListVisible()
{
int maxCount = 0;
- foreach (Project *p, SessionManager::projects())
+ for (Project *p : SessionManager::projects())
foreach (Target *t, p->targets())
maxCount = qMax(t->buildConfigurations().size(), maxCount);
@@ -1199,7 +1199,7 @@ void MiniProjectTargetSelector::updateBuildListVisible()
void MiniProjectTargetSelector::updateDeployListVisible()
{
int maxCount = 0;
- foreach (Project *p, SessionManager::projects())
+ for (Project *p : SessionManager::projects())
foreach (Target *t, p->targets())
maxCount = qMax(t->deployConfigurations().size(), maxCount);
@@ -1213,7 +1213,7 @@ void MiniProjectTargetSelector::updateDeployListVisible()
void MiniProjectTargetSelector::updateRunListVisible()
{
int maxCount = 0;
- foreach (Project *p, SessionManager::projects())
+ for (Project *p : SessionManager::projects())
foreach (Target *t, p->targets())
maxCount = qMax(t->runConfigurations().size(), maxCount);
@@ -1493,7 +1493,7 @@ void MiniProjectTargetSelector::updateActionAndSummary()
Project *project = SessionManager::startupProject();
if (project) {
projectName = project->displayName();
- foreach (Project *p, SessionManager::projects()) {
+ for (Project *p : SessionManager::projects()) {
if (p != project && p->displayName() == projectName) {
fileName = project->projectFilePath().toUserOutput();
break;
diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp
index d0880a1747..f18dd79a5f 100644
--- a/src/plugins/projectexplorer/projectexplorer.cpp
+++ b/src/plugins/projectexplorer/projectexplorer.cpp
@@ -1572,7 +1572,7 @@ void ProjectExplorerPluginPrivate::savePersistentSettings()
return;
if (!SessionManager::loadingSession()) {
- foreach (Project *pro, SessionManager::projects())
+ for (Project *pro : SessionManager::projects())
pro->saveSettings();
SessionManager::save();
@@ -1688,7 +1688,7 @@ ProjectExplorerPlugin::OpenProjectResult ProjectExplorerPlugin::openProjects(con
const QFileInfo fi(fileName);
const QString filePath = fi.absoluteFilePath();
bool found = false;
- foreach (Project *pi, SessionManager::projects()) {
+ for (Project *pi : SessionManager::projects()) {
if (filePath == pi->projectFilePath().toString()) {
alreadyOpen.append(pi);
found = true;
@@ -2866,7 +2866,7 @@ void ProjectExplorerPluginPrivate::updateUnloadProjectMenu()
ActionContainer *aci = ActionManager::actionContainer(Constants::M_UNLOADPROJECTS);
QMenu *menu = aci->menu();
menu->clear();
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
QAction *action = menu->addAction(tr("Close Project \"%1\"").arg(project->displayName()));
connect(action, &QAction::triggered,
[project] { ProjectExplorerPlugin::unloadProject(project); } );
diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp
index 57d7f349ea..3f7c8a4a41 100644
--- a/src/plugins/projectexplorer/projecttree.cpp
+++ b/src/plugins/projectexplorer/projecttree.cpp
@@ -296,7 +296,7 @@ void ProjectTree::updateExternalFileWarning()
const QList<Project *> projects = SessionManager::projects();
if (projects.isEmpty())
return;
- foreach (Project *project, projects) {
+ for (Project *project : projects) {
FileName projectDir = project->projectDirectory();
if (projectDir.isEmpty())
continue;
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 3b68746c8a..e08416b4e7 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -89,10 +89,12 @@ public:
QStringList dependenciesOrder() const;
void dependencies(const QString &proName, QStringList &result) const;
-public:
static QString windowTitleAddition(const QString &filePath);
static QString sessionTitle(const QString &filePath);
+ bool hasProjects() const { return !m_projects.isEmpty(); }
+ bool hasProject(Project *p) const { return m_projects.contains(p); }
+
SessionNode m_sessionNode;
QString m_sessionName = QLatin1String("default");
bool m_virginSession = true;
@@ -291,7 +293,7 @@ void SessionManager::setActiveTarget(Project *project, Target *target, SetActive
return;
Core::Id kitId = target->kit()->id();
- foreach (Project *otherProject, SessionManager::projects()) {
+ for (Project *otherProject : SessionManager::projects()) {
if (otherProject == project)
continue;
if (Target *otherTarget = Utils::findOrDefault(otherProject->targets(),
@@ -312,7 +314,7 @@ void SessionManager::setActiveBuildConfiguration(Target *target, BuildConfigurat
Core::Id kitId = target->kit()->id();
QString name = bc->displayName(); // We match on displayname
- foreach (Project *otherProject, SessionManager::projects()) {
+ for (Project *otherProject : SessionManager::projects()) {
if (otherProject == target->project())
continue;
Target *otherTarget = otherProject->activeTarget();
@@ -340,7 +342,7 @@ void SessionManager::setActiveDeployConfiguration(Target *target, DeployConfigur
Core::Id kitId = target->kit()->id();
QString name = dc->displayName(); // We match on displayname
- foreach (Project *otherProject, SessionManager::projects()) {
+ for (Project *otherProject : SessionManager::projects()) {
if (otherProject == target->project())
continue;
Target *otherTarget = otherProject->activeTarget();
@@ -359,7 +361,7 @@ void SessionManager::setActiveDeployConfiguration(Target *target, DeployConfigur
void SessionManager::setStartupProject(Project *startupProject)
{
QTC_ASSERT((!startupProject)
- || (startupProject && d->m_projects.contains(startupProject)), return);
+ || (startupProject && hasProject(startupProject)), return);
if (d->m_startupProject == startupProject)
return;
@@ -378,7 +380,7 @@ void SessionManager::addProject(Project *pro)
QTC_ASSERT(pro, return);
d->m_virginSession = false;
- QTC_ASSERT(!d->m_projects.contains(pro), return);
+ QTC_ASSERT(!hasProject(pro), return);
d->m_projects.append(pro);
d->m_sessionNode.addNode(pro->rootProjectNode());
@@ -436,10 +438,8 @@ bool SessionManager::save()
data.insert(QLatin1String("Color"), tmp);
}
- QStringList projectFiles;
- foreach (Project *pro, d->m_projects)
- projectFiles << pro->projectFilePath().toString();
-
+ QStringList projectFiles
+ = Utils::transform(projects(), [](Project *p) { return p->projectFilePath().toString(); });
// Restore infromation on projects that failed to load:
// don't readd projects to the list, which the user loaded
foreach (const QString &failed, d->m_failedProjects) {
@@ -492,14 +492,19 @@ void SessionManager::closeAllProjects()
removeProjects(projects());
}
-QList<Project *> SessionManager::projects()
+const QList<Project *> SessionManager::projects()
{
return d->m_projects;
}
bool SessionManager::hasProjects()
{
- return !d->m_projects.isEmpty();
+ return d->hasProjects();
+}
+
+bool SessionManager::hasProject(Project *p)
+{
+ return d->hasProject(p);
}
QStringList SessionManagerPrivate::dependencies(const QString &proName) const
@@ -570,7 +575,7 @@ QStringList SessionManagerPrivate::dependenciesOrder() const
QStringList ordered;
// copy the map to a temporary list
- foreach (Project *pro, m_projects) {
+ for (Project *pro : m_projects) {
const QString proName = pro->projectFilePath().toString();
unordered << QPair<QString, QStringList>(proName, m_depMap.value(proName));
}
@@ -608,7 +613,7 @@ QList<Project *> SessionManager::projectOrder(const Project *project)
pros = d->dependenciesOrder();
foreach (const QString &proFile, pros) {
- foreach (Project *pro, projects()) {
+ for (Project *pro : projects()) {
if (pro->projectFilePath().toString() == proFile) {
result << pro;
break;
@@ -651,7 +656,7 @@ Project *SessionManager::projectForNode(Node *node)
while (rootProjectNode && rootProjectNode->parentFolderNode() != &d->m_sessionNode)
rootProjectNode = rootProjectNode->parentFolderNode();
- return Utils::findOrDefault(d->m_projects, Utils::equal(&Project::rootProjectNode, rootProjectNode));
+ return Utils::findOrDefault(projects(), Utils::equal(&Project::rootProjectNode, rootProjectNode));
}
Project *SessionManager::projectForFile(const Utils::FileName &fileName)
@@ -705,7 +710,7 @@ void SessionManager::removeProjects(QList<Project *> remove)
// Refresh dependencies
QSet<QString> projectFiles;
- foreach (Project *pro, projects()) {
+ for (Project *pro : projects()) {
if (!remove.contains(pro))
projectFiles.insert(pro->projectFilePath().toString());
}
@@ -743,9 +748,10 @@ void SessionManager::removeProjects(QList<Project *> remove)
delete pro;
}
- if (!startupProject())
- if (!d->m_projects.isEmpty())
- setStartupProject(d->m_projects.first());
+ if (!startupProject()) {
+ if (hasProjects())
+ setStartupProject(projects().first());
+ }
}
/*!
@@ -914,7 +920,7 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader
{
const QString startupProject = reader.restoreValue(QLatin1String("StartupProject")).toString();
if (!startupProject.isEmpty()) {
- foreach (Project *pro, d->m_projects) {
+ foreach (Project *pro, m_projects) {
if (pro->projectFilePath().toString() == startupProject) {
m_instance->setStartupProject(pro);
break;
@@ -924,7 +930,7 @@ void SessionManagerPrivate::restoreStartupProject(const PersistentSettingsReader
if (!m_startupProject) {
if (!startupProject.isEmpty())
qWarning() << "Could not find startup project" << startupProject;
- if (!m_projects.isEmpty())
+ if (hasProjects())
m_instance->setStartupProject(m_projects.first());
}
}
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index e0958baa44..b58d2bdbca 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -99,8 +99,9 @@ public:
static Utils::FileName sessionNameToFileName(const QString &session);
static Project *startupProject();
- static QList<Project *> projects();
+ static const QList<Project *> projects();
static bool hasProjects();
+ static bool hasProject(Project *p);
static bool isDefaultVirgin();
static bool isDefaultSession(const QString &session);
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index 5ee597784f..5c2b1d184d 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -195,7 +195,7 @@ bool MemcheckErrorFilterProxyModel::filterAcceptsRow(int sourceRow, const QModel
// ALGORITHM: look at last five stack frames, if none of these is inside any open projects,
// assume this error was created by an external library
QSet<QString> validFolders;
- foreach (Project *project, SessionManager::projects()) {
+ for (Project *project : SessionManager::projects()) {
validFolders << project->projectDirectory().toString();
foreach (Target *target, project->targets()) {
foreach (const DeployableFile &file,
diff --git a/src/plugins/valgrind/suppressiondialog.cpp b/src/plugins/valgrind/suppressiondialog.cpp
index 40b8d82426..573b281610 100644
--- a/src/plugins/valgrind/suppressiondialog.cpp
+++ b/src/plugins/valgrind/suppressiondialog.cpp
@@ -209,7 +209,7 @@ void SuppressionDialog::accept()
// Add file to project if there is a project containing this file on the file system.
if (!ProjectExplorer::SessionManager::projectForFile(Utils::FileName::fromString(path))) {
- foreach (ProjectExplorer::Project *p, ProjectExplorer::SessionManager::projects()) {
+ for (ProjectExplorer::Project *p : ProjectExplorer::SessionManager::projects()) {
if (path.startsWith(p->projectDirectory().toString())) {
p->rootProjectNode()->addFiles(QStringList() << path);
break;
diff --git a/src/plugins/vcsbase/vcsbaseeditor.cpp b/src/plugins/vcsbase/vcsbaseeditor.cpp
index 4191c77db9..c42154ce4c 100644
--- a/src/plugins/vcsbase/vcsbaseeditor.cpp
+++ b/src/plugins/vcsbase/vcsbaseeditor.cpp
@@ -1257,7 +1257,7 @@ static QTextCodec *findProjectCodec(const QString &dir)
return codec;
}
}
- return 0;
+ return nullptr;
}
QTextCodec *VcsBaseEditor::getCodec(const QString &source)
diff --git a/src/plugins/vcsbase/vcsprojectcache.cpp b/src/plugins/vcsbase/vcsprojectcache.cpp
index 43dee8c873..6540daf2a7 100644
--- a/src/plugins/vcsbase/vcsprojectcache.cpp
+++ b/src/plugins/vcsbase/vcsprojectcache.cpp
@@ -125,7 +125,7 @@ ProjectExplorer::Project *VcsProjectCache::projectForToplevel(const Utils::FileN
{
PathMatcher parentMatcher;
PathMatcher childMatcher;
- foreach (ProjectExplorer::Project *project, ProjectExplorer::SessionManager::projects()) {
+ for (ProjectExplorer::Project *project : ProjectExplorer::SessionManager::projects()) {
const Utils::FileName projectDir = project->projectDirectory();
if (projectDir == vcsTopLevel)
return project;