diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp index 860b41b04de..2d1d758272b 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp @@ -30,9 +30,6 @@ namespace ClangCodeModel { ClangEditorDocumentParser::ClangEditorDocumentParser(const QString &filePath) : BaseEditorDocumentParser(filePath) { - BaseEditorDocumentParser::Configuration config = configuration(); - config.stickToPreviousProjectPart = false; - setConfiguration(config); } void ClangEditorDocumentParser::updateImpl(const QFutureInterface &, @@ -41,7 +38,7 @@ void ClangEditorDocumentParser::updateImpl(const QFutureInterface &, State state_ = state(); state_.projectPartInfo = determineProjectPart(filePath(), configuration(), - state_, + state_.projectPartInfo, updateParams.activeProject, updateParams.languagePreference, updateParams.hasActiveProjectChanged); diff --git a/src/plugins/cpptools/baseeditordocumentparser.cpp b/src/plugins/cpptools/baseeditordocumentparser.cpp index 617c61de0ad..c0a5945bb5a 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.cpp +++ b/src/plugins/cpptools/baseeditordocumentparser.cpp @@ -122,7 +122,7 @@ BaseEditorDocumentParser::Ptr BaseEditorDocumentParser::get(const QString &fileP ProjectPartInfo BaseEditorDocumentParser::determineProjectPart( const QString &filePath, const Configuration &config, - const State &state, + const ProjectPartInfo ¤tProjectPartInfo, const ProjectExplorer::Project *activeProject, Language languagePreference, bool hasActiveProjectChanged) @@ -143,9 +143,8 @@ ProjectPartInfo BaseEditorDocumentParser::determineProjectPart( const ProjectPartInfo chooserResult = chooser.choose(filePath, - state.projectPartInfo.projectPart, + currentProjectPartInfo, config.manuallySetProjectPart, - config.stickToPreviousProjectPart, activeProject, languagePreference, hasActiveProjectChanged); diff --git a/src/plugins/cpptools/baseeditordocumentparser.h b/src/plugins/cpptools/baseeditordocumentparser.h index 1cf71fefc6b..627c8c4655e 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.h +++ b/src/plugins/cpptools/baseeditordocumentparser.h @@ -47,7 +47,6 @@ public: static Ptr get(const QString &filePath); struct Configuration { - bool stickToPreviousProjectPart = true; bool usePrecompiledHeaders = false; QByteArray editorDefines; ProjectPart::Ptr manuallySetProjectPart; @@ -95,10 +94,9 @@ protected: State state() const; void setState(const State &state); - static ProjectPartInfo determineProjectPart( - const QString &filePath, + static ProjectPartInfo determineProjectPart(const QString &filePath, const Configuration &config, - const State &state, + const ProjectPartInfo ¤tProjectPartInfo, const ProjectExplorer::Project *activeProject, Language languagePreference, bool hasActiveProjectChanged); diff --git a/src/plugins/cpptools/builtineditordocumentparser.cpp b/src/plugins/cpptools/builtineditordocumentparser.cpp index 236a95f3260..f521a27aafb 100644 --- a/src/plugins/cpptools/builtineditordocumentparser.cpp +++ b/src/plugins/cpptools/builtineditordocumentparser.cpp @@ -79,7 +79,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface &futur baseState.projectPartInfo = determineProjectPart(filePath(), baseConfig, - baseState, + baseState.projectPartInfo, updateParams.activeProject, updateParams.languagePreference, updateParams.hasActiveProjectChanged); diff --git a/src/plugins/cpptools/cppprojectpartchooser.cpp b/src/plugins/cpptools/cppprojectpartchooser.cpp index 816bddb5928..85dbf254e86 100644 --- a/src/plugins/cpptools/cppprojectpartchooser.cpp +++ b/src/plugins/cpptools/cppprojectpartchooser.cpp @@ -124,9 +124,8 @@ private: ProjectPartInfo ProjectPartChooser::choose( const QString &filePath, - const ProjectPart::Ptr ¤tProjectPart, + const ProjectPartInfo ¤tProjectPartInfo, const ProjectPart::Ptr &manuallySetProjectPart, - bool stickToPreviousProjectPart, const ProjectExplorer::Project *activeProject, Language languagePreference, bool projectHasChanged) const @@ -138,15 +137,14 @@ ProjectPartInfo ProjectPartChooser::choose( if (manuallySetProjectPart) return {manuallySetProjectPart, ProjectPartInfo::NoHint}; - ProjectPart::Ptr projectPart = currentProjectPart; + ProjectPart::Ptr projectPart = currentProjectPartInfo.projectPart; ProjectPartInfo::Hint hint = ProjectPartInfo::NoHint; QList projectParts = m_projectPartsForFile(filePath); if (projectParts.isEmpty()) { - if (projectPart && stickToPreviousProjectPart) - // File is not directly part of any project, but we got one before. We will re-use it, - // because re-calculating this can be expensive when the dependency table is big. - return {projectPart, ProjectPartInfo::NoHint}; + if (projectPart && currentProjectPartInfo.hint == ProjectPartInfo::IsFallbackMatch) + // Avoid re-calculating the expensive dependency table for non-project files. + return {projectPart, ProjectPartInfo::IsFallbackMatch}; // Fall-back step 1: Get some parts through the dependency table: projectParts = m_projectPartsFromDependenciesForFile(filePath); diff --git a/src/plugins/cpptools/cppprojectpartchooser.h b/src/plugins/cpptools/cppprojectpartchooser.h index 940c2c092ed..74d4b2dcb58 100644 --- a/src/plugins/cpptools/cppprojectpartchooser.h +++ b/src/plugins/cpptools/cppprojectpartchooser.h @@ -50,9 +50,8 @@ public: ProjectPartInfo choose( const QString &filePath, - const ProjectPart::Ptr ¤tProjectPart, + const ProjectPartInfo ¤tProjectPartInfo, const ProjectPart::Ptr &manuallySetProjectPart, - bool stickToPreviousProjectPart, const ProjectExplorer::Project *activeProject, Language languagePreference, bool projectHasChanged) const; diff --git a/tests/unit/unittest/cppprojectpartchooser-test.cpp b/tests/unit/unittest/cppprojectpartchooser-test.cpp index 47a47de9bea..2eb0f59c91f 100644 --- a/tests/unit/unittest/cppprojectpartchooser-test.cpp +++ b/tests/unit/unittest/cppprojectpartchooser-test.cpp @@ -49,9 +49,9 @@ protected: protected: QString filePath; - ProjectPart::Ptr currentProjectPart{new ProjectPart}; + ProjectPartInfo currentProjectPartInfo{ProjectPart::Ptr(new ProjectPart), + ProjectPartInfo::NoHint}; ProjectPart::Ptr manuallySetProjectPart; - bool stickToPreviousProjectPart = false; const ProjectExplorer::Project *activeProject = nullptr; bool projectHasChanged = false; Language languagePreference = Language::Cxx; @@ -75,11 +75,11 @@ TEST_F(ProjectPartChooser, ForMultipleChoosePrevious) { const ProjectPart::Ptr otherProjectPart; projectPartsForFile += otherProjectPart; - projectPartsForFile += currentProjectPart; + projectPartsForFile += currentProjectPartInfo.projectPart; const ProjectPart::Ptr chosen = choose().projectPart; - ASSERT_THAT(chosen, Eq(currentProjectPart)); + ASSERT_THAT(chosen, Eq(currentProjectPartInfo.projectPart)); } TEST_F(ProjectPartChooser, ForMultipleChooseFromActiveProject) @@ -126,7 +126,7 @@ TEST_F(ProjectPartChooser, ForMultipleCheckIfActiveProjectChanged) const ProjectPart::Ptr firstProjectPart = projectParts.at(0); const ProjectPart::Ptr secondProjectPart = projectParts.at(1); projectPartsForFile += projectParts; - currentProjectPart = firstProjectPart; + currentProjectPartInfo.projectPart = firstProjectPart; activeProject = secondProjectPart->project; projectHasChanged = true; @@ -168,25 +168,6 @@ TEST_F(ProjectPartChooser, IndicateMultiple) ASSERT_THAT(hint, Eq(ProjectPartInfo::Hint::IsAmbiguousMatch)); } -TEST_F(ProjectPartChooser, IfProjectIsGoneStickToPrevious) // Built-in Code Model -{ - stickToPreviousProjectPart = true; - - const ProjectPart::Ptr chosen = choose().projectPart; - - ASSERT_THAT(chosen, Eq(currentProjectPart)); -} - -TEST_F(ProjectPartChooser, IfProjectIsGoneDoNotStickToPrevious) // Clang Code Model -{ - currentProjectPart.clear(); - stickToPreviousProjectPart = true; - - const ProjectPart::Ptr chosen = choose().projectPart; - - ASSERT_THAT(chosen, Eq(ProjectPart::Ptr())); -} - TEST_F(ProjectPartChooser, ForMultipleChooseNewIfPreviousIsGone) { const ProjectPart::Ptr newProjectPart{new ProjectPart}; @@ -216,6 +197,32 @@ TEST_F(ProjectPartChooser, FallbackToProjectPartFromModelManager) ASSERT_THAT(chosen, Eq(fallbackProjectPart)); } +TEST_F(ProjectPartChooser, ContinueUsingFallbackFromModelManagerIfProjectDoesNotChange) +{ + // ...without re-calculating the dependency table. + fallbackProjectPart.reset(new ProjectPart); + currentProjectPartInfo.projectPart = fallbackProjectPart; + currentProjectPartInfo.hint = ProjectPartInfo::IsFallbackMatch; + projectPartsFromDependenciesForFile += ProjectPart::Ptr(new ProjectPart); + + const ProjectPart::Ptr chosen = choose().projectPart; + + ASSERT_THAT(chosen, Eq(fallbackProjectPart)); +} + +TEST_F(ProjectPartChooser, StopUsingFallbackFromModelManagerIfProjectChanges) +{ + fallbackProjectPart.reset(new ProjectPart); + currentProjectPartInfo.projectPart = fallbackProjectPart; + currentProjectPartInfo.hint = ProjectPartInfo::IsFallbackMatch; + const ProjectPart::Ptr addedProject(new ProjectPart); + projectPartsForFile += addedProject; + + const ProjectPart::Ptr chosen = choose().projectPart; + + ASSERT_THAT(chosen, Eq(addedProject)); +} + TEST_F(ProjectPartChooser, IndicateFallbacktoProjectPartFromModelManager) { fallbackProjectPart.reset(new ProjectPart); @@ -241,9 +248,8 @@ void ProjectPartChooser::SetUp() const ProjectPartInfo ProjectPartChooser::choose() const { return chooser.choose(filePath, - currentProjectPart, + currentProjectPartInfo, manuallySetProjectPart, - stickToPreviousProjectPart, activeProject, languagePreference, projectHasChanged);