diff options
author | Marco Bubke <marco.bubke@qt.io> | 2019-05-22 12:26:58 +0200 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2019-06-17 10:46:21 +0000 |
commit | b213dee0134722fcdcae88efb514e0430fc72959 (patch) | |
tree | 51b62b0de0c934f30fd49a3a0056e44614f11209 /src/tools | |
parent | 912cb9278f7528709f9edf08060d997c20d3ec8c (diff) |
Clang: Improve updating
If project parts are up to date we send them directly to the indexer, so
the indexer can decide we something needs an update.
Change-Id: I7d4f32794c6b3a861cdefb3653a6dfd4e711f619
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
Diffstat (limited to 'src/tools')
6 files changed, 49 insertions, 25 deletions
diff --git a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp index 9dd1bf3647..9416e310aa 100644 --- a/src/tools/clangpchmanagerbackend/source/pchcreator.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchcreator.cpp @@ -180,7 +180,7 @@ void PchCreator::doInMainThreadAfterFinished() m_buildDependenciesStorage.updatePchCreationTimeStamp(m_projectPartPch.lastModified, m_projectPartPch.projectPartId); m_clangPathwatcher.updateIdPaths({{m_projectPartPch.projectPartId, existingSources}}); - m_pchManagerClient.precompiledHeadersUpdated({m_projectPartPch}); + m_pchManagerClient.precompiledHeadersUpdated({m_projectPartPch.projectPartId}); } } diff --git a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp index c1c12121aa..9cce6ef469 100644 --- a/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp +++ b/src/tools/clangpchmanagerbackend/source/pchmanagerserver.cpp @@ -34,6 +34,7 @@ #include <updategeneratedfilesmessage.h> #include <updateprojectpartsmessage.h> +#include <utils/algorithm.h> #include <utils/smallstring.h> #include <QApplication> @@ -57,18 +58,29 @@ void PchManagerServer::end() QCoreApplication::exit(); } +namespace { +ProjectPartIds toProjectPartIds(const ProjectPartContainers &projectParts) +{ + return Utils::transform<ProjectPartIds>(projectParts, [](const auto &projectPart) { + return projectPart.projectPartId; + }); +} +} // namespace + void PchManagerServer::updateProjectParts(UpdateProjectPartsMessage &&message) { m_toolChainsArgumentsCache.update(message.projectsParts, message.toolChainArguments); - ProjectPartContainers newProjectParts = m_projectPartsManager.update(message.takeProjectsParts()); + auto upToDateProjectParts = m_projectPartsManager.update(message.takeProjectsParts()); if (m_generatedFiles.isValid()) { - m_pchTaskGenerator.addProjectParts(std::move(newProjectParts), + m_pchTaskGenerator.addProjectParts(std::move(upToDateProjectParts.notUpToDate), std::move(message.toolChainArguments)); } else { - m_projectPartsManager.updateDeferred(newProjectParts); + m_projectPartsManager.updateDeferred(upToDateProjectParts.notUpToDate); } + + client()->precompiledHeadersUpdated(toProjectPartIds(upToDateProjectParts.upToDate)); } void PchManagerServer::removeProjectParts(RemoveProjectPartsMessage &&message) diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp index cc4ca53d7d..191a13e16b 100644 --- a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp +++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.cpp @@ -44,34 +44,35 @@ ProjectPartIds toProjectPartIds(const ProjectPartContainers &projectsParts) return ids; } -ProjectPartContainers ProjectPartsManager::update(ProjectPartContainers &&projectsParts) +ProjectPartsManager::UpToDataProjectParts ProjectPartsManager::update(ProjectPartContainers &&projectsParts) { - auto updatedProjectParts = filterNewProjectParts(std::move(projectsParts), m_projectParts); + auto notUpToDateProjectParts = filterProjectParts(projectsParts, m_projectParts); - if (updatedProjectParts.empty()) - return {}; + if (notUpToDateProjectParts.empty()) + return {std::move(projectsParts), {}}; auto persistentProjectParts = m_projectPartsStorage.fetchProjectParts( - toProjectPartIds(updatedProjectParts)); + toProjectPartIds(notUpToDateProjectParts)); if (persistentProjectParts.size() > 0) { mergeProjectParts(persistentProjectParts); - updatedProjectParts = filterNewProjectParts(std::move(updatedProjectParts), - persistentProjectParts); + notUpToDateProjectParts = filterProjectParts(notUpToDateProjectParts, persistentProjectParts); - if (updatedProjectParts.empty()) + if (notUpToDateProjectParts.empty()) return {}; } - m_projectPartsStorage.updateProjectParts(updatedProjectParts); - m_projectPartsStorage.resetIndexingTimeStamps(updatedProjectParts); + m_projectPartsStorage.updateProjectParts(notUpToDateProjectParts); + m_projectPartsStorage.resetIndexingTimeStamps(notUpToDateProjectParts); m_precompiledHeaderStorage.deleteProjectPrecompiledHeaders( - toProjectPartIds(updatedProjectParts)); + toProjectPartIds(notUpToDateProjectParts)); - mergeProjectParts(updatedProjectParts); + mergeProjectParts(notUpToDateProjectParts); - return updatedProjectParts; + auto upToDateProjectParts = filterProjectParts(projectsParts, notUpToDateProjectParts); + + return {upToDateProjectParts, notUpToDateProjectParts}; } void ProjectPartsManager::remove(const ProjectPartIds &projectPartIds) @@ -176,8 +177,8 @@ ProjectPartContainers ProjectPartsManager::deferredUpdates() return deferredProjectParts; } -ProjectPartContainers ProjectPartsManager::filterNewProjectParts( - ProjectPartContainers &&projectsParts, const ProjectPartContainers &oldProjectParts) +ProjectPartContainers ProjectPartsManager::filterProjectParts( + const ProjectPartContainers &projectsParts, const ProjectPartContainers &oldProjectParts) { ProjectPartContainers updatedProjectPartContainers; updatedProjectPartContainers.reserve(projectsParts.size()); diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h index 323e6c6825..35d9e41c1c 100644 --- a/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h +++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanager.h @@ -36,6 +36,7 @@ namespace ClangBackEnd { inline namespace Pch { + class ProjectPartsManager final : public ProjectPartsManagerInterface { public: @@ -45,14 +46,14 @@ public: , m_precompiledHeaderStorage(precompiledHeaderStorage) {} - ProjectPartContainers update(ProjectPartContainers &&projectsParts) override; + UpToDataProjectParts update(ProjectPartContainers &&projectsParts) override; void remove(const ProjectPartIds &projectPartIds) override; ProjectPartContainers projects(const ProjectPartIds &projectPartIds) const override; void updateDeferred(const ProjectPartContainers &projectsParts) override; ProjectPartContainers deferredUpdates() override; - static ProjectPartContainers filterNewProjectParts(ProjectPartContainers &&newProjectsParts, - const ProjectPartContainers &oldProjectParts); + static ProjectPartContainers filterProjectParts(const ProjectPartContainers &newProjectsParts, + const ProjectPartContainers &oldProjectParts); void mergeProjectParts(const ProjectPartContainers &projectsParts); const ProjectPartContainers &projectParts() const; diff --git a/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h b/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h index ee80173f8a..54bae58c1a 100644 --- a/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h +++ b/src/tools/clangpchmanagerbackend/source/projectpartsmanagerinterface.h @@ -32,11 +32,18 @@ namespace ClangBackEnd { class ProjectPartsManagerInterface { public: + class UpToDataProjectParts + { + public: + ProjectPartContainers upToDate; + ProjectPartContainers notUpToDate; + }; + ProjectPartsManagerInterface() = default; ProjectPartsManagerInterface(const ProjectPartsManagerInterface &) = delete; ProjectPartsManagerInterface &operator=(const ProjectPartsManagerInterface &) = delete; - virtual ProjectPartContainers update(ProjectPartContainers &&projectsParts) = 0; + virtual UpToDataProjectParts update(ProjectPartContainers &&projectsParts) = 0; virtual void remove(const ProjectPartIds &projectPartIds) = 0; virtual ProjectPartContainers projects(const ProjectPartIds &projectPartIds) const = 0; virtual void updateDeferred(const ProjectPartContainers &projectsParts) = 0; diff --git a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp index 86e5fb597c..f44b3134a2 100644 --- a/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp +++ b/src/tools/clangrefactoringbackend/source/indexdataconsumer.cpp @@ -32,6 +32,8 @@ #include <llvm/ADT/ArrayRef.h> +#include <iostream> + namespace ClangBackEnd { namespace { @@ -136,9 +138,10 @@ bool IndexDataConsumer::handleDeclOccurence( if (!namedDeclaration->getIdentifier()) return true; - if (skipSymbol(m_sourceManager->getFileID(sourceLocation), symbolRoles)) - + if (skipSymbol(m_sourceManager->getFileID(sourceLocation), symbolRoles)) { + namedDeclaration->getDeclName().dump(); return true; + } SymbolIndex globalId = toSymbolIndex(declaration->getCanonicalDecl()); |