CMakeProjectManager: Simplify creation of virtual folders

Change-Id: I781c0f6551ca01feaf1cc0fc1148a151777f91bf
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
hjk
2017-01-26 18:35:49 +01:00
parent 87304b3ce0
commit 1ce6cfd809
2 changed files with 48 additions and 69 deletions

View File

@@ -217,27 +217,18 @@ CMakeConfig ServerModeReader::takeParsedConfiguration()
return config; return config;
} }
FolderNode *setupCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority, void addCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority,
const QString &displayName, QList<FileNode *> &files) const QString &displayName, QList<FileNode *> &files)
{ {
if (files.isEmpty()) if (files.isEmpty())
return nullptr; return;
auto folder = new VirtualFolderNode(basePath, priority);
FolderNode *folder folder->setDisplayName(displayName);
= findOrDefault(base->folderNodes(), [basePath](const FolderNode *fn) { base->addFolderNode(folder);
return fn->filePath() == basePath;
});
if (!folder) {
folder = new VirtualFolderNode(basePath, priority);
folder->setDisplayName(displayName);
base->addFolderNode(folder);
}
folder->buildTree(files); folder->buildTree(files);
return folder;
} }
static ProjectNode *updateCMakeInputs(CMakeListsNode *root, static ProjectNode *addCMakeInputs(CMakeListsNode *root,
const Utils::FileName &sourceDir, const Utils::FileName &sourceDir,
const Utils::FileName &buildDir, const Utils::FileName &buildDir,
QList<FileNode *> &sourceInputs, QList<FileNode *> &sourceInputs,
@@ -259,22 +250,15 @@ static ProjectNode *updateCMakeInputs(CMakeListsNode *root,
if (!hasInputs) if (!hasInputs)
return nullptr; return nullptr;
QList<FolderNode *> toKeep; addCMakeVFolder(cmakeVFolder, sourceDir, 1000,
toKeep.append(setupCMakeVFolder(cmakeVFolder, sourceDir, 1000, QCoreApplication::translate("CMakeProjectManager::Internal", "<Source Directory>"),
QCoreApplication::translate("CMakeProjectManager::Internal", "<Source Directory>"), sourceInputs);
sourceInputs)); addCMakeVFolder(cmakeVFolder, buildDir, 100,
toKeep.append(setupCMakeVFolder(cmakeVFolder, buildDir, 100, QCoreApplication::translate("CMakeProjectManager::Internal", "<Build Directory>"),
QCoreApplication::translate("CMakeProjectManager::Internal", "<Build Directory>"), buildInputs);
buildInputs)); addCMakeVFolder(cmakeVFolder, Utils::FileName(), 10,
toKeep.append(setupCMakeVFolder(cmakeVFolder, Utils::FileName(), 10, QCoreApplication::translate("CMakeProjectManager::Internal", "<Other Locations>"),
QCoreApplication::translate("CMakeProjectManager::Internal", "<Other Locations>"), rootInputs);
rootInputs));
// Clean out unused nodes in "CMake Files":
const QList<FolderNode *> tmp = filtered(cmakeVFolder->folderNodes(), [&toKeep](FolderNode *fn) {
return !toKeep.contains(fn);
});
cmakeVFolder->removeFolderNodes(tmp);
return cmakeVFolder; return cmakeVFolder;
} }
@@ -304,11 +288,11 @@ void ServerModeReader::generateProjectTree(CMakeListsNode *root,
if (!m_projects.isEmpty()) if (!m_projects.isEmpty())
root->setDisplayName(m_projects.at(0)->name); root->setDisplayName(m_projects.at(0)->name);
updateCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory, addCMakeInputs(root, m_parameters.sourceDirectory, m_parameters.buildDirectory,
cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther); cmakeFilesSource, cmakeFilesBuild, cmakeFilesOther);
updateCMakeLists(root, cmakeLists); addCMakeLists(root, cmakeLists);
updateProjects(root, m_projects, allFiles); addProjects(root, m_projects, allFiles);
} }
QSet<Core::Id> ServerModeReader::updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) QSet<Core::Id> ServerModeReader::updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder)
@@ -538,7 +522,7 @@ void ServerModeReader::extractCacheData(const QVariantMap &data)
m_cmakeCache = config; m_cmakeCache = config;
} }
void ServerModeReader::updateCMakeLists(CMakeListsNode *root, const QList<FileNode *> &cmakeLists) void ServerModeReader::addCMakeLists(CMakeListsNode *root, const QList<FileNode *> &cmakeLists)
{ {
const QDir baseDir = QDir(m_parameters.sourceDirectory.toString()); const QDir baseDir = QDir(m_parameters.sourceDirectory.toString());
@@ -642,9 +626,9 @@ static CMakeProjectNode *findOrCreateProjectNode(CMakeListsNode *root, const Uti
return pn; return pn;
} }
void ServerModeReader::updateProjects(CMakeListsNode *root, void ServerModeReader::addProjects(CMakeListsNode *root,
const QList<Project *> &projects, const QList<Project *> &projects,
const QList<const FileNode *> &allFiles) const QList<const FileNode *> &allFiles)
{ {
QHash<Utils::FileName, QList<const FileNode *>> includeFiles; QHash<Utils::FileName, QList<const FileNode *>> includeFiles;
for (const FileNode *f : allFiles) { for (const FileNode *f : allFiles) {
@@ -656,12 +640,12 @@ void ServerModeReader::updateProjects(CMakeListsNode *root,
for (const Project *p : projects) { for (const Project *p : projects) {
CMakeProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name); CMakeProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name);
QTC_ASSERT(pNode, continue); QTC_ASSERT(pNode, continue);
updateTargets(root, p->targets, includeFiles); addTargets(root, p->targets, includeFiles);
} }
} }
static CMakeTargetNode *findOrCreateTargetNode(CMakeListsNode *root, const Utils::FileName &dir, static CMakeTargetNode *findOrCreateTargetNode(CMakeListsNode *root, const Utils::FileName &dir,
const QString &displayName) const QString &displayName)
{ {
CMakeListsNode *cmln = findCMakeNode(root, dir); CMakeListsNode *cmln = findCMakeNode(root, dir);
QTC_ASSERT(cmln, return nullptr); QTC_ASSERT(cmln, return nullptr);
@@ -678,22 +662,22 @@ static CMakeTargetNode *findOrCreateTargetNode(CMakeListsNode *root, const Utils
return tn; return tn;
} }
void ServerModeReader::updateTargets(CMakeListsNode *root, void ServerModeReader::addTargets(CMakeListsNode *root,
const QList<ServerModeReader::Target *> &targets, const QList<ServerModeReader::Target *> &targets,
const QHash<FileName, QList<const FileNode *>> &headers) const QHash<FileName, QList<const FileNode *>> &headers)
{ {
for (const Target *t : targets) { for (const Target *t : targets) {
CMakeTargetNode *tNode = findOrCreateTargetNode(root, t->sourceDirectory, t->name); CMakeTargetNode *tNode = findOrCreateTargetNode(root, t->sourceDirectory, t->name);
tNode->setTargetInformation(t->artifacts, t->type); tNode->setTargetInformation(t->artifacts, t->type);
updateFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, headers); addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, headers);
} }
} }
void ServerModeReader::updateFileGroups(ProjectNode *targetRoot, void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
const Utils::FileName &sourceDirectory, const Utils::FileName &sourceDirectory,
const Utils::FileName &buildDirectory, const Utils::FileName &buildDirectory,
const QList<ServerModeReader::FileGroup *> &fileGroups, const QList<ServerModeReader::FileGroup *> &fileGroups,
const QHash<FileName, QList<const FileNode *>> &headers) const QHash<FileName, QList<const FileNode *>> &headers)
{ {
QList<FileNode *> toList; QList<FileNode *> toList;
QSet<Utils::FileName> alreadyListed; QSet<Utils::FileName> alreadyListed;
@@ -737,15 +721,10 @@ void ServerModeReader::updateFileGroups(ProjectNode *targetRoot,
otherFileNodes.append(fn); otherFileNodes.append(fn);
} }
QList<FolderNode *> toKeep; targetRoot->removeFolderNodes();
toKeep.append(setupCMakeVFolder(targetRoot, sourceDirectory, 1000, tr("<Source Directory>"), sourceFileNodes)); addCMakeVFolder(targetRoot, sourceDirectory, 1000, tr("<Source Directory>"), sourceFileNodes);
toKeep.append(setupCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), buildFileNodes)); addCMakeVFolder(targetRoot, buildDirectory, 100, tr("<Build Directory>"), buildFileNodes);
toKeep.append(setupCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), otherFileNodes)); addCMakeVFolder(targetRoot, Utils::FileName(), 10, tr("<Other Locations>"), otherFileNodes);
const QList<FolderNode *> toDelete
= filtered(targetRoot->folderNodes(), [&toKeep](FolderNode *fn) { return !toKeep.contains(fn); });
if (!toDelete.isEmpty())
targetRoot->removeFolderNodes(toDelete);
} }
} // namespace Internal } // namespace Internal

View File

@@ -110,16 +110,16 @@ private:
void extractCMakeInputsData(const QVariantMap &data); void extractCMakeInputsData(const QVariantMap &data);
void extractCacheData(const QVariantMap &data); void extractCacheData(const QVariantMap &data);
void updateCMakeLists(CMakeListsNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists); void addCMakeLists(CMakeListsNode *root, const QList<ProjectExplorer::FileNode *> &cmakeLists);
void updateProjects(CMakeListsNode *root, const QList<Project *> &projects, void addProjects(CMakeListsNode *root, const QList<Project *> &projects,
const QList<const ProjectExplorer::FileNode *> &allFiles); const QList<const ProjectExplorer::FileNode *> &allFiles);
void updateTargets(CMakeListsNode *root, const QList<Target *> &targets, void addTargets(CMakeListsNode *root, const QList<Target *> &targets,
const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers);
void addFileGroups(ProjectExplorer::ProjectNode *targetRoot,
const Utils::FileName &sourceDirectory,
const Utils::FileName &buildDirectory,
const QList<FileGroup *> &fileGroups,
const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers); const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers);
void updateFileGroups(ProjectExplorer::ProjectNode *targetRoot,
const Utils::FileName &sourceDirectory,
const Utils::FileName &buildDirectory,
const QList<FileGroup *> &fileGroups,
const QHash<Utils::FileName, QList<const ProjectExplorer::FileNode *>> &headers);
bool m_hasData = false; bool m_hasData = false;