forked from qt-creator/qt-creator
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:
@@ -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,
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
|
||||||
|
@@ -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()))
|
||||||
|
@@ -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
|
||||||
|
@@ -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,15 +825,14 @@ 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)
|
knownHeaders.insert(node->filePath());
|
||||||
knownHeaderNodes.append(node.get());
|
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));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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;
|
||||||
|
Reference in New Issue
Block a user