CMake: Pass const QList<const FileNode *> to Directory Readers

This makes sure they need to copy whatever they need.

Change-Id: I767ac0c5f54ca1f9f46acdefe4bd7fea35657312
Reviewed-by: Alexander Drozdov <adrozdoff@gmail.com>
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2016-12-15 12:53:37 +01:00
parent a347768488
commit 1b2fc1c815
14 changed files with 59 additions and 73 deletions

View File

@@ -243,7 +243,21 @@ CMakeConfig TeaLeafReader::takeParsedConfiguration()
return result;
}
void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList<FileNode *> &allFiles)
static void sanitizeTree(CMakeListsNode *root)
{
QSet<FileName> uniqueFileNames;
QSet<Node *> uniqueNodes;
foreach (FileNode *fn, root->recursiveFileNodes()) {
const int count = uniqueFileNames.count();
uniqueFileNames.insert(fn->filePath());
if (count != uniqueFileNames.count())
uniqueNodes.insert(static_cast<Node *>(fn));
}
root->trim(uniqueNodes);
root->removeProjectNodes(root->projectNodes()); // Remove all project nodes
}
void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList<const FileNode *> &allFiles)
{
root->setDisplayName(m_projectName);
@@ -270,9 +284,8 @@ void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList<FileNo
m_watchedFiles.insert(cm);
}
QList<FileNode *> added;
QList<FileNode *> deleted;
QList<const FileNode *> added;
QList<FileNode *> deleted; // Unused!
ProjectExplorer::compareSortedLists(m_files, allFiles, deleted, added, Node::sortByPath);
QSet<FileName> allIncludePathSet;
@@ -285,37 +298,17 @@ void TeaLeafReader::generateProjectTree(CMakeListsNode *root, const QList<FileNo
}
const QList<FileName> allIncludePaths = allIncludePathSet.toList();
const QList<FileNode *> includedHeaderFiles
= Utils::filtered(allFiles, [&allIncludePaths](const FileNode *fn) -> bool {
const QList<const FileNode *> missingHeaders
= Utils::filtered(added, [&allIncludePaths](const FileNode *fn) -> bool {
if (fn->fileType() != FileType::Header)
return false;
return Utils::contains(allIncludePaths, [fn](const FileName &inc) { return fn->filePath().isChildOf(inc); });
});
const auto knownFiles = QSet<FileName>::fromList(Utils::transform(m_files, [](const FileNode *fn) { return fn->filePath(); }));
QList<FileNode *> uniqueHeaders;
foreach (FileNode *ifn, includedHeaderFiles) {
if (!knownFiles.contains(ifn->filePath())) {
uniqueHeaders.append(ifn);
ifn->setEnabled(false);
}
}
QList<FileNode *> fileNodes = m_files + uniqueHeaders;
// Filter out duplicate nodes that e.g. the servermode reader introduces:
QSet<FileName> uniqueFileNames;
QSet<Node *> uniqueNodes;
foreach (FileNode *fn, root->recursiveFileNodes()) {
const int count = uniqueFileNames.count();
uniqueFileNames.insert(fn->filePath());
if (count != uniqueFileNames.count())
uniqueNodes.insert(static_cast<Node *>(fn));
}
root->trim(uniqueNodes);
root->removeProjectNodes(root->projectNodes()); // Remove all project nodes
QList<FileNode *> fileNodes = m_files + Utils::transform(missingHeaders, [](const FileNode *fn) { return new FileNode(*fn); });
sanitizeTree(root); // Filter out duplicate nodes that e.g. the servermode reader introduces:
root->buildTree(fileNodes, m_parameters.sourceDirectory);
m_files.clear(); // Some of the FileNodes in files() were deleted!
}