From 7290c43da14c1f416c8de0654d8f335a3b271989 Mon Sep 17 00:00:00 2001 From: Erik Verbruggen Date: Fri, 12 Sep 2014 14:14:18 +0200 Subject: [PATCH] C++: update project info once after finishing adding all project parts. So that recalculating the information is not O(n^2) but linear. Change-Id: I69903e0b5ad321d071804d782ad634a3f300e71a Reviewed-by: Daniel Teske Reviewed-by: Nikolai Kosjar --- .../autotoolsproject.cpp | 1 + .../cmakeprojectmanager/cmakeproject.cpp | 1 + src/plugins/cpptools/cppmodelmanager_test.cpp | 16 +++++++ src/plugins/cpptools/cppprojects.cpp | 47 ++++++++++--------- src/plugins/cpptools/cppprojects.h | 1 + .../genericprojectmanager/genericproject.cpp | 1 + src/plugins/qbsprojectmanager/qbsproject.cpp | 1 + .../qmakeprojectmanager/qmakeproject.cpp | 1 + 8 files changed, 46 insertions(+), 23 deletions(-) diff --git a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp index 9aed98c62a1..91ddbdde669 100644 --- a/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp +++ b/src/plugins/autotoolsprojectmanager/autotoolsproject.cpp @@ -426,5 +426,6 @@ void AutotoolsProject::updateCppCodeModel() foreach (Core::Id language, languages) setProjectLanguage(language, true); + pInfo.finish(); m_codeModelFuture = modelManager->updateProjectInfo(pInfo); } diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 3514883baf5..4816f212368 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -350,6 +350,7 @@ bool CMakeProject::parseCMakeLists() } m_codeModelFuture.cancel(); + pinfo.finish(); m_codeModelFuture = modelmanager->updateProjectInfo(pinfo); } diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index 1cebc411a43..95d9c5b8160 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -104,6 +104,7 @@ public: part->files.append(projectFile); } projectInfo.appendProjectPart(part); + projectInfo.finish(); } ModelManagerTestHelper *modelManagerTestHelper; @@ -227,6 +228,7 @@ void CppToolsPlugin::test_modelmanager_paths_are_clean() << HeaderPath(testDataDir.includeDir(false), HeaderPath::IncludePath) << HeaderPath(testDataDir.frameworksDir(false), HeaderPath::FrameworkPath); pi.appendProjectPart(part); + pi.finish(); mm->updateProjectInfo(pi); @@ -265,6 +267,7 @@ void CppToolsPlugin::test_modelmanager_framework_headers() _("test_modelmanager_framework_headers.cpp")); part->files << ProjectFile(source, ProjectFile::CXXSource); pi.appendProjectPart(part); + pi.finish(); mm->updateProjectInfo(pi).waitForFinished(); QCoreApplication::processEvents(); @@ -314,6 +317,7 @@ void CppToolsPlugin::test_modelmanager_refresh_also_includes_of_project_files() << HeaderPath(testDataDir.includeDir(false), HeaderPath::IncludePath); part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); pi.appendProjectPart(part); + pi.finish(); QSet refreshedFiles = updateProjectInfo(mm, &helper, pi); QCOMPARE(refreshedFiles.size(), 1); @@ -331,6 +335,7 @@ void CppToolsPlugin::test_modelmanager_refresh_also_includes_of_project_files() part->projectDefines = QByteArray("#define TEST_DEFINE 1\n"); pi.clearProjectParts(); pi.appendProjectPart(part); + pi.finish(); refreshedFiles = updateProjectInfo(mm, &helper, pi); @@ -372,6 +377,7 @@ void CppToolsPlugin::test_modelmanager_refresh_several_times() part->files.append(ProjectFile(testHeader2, ProjectFile::CXXHeader)); part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); pi.appendProjectPart(part); + pi.finish(); mm->updateProjectInfo(pi); CPlusPlus::Snapshot snapshot; @@ -391,6 +397,7 @@ void CppToolsPlugin::test_modelmanager_refresh_several_times() part->files.append(ProjectFile(testHeader2, ProjectFile::CXXHeader)); part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); pi.appendProjectPart(part); + pi.finish(); refreshedFiles = updateProjectInfo(mm, &helper, pi); QCOMPARE(refreshedFiles.size(), 3); @@ -435,6 +442,7 @@ void CppToolsPlugin::test_modelmanager_refresh_test_for_changes() part->qtVersion = ProjectPart::Qt5; part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); pi.appendProjectPart(part); + pi.finish(); // Reindexing triggers a reparsing thread helper.resetRefreshedSourceFiles(); @@ -473,6 +481,7 @@ void CppToolsPlugin::test_modelmanager_refresh_added_and_purge_removed() part->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); part->files.append(ProjectFile(testHeader1, ProjectFile::CXXHeader)); pi.appendProjectPart(part); + pi.finish(); CPlusPlus::Snapshot snapshot; QSet refreshedFiles; @@ -495,6 +504,7 @@ void CppToolsPlugin::test_modelmanager_refresh_added_and_purge_removed() newPart->files.append(ProjectFile(testCpp, ProjectFile::CXXSource)); newPart->files.append(ProjectFile(testHeader2, ProjectFile::CXXHeader)); pi.appendProjectPart(newPart); + pi.finish(); refreshedFiles = updateProjectInfo(mm, &helper, pi); @@ -529,7 +539,9 @@ void CppToolsPlugin::test_modelmanager_refresh_timeStampModified_if_sourcefiles_ part->qtVersion = ProjectPart::Qt5; foreach (const ProjectFile &file, initialProjectFiles) part->files.append(file); + pi.clearProjectParts(); pi.appendProjectPart(part); + pi.finish(); Document::Ptr document; CPlusPlus::Snapshot snapshot; @@ -563,6 +575,7 @@ void CppToolsPlugin::test_modelmanager_refresh_timeStampModified_if_sourcefiles_ part->files.append(file); pi.clearProjectParts(); pi.appendProjectPart(part); + pi.finish(); refreshedFiles = updateProjectInfo(mm, &helper, pi); @@ -835,6 +848,7 @@ void CppToolsPlugin::test_modelmanager_defines_per_project() ProjectInfo pi = mm->projectInfo(project); pi.appendProjectPart(part1); pi.appendProjectPart(part2); + pi.finish(); updateProjectInfo(mm, &helper, pi); QCOMPARE(mm->snapshot().size(), 4); @@ -910,6 +924,7 @@ void CppToolsPlugin::test_modelmanager_precompiled_headers() ProjectInfo pi = mm->projectInfo(project); pi.appendProjectPart(part1); pi.appendProjectPart(part2); + pi.finish(); updateProjectInfo(mm, &helper, pi); QCOMPARE(mm->snapshot().size(), 4); @@ -990,6 +1005,7 @@ void CppToolsPlugin::test_modelmanager_defines_per_editor() ProjectInfo pi = mm->projectInfo(project); pi.appendProjectPart(part1); pi.appendProjectPart(part2); + pi.finish(); updateProjectInfo(mm, &helper, pi); diff --git a/src/plugins/cpptools/cppprojects.cpp b/src/plugins/cpptools/cppprojects.cpp index eb99b11626d..5f4e1f009f0 100644 --- a/src/plugins/cpptools/cppprojects.cpp +++ b/src/plugins/cpptools/cppprojects.cpp @@ -166,35 +166,36 @@ const QList ProjectInfo::projectParts() const void ProjectInfo::appendProjectPart(const ProjectPart::Ptr &part) { - if (!part) - return; - - m_projectParts.append(part); + if (part) + m_projectParts.append(part); +} +void ProjectInfo::finish() +{ typedef ProjectPart::HeaderPath HeaderPath; - // Update header paths - QSet incs = QSet::fromList(m_headerPaths); - foreach (const HeaderPath &hp, part->headerPaths) { - if (!incs.contains(hp)) { - incs.insert(hp); - m_headerPaths += hp; + QSet incs; + foreach (const ProjectPart::Ptr &part, m_projectParts) { + // Update header paths + foreach (const HeaderPath &hp, part->headerPaths) { + if (!incs.contains(hp)) { + incs.insert(hp); + m_headerPaths += hp; + } } - } - // Update source files - foreach (const ProjectFile &file, part->files) - m_sourceFiles.insert(file.path); + // Update source files + foreach (const ProjectFile &file, part->files) + m_sourceFiles.insert(file.path); - // Update defines - if (!m_defines.isEmpty()) - m_defines.append('\n'); - m_defines.append(part->toolchainDefines); - m_defines.append(part->projectDefines); - if (!part->projectConfigFile.isEmpty()) { - m_defines.append('\n'); - m_defines += ProjectPart::readProjectConfigFile(part); - m_defines.append('\n'); + // Update defines + m_defines.append(part->toolchainDefines); + m_defines.append(part->projectDefines); + if (!part->projectConfigFile.isEmpty()) { + m_defines.append('\n'); + m_defines += ProjectPart::readProjectConfigFile(part); + m_defines.append('\n'); + } } } diff --git a/src/plugins/cpptools/cppprojects.h b/src/plugins/cpptools/cppprojects.h index 056790b113e..c126b51e0fd 100644 --- a/src/plugins/cpptools/cppprojects.h +++ b/src/plugins/cpptools/cppprojects.h @@ -146,6 +146,7 @@ public: const QList projectParts() const; void appendProjectPart(const ProjectPart::Ptr &part); + void finish(); void clearProjectParts(); const ProjectPart::HeaderPaths headerPaths() const; diff --git a/src/plugins/genericprojectmanager/genericproject.cpp b/src/plugins/genericprojectmanager/genericproject.cpp index 57dcbc73a13..51dcdbd2364 100644 --- a/src/plugins/genericprojectmanager/genericproject.cpp +++ b/src/plugins/genericprojectmanager/genericproject.cpp @@ -346,6 +346,7 @@ void GenericProject::refreshCppCodeModel() foreach (Core::Id language, languages) setProjectLanguage(language, true); + pInfo.finish(); m_codeModelFuture = modelManager->updateProjectInfo(pInfo); } diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index fdd48cb3e8e..e22992bf9b4 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -741,6 +741,7 @@ void QbsProject::updateCppCodeModel(const qbs::ProjectData &prj) if (pinfo.projectParts().isEmpty()) return; + pinfo.finish(); QtSupport::UiCodeModelManager::update(this, uiFiles); diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 89eef3cc424..6afc4a3be81 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -620,6 +620,7 @@ void QmakeProject::updateCppCodeModel() if (!cppPart->files.isEmpty()) objcppPart->displayName += QLatin1String(" (ObjC++)"); } + pinfo.finish(); // Also update Ui Code Model Support: QtSupport::UiCodeModelManager::update(this, uiCodeModelData);