CMake: Avoid a bit of useless processing when updating the project tree

Do not pass around a list of filenodes with all the known header files.
That list gets converted into a QSet<FilePath> and then that is used.

Just generate the QSet<FilePath> directly and avoid that conversion.

Change-Id: I2444a2a6b4a1600fe476e66673a1a2e9c8900764
Reviewed-by: Cristian Adam <cristian.adam@qt.io>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Tobias Hunger
2019-06-20 15:51:04 +02:00
parent 129c0abb5a
commit add60c0148
7 changed files with 27 additions and 31 deletions

View File

@@ -384,7 +384,7 @@ void addCompileGroups(ProjectNode *targetRoot,
const Utils::FilePath &sourceDirectory, const Utils::FilePath &sourceDirectory,
const Utils::FilePath &buildDirectory, const Utils::FilePath &buildDirectory,
const TargetDetails &td, const TargetDetails &td,
QVector<FileNode *> &knownHeaderNodes) QSet<FilePath> &knownHeaderNodes)
{ {
const bool inSourceBuild = (sourceDirectory == buildDirectory); const bool inSourceBuild = (sourceDirectory == buildDirectory);
const QDir currentSourceDir(sourceDirectory.toString()); const QDir currentSourceDir(sourceDirectory.toString());
@@ -418,7 +418,7 @@ void addCompileGroups(ProjectNode *targetRoot,
// Register headers: // Register headers:
if (node->fileType() == FileType::Header) if (node->fileType() == FileType::Header)
knownHeaderNodes.append(node.get()); knownHeaderNodes.insert(node->filePath());
// Where does the file node need to go? // Where does the file node need to go?
if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) { if (sourcePath.isChildOf(buildDirectory) && !inSourceBuild) {
@@ -450,7 +450,7 @@ void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cm
const FilePath &topSourceDir, const FilePath &topSourceDir,
const QDir &sourceDir, const QDir &sourceDir,
const QDir &buildDir, const QDir &buildDir,
QVector<ProjectExplorer::FileNode *> &knownHeaderNodes) QSet<FilePath> &knownHeaderNodes)
{ {
for (const FileApiDetails::Target &t : config.targets) { for (const FileApiDetails::Target &t : config.targets) {
const TargetDetails &td = Utils::findOrDefault(targetDetails, const TargetDetails &td = Utils::findOrDefault(targetDetails,
@@ -470,10 +470,10 @@ void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cm
} }
} }
std::pair<std::unique_ptr<CMakeProjectNode>, QVector<FileNode *>> generateRootProjectNode( std::pair<std::unique_ptr<CMakeProjectNode>, QSet<FilePath>> generateRootProjectNode(
PreprocessedData &data, const FilePath &sourceDirectory, const FilePath &buildDirectory) PreprocessedData &data, const FilePath &sourceDirectory, const FilePath &buildDirectory)
{ {
std::pair<std::unique_ptr<CMakeProjectNode>, QVector<FileNode *>> result; std::pair<std::unique_ptr<CMakeProjectNode>, QSet<FilePath>> result;
result.first = std::make_unique<CMakeProjectNode>(sourceDirectory); result.first = std::make_unique<CMakeProjectNode>(sourceDirectory);
const QDir sourceDir(sourceDirectory.toString()); const QDir sourceDir(sourceDirectory.toString());
@@ -488,7 +488,7 @@ std::pair<std::unique_ptr<CMakeProjectNode>, QVector<FileNode *>> generateRootPr
std::move(data.cmakeListNodes)); std::move(data.cmakeListNodes));
data.cmakeListNodes.clear(); // Remove all the nullptr in the vector... data.cmakeListNodes.clear(); // Remove all the nullptr in the vector...
QVector<FileNode *> knownHeaders; QSet<FilePath> knownHeaders;
addProjects(cmakeListsNodes, data.codemodel, sourceDir); addProjects(cmakeListsNodes, data.codemodel, sourceDir);
addTargets(cmakeListsNodes, addTargets(cmakeListsNodes,

View File

@@ -47,7 +47,7 @@ public:
QList<CMakeBuildTarget> buildTargets; QList<CMakeBuildTarget> buildTargets;
CppTools::RawProjectParts projectParts; CppTools::RawProjectParts projectParts;
std::unique_ptr<CMakeProjectNode> rootProjectNode; std::unique_ptr<CMakeProjectNode> rootProjectNode;
QVector<ProjectExplorer::FileNode *> knownHeaders; QSet<Utils::FilePath> knownHeaders;
}; };
FileApiQtcData extractData(FileApiData &data, FileApiQtcData extractData(FileApiData &data,

View File

@@ -82,7 +82,7 @@ private:
QList<CMakeBuildTarget> m_buildTargets; QList<CMakeBuildTarget> m_buildTargets;
CppTools::RawProjectParts m_projectParts; CppTools::RawProjectParts m_projectParts;
std::unique_ptr<CMakeProjectNode> m_rootProjectNode; std::unique_ptr<CMakeProjectNode> m_rootProjectNode;
QVector<ProjectExplorer::FileNode *> m_knownHeaders; QSet<Utils::FilePath> m_knownHeaders;
Utils::optional<QFuture<FileApiQtcData *>> m_future; Utils::optional<QFuture<FileApiQtcData *>> m_future;

View File

@@ -174,7 +174,7 @@ CMakeTargetNode *createTargetNode(const QHash<Utils::FilePath, ProjectNode *> &c
} }
void addHeaderNodes(ProjectNode *root, void addHeaderNodes(ProjectNode *root,
const QVector<FileNode *> knownHeaders, QSet<Utils::FilePath> &seenHeaders,
const QList<const FileNode *> &allFiles) const QList<const FileNode *> &allFiles)
{ {
if (root->isEmpty()) if (root->isEmpty())
@@ -188,9 +188,6 @@ void addHeaderNodes(ProjectNode *root,
QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Headers>")); QCoreApplication::translate("CMakeProjectManager::Internal::ServerModeReader", "<Headers>"));
headerNode->setIcon(headerNodeIcon); headerNode->setIcon(headerNodeIcon);
// knownHeaders are already listed in their targets:
QSet<Utils::FilePath> seenHeaders = Utils::transform<QSet>(knownHeaders, &FileNode::filePath);
// Add scanned headers: // Add scanned headers:
for (const FileNode *fn : allFiles) { for (const FileNode *fn : allFiles) {
if (fn->fileType() != FileType::Header || !fn->filePath().isChildOf(root->filePath())) if (fn->fileType() != FileType::Header || !fn->filePath().isChildOf(root->filePath()))

View File

@@ -67,7 +67,7 @@ CMakeTargetNode *createTargetNode(
const QString &displayName); const QString &displayName);
void addHeaderNodes(ProjectExplorer::ProjectNode *root, void addHeaderNodes(ProjectExplorer::ProjectNode *root,
const QVector<ProjectExplorer::FileNode *> knownHeaders, QSet<Utils::FilePath> &seenHeaders,
const QList<const ProjectExplorer::FileNode *> &allFiles); const QList<const ProjectExplorer::FileNode *> &allFiles);
} // namespace Internal } // namespace Internal

View File

@@ -269,7 +269,7 @@ std::unique_ptr<CMakeProjectNode> ServerModeReader::generateProjectTree(const QL
QHash<Utils::FilePath, ProjectNode *> cmakeListsNodes = addCMakeLists(root.get(), QHash<Utils::FilePath, ProjectNode *> cmakeListsNodes = addCMakeLists(root.get(),
std::move(cmakeLists)); std::move(cmakeLists));
QVector<FileNode *> knownHeaders; QSet<FilePath> knownHeaders;
addProjects(cmakeListsNodes, m_projects, knownHeaders); addProjects(cmakeListsNodes, m_projects, knownHeaders);
addHeaderNodes(root.get(), knownHeaders, allFiles); addHeaderNodes(root.get(), knownHeaders, allFiles);
@@ -755,18 +755,18 @@ void ServerModeReader::fixTarget(ServerModeReader::Target *target) const
void ServerModeReader::addProjects(const QHash<Utils::FilePath, ProjectNode *> &cmakeListsNodes, void ServerModeReader::addProjects(const QHash<Utils::FilePath, ProjectNode *> &cmakeListsNodes,
const QList<Project *> &projects, const QList<Project *> &projects,
QVector<FileNode *> &knownHeaderNodes) QSet<FilePath> &knownHeaders)
{ {
for (const Project *p : projects) { for (const Project *p : projects) {
createProjectNode(cmakeListsNodes, p->sourceDirectory, p->name); createProjectNode(cmakeListsNodes, p->sourceDirectory, p->name);
addTargets(cmakeListsNodes, p->targets, knownHeaderNodes); addTargets(cmakeListsNodes, p->targets, knownHeaders);
} }
} }
void ServerModeReader::addTargets( void ServerModeReader::addTargets(
const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes, const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
const QList<Target *> &targets, const QList<Target *> &targets,
QVector<ProjectExplorer::FileNode *> &knownHeaderNodes) QSet<Utils::FilePath> &knownHeaders)
{ {
for (const Target *t : targets) { for (const Target *t : targets) {
CMakeTargetNode *tNode = createTargetNode(cmakeListsNodes, t->sourceDirectory, t->name); CMakeTargetNode *tNode = createTargetNode(cmakeListsNodes, t->sourceDirectory, t->name);
@@ -802,7 +802,7 @@ void ServerModeReader::addTargets(
} }
} }
tNode->setLocationInfo(info); tNode->setLocationInfo(info);
addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, knownHeaderNodes); addFileGroups(tNode, t->sourceDirectory, t->buildDirectory, t->fileGroups, knownHeaders);
} }
} }
@@ -810,7 +810,7 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
const Utils::FilePath &sourceDirectory, const Utils::FilePath &sourceDirectory,
const Utils::FilePath &buildDirectory, const Utils::FilePath &buildDirectory,
const QList<ServerModeReader::FileGroup *> &fileGroups, const QList<ServerModeReader::FileGroup *> &fileGroups,
QVector<FileNode *> &knownHeaderNodes) QSet<Utils::FilePath> &knownHeaders)
{ {
std::vector<std::unique_ptr<FileNode>> toList; std::vector<std::unique_ptr<FileNode>> toList;
QSet<Utils::FilePath> alreadyListed; QSet<Utils::FilePath> alreadyListed;
@@ -825,13 +825,12 @@ void ServerModeReader::addFileGroups(ProjectNode *targetRoot,
alreadyListed.insert(fn); alreadyListed.insert(fn);
return count != alreadyListed.count(); return count != alreadyListed.count();
}); });
std::vector<std::unique_ptr<FileNode>> newFileNodes std::vector<std::unique_ptr<FileNode>> newFileNodes = Utils::transform<std::vector>(
= Utils::transform<std::vector>(newSources, newSources, [f, &knownHeaders](const Utils::FilePath &fn) {
[f, &knownHeaderNodes](const Utils::FilePath &fn) {
auto node = std::make_unique<FileNode>(fn, Node::fileTypeForFileName(fn)); auto node = std::make_unique<FileNode>(fn, Node::fileTypeForFileName(fn));
node->setIsGenerated(f->isGenerated); node->setIsGenerated(f->isGenerated);
if (node->fileType() == FileType::Header) if (node->fileType() == FileType::Header)
knownHeaderNodes.append(node.get()); knownHeaders.insert(node->filePath());
return node; return node;
}); });
std::move(std::begin(newFileNodes), std::end(newFileNodes), std::back_inserter(toList)); std::move(std::begin(newFileNodes), std::end(newFileNodes), std::back_inserter(toList));

View File

@@ -147,15 +147,15 @@ private:
void addProjects(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes, void addProjects(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
const QList<Project *> &projects, const QList<Project *> &projects,
QVector<ProjectExplorer::FileNode *> &knownHeaderNodes); QSet<Utils::FilePath> &knownHeaders);
void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes, void addTargets(const QHash<Utils::FilePath, ProjectExplorer::ProjectNode *> &cmakeListsNodes,
const QList<Target *> &targets, const QList<Target *> &targets,
QVector<ProjectExplorer::FileNode *> &knownHeaderNodes); QSet<Utils::FilePath> &knownHeaders);
void addFileGroups(ProjectExplorer::ProjectNode *targetRoot, void addFileGroups(ProjectExplorer::ProjectNode *targetRoot,
const Utils::FilePath &sourceDirectory, const Utils::FilePath &sourceDirectory,
const Utils::FilePath &buildDirectory, const Utils::FilePath &buildDirectory,
const QList<FileGroup *> &fileGroups, const QList<FileGroup *> &fileGroups,
QVector<ProjectExplorer::FileNode *> &knowHeaderNodes); QSet<Utils::FilePath> &knownHeaders);
std::unique_ptr<ServerMode> m_cmakeServer; std::unique_ptr<ServerMode> m_cmakeServer;
std::unique_ptr<QFutureInterface<void>> m_future; std::unique_ptr<QFutureInterface<void>> m_future;