aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@qt.io>2017-12-04 13:53:38 +0100
committerTobias Hunger <tobias.hunger@qt.io>2017-12-12 13:44:09 +0000
commit7c35a3810023b7cb02550ef3ef6af62826545827 (patch)
tree1524096544cf17b5b9e4de35693bf26d0ee44398
parent34b8ed14842ab360604e8d30993772fe474d22d6 (diff)
Session: Move all functionality related to Nodes into ProjectTree
Do no longer expose Nodes from the SessionManager's API. These are now exclusively handled by the ProjectTree. Change-Id: I585c2ac919462073870363436e767640775d9045 Reviewed-by: Eike Ziller <eike.ziller@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp5
-rw-r--r--src/plugins/cpptools/cppfindreferences.cpp4
-rw-r--r--src/plugins/designer/codemodelhelpers.cpp2
-rw-r--r--src/plugins/designer/qtcreatorintegration.cpp1
-rw-r--r--src/plugins/projectexplorer/editorconfiguration.cpp4
-rw-r--r--src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp3
-rw-r--r--src/plugins/projectexplorer/projectfilewizardextension.cpp3
-rw-r--r--src/plugins/projectexplorer/projecttree.cpp40
-rw-r--r--src/plugins/projectexplorer/projecttree.h5
-rw-r--r--src/plugins/projectexplorer/session.cpp51
-rw-r--r--src/plugins/projectexplorer/session.h8
-rw-r--r--src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp4
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp4
-rw-r--r--src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp4
-rw-r--r--src/plugins/qmldesigner/documentmanager.cpp17
-rw-r--r--src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp6
16 files changed, 78 insertions, 83 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp
index 7f33bdd20f..2a5cf769a8 100644
--- a/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakefilecompletionassist.cpp
@@ -31,13 +31,12 @@
#include "cmakekitinformation.h"
#include <texteditor/codeassist/assistinterface.h>
-#include <projectexplorer/projecttree.h>
-#include <projectexplorer/project.h>
#include <projectexplorer/kit.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <coreplugin/editormanager/editormanager.h>
-#include <projectexplorer/session.h>
using namespace CMakeProjectManager::Internal;
using namespace TextEditor;
diff --git a/src/plugins/cpptools/cppfindreferences.cpp b/src/plugins/cpptools/cppfindreferences.cpp
index 777b7fce2b..d2ae4e9f43 100644
--- a/src/plugins/cpptools/cppfindreferences.cpp
+++ b/src/plugins/cpptools/cppfindreferences.cpp
@@ -36,7 +36,7 @@
#include <coreplugin/progressmanager/progressmanager.h>
#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/projectnodes.h>
-#include <projectexplorer/session.h>
+#include <projectexplorer/projecttree.h>
#include <texteditor/basefilefind.h>
#include <utils/algorithm.h>
@@ -560,7 +560,7 @@ static void displayResults(SearchResult *search, QFutureWatcher<CPlusPlus::Usage
if (Utils::contains(parameters.filesToRename, Utils::equal(&Node::filePath, result.path)))
continue;
- Node *node = SessionManager::nodeForFile(result.path);
+ Node *node = ProjectTree::nodeForFile(result.path);
if (!node) // Not part of any project
continue;
diff --git a/src/plugins/designer/codemodelhelpers.cpp b/src/plugins/designer/codemodelhelpers.cpp
index 82bb28383d..b0b575f2cb 100644
--- a/src/plugins/designer/codemodelhelpers.cpp
+++ b/src/plugins/designer/codemodelhelpers.cpp
@@ -27,8 +27,8 @@
#include <cpptools/cppmodelmanager.h>
-#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projectexplorer.h>
#include <projectexplorer/session.h>
#include <QCoreApplication>
diff --git a/src/plugins/designer/qtcreatorintegration.cpp b/src/plugins/designer/qtcreatorintegration.cpp
index efd35e4287..e752e3cdd7 100644
--- a/src/plugins/designer/qtcreatorintegration.cpp
+++ b/src/plugins/designer/qtcreatorintegration.cpp
@@ -42,6 +42,7 @@
#include <texteditor/texteditor.h>
#include <texteditor/textdocument.h>
#include <projectexplorer/projectexplorer.h>
+#include <projectexplorer/projecttree.h>
#include <projectexplorer/session.h>
#include <utils/asconst.h>
#include <utils/mimetypes/mimedatabase.h>
diff --git a/src/plugins/projectexplorer/editorconfiguration.cpp b/src/plugins/projectexplorer/editorconfiguration.cpp
index 01060baacb..f011eb3a7e 100644
--- a/src/plugins/projectexplorer/editorconfiguration.cpp
+++ b/src/plugins/projectexplorer/editorconfiguration.cpp
@@ -24,9 +24,9 @@
****************************************************************************/
#include "editorconfiguration.h"
-#include "session.h"
-#include "projectexplorer.h"
#include "project.h"
+#include "projectexplorer.h"
+#include "session.h"
#include <utils/algorithm.h>
diff --git a/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp b/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp
index 27b4b682ab..840c59d0f2 100644
--- a/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp
+++ b/src/plugins/projectexplorer/jsonwizard/jsonsummarypage.cpp
@@ -29,6 +29,7 @@
#include "../project.h"
#include "../projectexplorerconstants.h"
#include "../projectnodes.h"
+#include "../projecttree.h"
#include "../session.h"
#include "../projecttree.h"
@@ -245,7 +246,7 @@ void JsonSummaryPage::updateFileList()
void JsonSummaryPage::updateProjectData(FolderNode *node)
{
- Project *project = SessionManager::projectForNode(node);
+ Project *project = ProjectTree::projectForNode(node);
m_wizard->setValue(QLatin1String(KEY_SELECTED_PROJECT), QVariant::fromValue(project));
m_wizard->setValue(QLatin1String(KEY_SELECTED_NODE), QVariant::fromValue(node));
diff --git a/src/plugins/projectexplorer/projectfilewizardextension.cpp b/src/plugins/projectexplorer/projectfilewizardextension.cpp
index e6bf826e7b..7f0dd8a77f 100644
--- a/src/plugins/projectexplorer/projectfilewizardextension.cpp
+++ b/src/plugins/projectexplorer/projectfilewizardextension.cpp
@@ -27,6 +27,7 @@
#include "projectexplorer.h"
#include "session.h"
#include "projectnodes.h"
+#include "projecttree.h"
#include "projectwizardpage.h"
#include <utils/algorithm.h>
@@ -247,7 +248,7 @@ void ProjectFileWizardExtension::applyCodeStyle(GeneratedFile *file) const
return; // don't modify files like *.ui *.pro
FolderNode *folder = m_context->page->currentNode();
- Project *baseProject = SessionManager::projectForNode(folder);
+ Project *baseProject = ProjectTree::projectForNode(folder);
ICodeStylePreferencesFactory *factory = TextEditorSettings::codeStyleFactory(languageId);
diff --git a/src/plugins/projectexplorer/projecttree.cpp b/src/plugins/projectexplorer/projecttree.cpp
index 6d7e7c007a..16639b9423 100644
--- a/src/plugins/projectexplorer/projecttree.cpp
+++ b/src/plugins/projectexplorer/projecttree.cpp
@@ -156,7 +156,7 @@ void ProjectTree::update()
void ProjectTree::updateFromProjectTreeWidget(ProjectTreeWidget *widget)
{
Node *currentNode = widget->currentNode();
- Project *project = SessionManager::projectForNode(currentNode);
+ Project *project = projectForNode(currentNode);
setCurrent(currentNode, project);
}
@@ -175,7 +175,7 @@ void ProjectTree::updateFromNode(Node *node)
{
Project *project;
if (node)
- project = SessionManager::projectForNode(node);
+ project = projectForNode(node);
else
project = SessionManager::startupProject();
@@ -321,7 +321,7 @@ bool ProjectTree::hasFocus(ProjectTreeWidget *widget)
void ProjectTree::showContextMenu(ProjectTreeWidget *focus, const QPoint &globalPos, Node *node)
{
QMenu *contextMenu = nullptr;
- Project *project = SessionManager::projectForNode(node);
+ Project *project = projectForNode(node);
emit s_instance->aboutToShowContextMenu(project, node);
if (!node) {
@@ -403,6 +403,40 @@ void ProjectTree::forEachNode(const std::function<void(Node *)> &task)
}
}
+Project *ProjectTree::projectForNode(Node *node)
+{
+ if (!node)
+ return nullptr;
+
+ FolderNode *folder = node->asFolderNode();
+ if (!folder)
+ folder = node->parentFolderNode();
+
+ while (folder && folder->parentFolderNode())
+ folder = folder->parentFolderNode();
+
+ return Utils::findOrDefault(SessionManager::projects(), [folder](const Project *pro) {
+ return pro->containerNode() == folder;
+ });
+}
+
+Node *ProjectTree::nodeForFile(const FileName &fileName)
+{
+ Node *node = nullptr;
+ for (const Project *project : SessionManager::projects()) {
+ if (ProjectNode *projectNode = project->rootProjectNode()) {
+ projectNode->forEachGenericNode([&](Node *n) {
+ if (n->filePath() == fileName) {
+ // prefer file nodes
+ if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File))
+ node = n;
+ }
+ });
+ }
+ }
+ return node;
+}
+
void ProjectTree::hideContextMenu()
{
m_focusForContextMenu = nullptr;
diff --git a/src/plugins/projectexplorer/projecttree.h b/src/plugins/projectexplorer/projecttree.h
index 6691ccf45d..67b8db99c6 100644
--- a/src/plugins/projectexplorer/projecttree.h
+++ b/src/plugins/projectexplorer/projecttree.h
@@ -71,10 +71,13 @@ public:
static void registerTreeManager(const TreeManagerFunction &treeChange);
static void applyTreeManager(FolderNode *folder);
+ // Nodes:
static bool hasNode(const Node *node);
-
static void forEachNode(const std::function<void(Node *)> &task);
+ static Project *projectForNode(Node *node);
+ static Node *nodeForFile(const Utils::FileName &fileName);
+
void collapseAll();
// for nodes to emit signals, do not call unless you are a node
diff --git a/src/plugins/projectexplorer/session.cpp b/src/plugins/projectexplorer/session.cpp
index 35608f9155..01402cc326 100644
--- a/src/plugins/projectexplorer/session.cpp
+++ b/src/plugins/projectexplorer/session.cpp
@@ -203,7 +203,9 @@ QList<Project *> SessionManager::dependencies(const Project *project)
QList<Project *> projects;
foreach (const QString &dep, proDeps) {
- if (Project *pro = projectForFile(Utils::FileName::fromString(dep)))
+ const Utils::FileName fn = Utils::FileName::fromString(dep);
+ Project *pro = Utils::findOrDefault(d->m_projects, [&fn](Project *p) { return p->projectFilePath() == fn; });
+ if (pro)
projects += pro;
}
@@ -624,53 +626,10 @@ QList<Project *> SessionManager::projectOrder(const Project *project)
return result;
}
-// node for file returns a randomly selected node if there are multiple
-// prefer to use nodesForFile and figure out which node you want
-Node *SessionManager::nodeForFile(const Utils::FileName &fileName)
-{
- Node *node = nullptr;
- for (Project *project : d->m_projects) {
- if (ProjectNode *projectNode = project->rootProjectNode()) {
- projectNode->forEachGenericNode([&](Node *n) {
- if (n->filePath() == fileName) {
- // prefer file nodes
- if (!node || (node->nodeType() != NodeType::File && n->nodeType() == NodeType::File))
- node = n;
- }
- });
- }
- }
- return node;
-}
-
-Project *SessionManager::projectForNode(Node *node)
-{
- if (!node)
- return nullptr;
-
- FolderNode *folder = node->asFolderNode();
- if (!folder)
- folder = node->parentFolderNode();
-
- while (folder && folder->parentFolderNode())
- folder = folder->parentFolderNode();
-
- for (Project *pro : d->m_projects) {
- if (pro->containerNode() == folder)
- return pro;
- }
- return nullptr;
-}
-
Project *SessionManager::projectForFile(const Utils::FileName &fileName)
{
- const QList<Project *> &projectList = projects();
- foreach (Project *p, projectList) {
- if (p->isKnownFile(fileName))
- return p;
- }
-
- return nullptr;
+ return Utils::findOrDefault(SessionManager::projects(),
+ [&fileName](const Project *p) { return p->isKnownFile(fileName); });
}
void SessionManager::configureEditor(IEditor *editor, const QString &fileName)
diff --git a/src/plugins/projectexplorer/session.h b/src/plugins/projectexplorer/session.h
index 9558b6bbfb..938a7bc5fe 100644
--- a/src/plugins/projectexplorer/session.h
+++ b/src/plugins/projectexplorer/session.h
@@ -31,9 +31,9 @@
#include <utils/persistentsettings.h>
+#include <QDateTime>
#include <QString>
#include <QStringList>
-#include <QDateTime>
namespace Core { class IEditor; }
@@ -43,8 +43,6 @@ class Project;
class Target;
class BuildConfiguration;
class DeployConfiguration;
-class Node;
-
enum class SetActive { Cascade, NoCascade };
class PROJECTEXPLORER_EXPORT SessionManager : public QObject
@@ -110,10 +108,8 @@ public:
static QVariant value(const QString &name);
// NBS rewrite projectOrder (dependency management)
- static QList<Project *> projectOrder(const Project *project = 0);
+ static QList<Project *> projectOrder(const Project *project = nullptr);
- static Project *projectForNode(Node *node);
- static Node *nodeForFile(const Utils::FileName &fileName);
static Project *projectForFile(const Utils::FileName &fileName);
static QStringList projectsForSessionName(const QString &session);
diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
index a4cd157c71..99e9ed8a6d 100644
--- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
+++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp
@@ -75,13 +75,13 @@ namespace Internal {
static Node *currentEditorNode()
{
Core::IDocument *doc = Core::EditorManager::currentDocument();
- return doc ? SessionManager::nodeForFile(doc->filePath()) : 0;
+ return doc ? ProjectTree::nodeForFile(doc->filePath()) : nullptr;
}
static QbsProject *currentEditorProject()
{
Core::IDocument *doc = Core::EditorManager::currentDocument();
- return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath())) : 0;
+ return doc ? qobject_cast<QbsProject *>(SessionManager::projectForFile(doc->filePath())) : nullptr;
}
bool QbsProjectManagerPlugin::initialize(const QStringList &arguments, QString *errorMessage)
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
index bfcc2f3d50..a75eb56e24 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanager.cpp
@@ -194,8 +194,8 @@ void QmakeManager::buildFile()
{
if (Core::IDocument *currentDocument= Core::EditorManager::currentDocument()) {
const Utils::FileName file = currentDocument->filePath();
- Node *n = SessionManager::nodeForFile(file);
- FileNode *node = n ? n->asFileNode() : 0;
+ Node *n = ProjectTree::nodeForFile(file);
+ FileNode *node = n ? n->asFileNode() : nullptr;
Project *project = SessionManager::projectForFile(file);
if (project && node)
diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
index 17a1684fad..8ae76b5390 100644
--- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
+++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp
@@ -53,9 +53,9 @@
#include <coreplugin/editormanager/ieditor.h>
#include <projectexplorer/buildmanager.h>
-#include <projectexplorer/session.h>
#include <projectexplorer/projectmanager.h>
#include <projectexplorer/projecttree.h>
+#include <projectexplorer/session.h>
#include <projectexplorer/target.h>
#include <texteditor/texteditoractionhandler.h>
@@ -414,7 +414,7 @@ void QmakeProjectManagerPlugin::enableBuildFileMenus(const Utils::FileName &file
bool visible = false;
bool enabled = false;
- if (Node *node = SessionManager::nodeForFile(file)) {
+ if (Node *node = ProjectTree::nodeForFile(file)) {
if (Project *project = SessionManager::projectForFile(file)) {
if (const FileNode *fileNode = node->asFileNode()) {
const FileType type = fileNode->fileType();
diff --git a/src/plugins/qmldesigner/documentmanager.cpp b/src/plugins/qmldesigner/documentmanager.cpp
index 929a0bda47..f72939d36f 100644
--- a/src/plugins/qmldesigner/documentmanager.cpp
+++ b/src/plugins/qmldesigner/documentmanager.cpp
@@ -40,9 +40,10 @@
#include <coreplugin/vcsmanager.h>
#include <coreplugin/icore.h>
#include <coreplugin/messagebox.h>
-#include <projectexplorer/session.h>
#include <projectexplorer/projectnodes.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projecttree.h>
+#include <projectexplorer/session.h>
#include <qmakeprojectmanager/qmakenodes.h>
#include <qmakeprojectmanager/qmakeproject.h>
@@ -327,7 +328,7 @@ Utils::FileName DocumentManager::currentFilePath()
QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath)
{
- ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(proPath));
+ ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(proPath));
if (!node) {
qCWarning(documentManagerLog) << "No node for .pro:" << proPath;
return QStringList();
@@ -350,7 +351,7 @@ QStringList DocumentManager::isoIconsQmakeVariableValue(const QString &proPath)
bool DocumentManager::setIsoIconsQmakeVariableValue(const QString &proPath, const QStringList &value)
{
- ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(proPath));
+ ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(proPath));
if (!node) {
qCWarning(documentManagerLog) << "No node for .pro:" << proPath;
return false;
@@ -380,7 +381,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists,
{
Utils::FileName qmlFileName = QmlDesignerPlugin::instance()->currentDesignDocument()->fileName();
ProjectExplorer::Project *project = ProjectExplorer::SessionManager::projectForFile(qmlFileName);
- ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(qmlFileName)->parentFolderNode();
+ ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(qmlFileName)->parentFolderNode();
ProjectExplorer::Node *iconQrcFileNode = nullptr;
while (node && !iconQrcFileNode) {
@@ -419,11 +420,11 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists,
*resourceFilePath = project->projectDirectory().toString() + "/" + isoIconsQrcFile;
// We assume that the .pro containing the QML file is an acceptable place to add the .qrc file.
- ProjectExplorer::ProjectNode *projectNode = ProjectExplorer::SessionManager::nodeForFile(qmlFileName)->parentProjectNode();
+ ProjectExplorer::ProjectNode *projectNode = ProjectExplorer::ProjectTree::nodeForFile(qmlFileName)->parentProjectNode();
*resourceFileProPath = projectNode->filePath().toString();
} else {
// We found the QRC file that we want.
- QString projectDirectory = ProjectExplorer::SessionManager::projectForNode(iconQrcFileNode)->projectDirectory().toString();
+ QString projectDirectory = ProjectExplorer::ProjectTree::projectForNode(iconQrcFileNode)->projectDirectory().toString();
*resourceFilePath = projectDirectory + "/" + isoIconsQrcFile;
}
@@ -432,7 +433,7 @@ void DocumentManager::findPathToIsoProFile(bool *iconResourceFileAlreadyExists,
bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resourceFileProPath)
{
- ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(resourceFileProPath));
+ ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(resourceFileProPath));
if (!node || !node->parentFolderNode())
return false;
ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode();
@@ -448,7 +449,7 @@ bool DocumentManager::isoProFileSupportsAddingExistingFiles(const QString &resou
bool DocumentManager::addResourceFileToIsoProject(const QString &resourceFileProPath, const QString &resourceFilePath)
{
- ProjectExplorer::Node *node = ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(resourceFileProPath));
+ ProjectExplorer::Node *node = ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(resourceFileProPath));
if (!node || !node->parentFolderNode())
return false;
ProjectExplorer::ProjectNode *projectNode = node->parentFolderNode()->asProjectNode();
diff --git a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
index ff58c4cb1f..d3f9fe65e0 100644
--- a/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
+++ b/src/plugins/qmljseditor/qmljscomponentfromobjectdef.cpp
@@ -39,9 +39,9 @@
#include <qmljs/qmljspropertyreader.h>
#include <qmljs/qmljsrewriter.h>
#include <qmljstools/qmljsrefactoringchanges.h>
-#include <projectexplorer/session.h>
-#include <projectexplorer/projectnodes.h>
#include <projectexplorer/project.h>
+#include <projectexplorer/projectnodes.h>
+#include <projectexplorer/projecttree.h>
#include <utils/fileutils.h>
@@ -192,7 +192,7 @@ public:
if (path == QFileInfo(currentFileName).path()) {
// hack for the common case, next version should use the wizard
ProjectExplorer::Node * oldFileNode =
- ProjectExplorer::SessionManager::nodeForFile(Utils::FileName::fromString(currentFileName));
+ ProjectExplorer::ProjectTree::nodeForFile(Utils::FileName::fromString(currentFileName));
if (oldFileNode) {
ProjectExplorer::FolderNode *containingFolder = oldFileNode->parentFolderNode();
if (containingFolder)