diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp index e12833ca9a1..9b342bd7d1a 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp @@ -94,7 +94,7 @@ void ClangEditorDocumentParser::update(CppTools::WorkingCopy workingCopy) QMutexLocker lock(m_marker->mutex()); QMutexLocker lock2(&m_mutex); - updateProjectPart(); + m_projectPart = determineProjectPart(); const QStringList options = createOptions(filePath(), projectPart(), true); qCDebug(log, "Reparse options (cmd line equivalent): %s", diff --git a/src/plugins/cpptools/baseeditordocumentparser.cpp b/src/plugins/cpptools/baseeditordocumentparser.cpp index 7f1e74785b1..d24e341b1f2 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.cpp +++ b/src/plugins/cpptools/baseeditordocumentparser.cpp @@ -45,7 +45,7 @@ namespace CppTools { the "best" project part for a file. Derived classes are expected to implement update() by using the protected - mutex, updateProjectPart() and by respecting the options set by the client. + mutex, determineProjectPart() and by respecting the options set by the client. */ BaseEditorDocumentParser::BaseEditorDocumentParser(const QString &filePath) @@ -115,33 +115,35 @@ BaseEditorDocumentParser *BaseEditorDocumentParser::get(const QString &filePath) return 0; } -void BaseEditorDocumentParser::updateProjectPart() +ProjectPart::Ptr BaseEditorDocumentParser::determineProjectPart() const { - if (m_manuallySetProjectPart) { - m_projectPart = m_manuallySetProjectPart; - return; - } + if (m_manuallySetProjectPart) + return m_manuallySetProjectPart; + + ProjectPart::Ptr projectPart = m_projectPart; CppModelManager *cmm = CppModelManager::instance(); QList projectParts = cmm->projectPart(m_filePath); if (projectParts.isEmpty()) { - if (m_projectPart) + if (projectPart) // 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; + return projectPart; // Fall-back step 1: Get some parts through the dependency table: projectParts = cmm->projectPartFromDependencies(Utils::FileName::fromString(m_filePath)); if (projectParts.isEmpty()) // Fall-back step 2: Use fall-back part from the model manager: - m_projectPart = cmm->fallbackProjectPart(); + projectPart = cmm->fallbackProjectPart(); else - m_projectPart = projectParts.first(); + projectPart = projectParts.first(); } else { - if (!projectParts.contains(m_projectPart)) + if (!projectParts.contains(projectPart)) // Apparently the project file changed, so update our project part. - m_projectPart = projectParts.first(); + projectPart = projectParts.first(); } + + return projectPart; } bool BaseEditorDocumentParser::editorDefinesChanged() const diff --git a/src/plugins/cpptools/baseeditordocumentparser.h b/src/plugins/cpptools/baseeditordocumentparser.h index ddd12fbb0aa..c8f5704a9dc 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.h +++ b/src/plugins/cpptools/baseeditordocumentparser.h @@ -63,18 +63,18 @@ public: static BaseEditorDocumentParser *get(const QString &filePath); protected: - void updateProjectPart(); + ProjectPart::Ptr determineProjectPart() const; bool editorDefinesChanged() const; void resetEditorDefinesChanged(); protected: mutable QMutex m_mutex; + ProjectPart::Ptr m_projectPart; private: const QString m_filePath; - ProjectPart::Ptr m_projectPart; ProjectPart::Ptr m_manuallySetProjectPart; bool m_usePrecompiledHeaders; diff --git a/src/plugins/cpptools/builtineditordocumentparser.cpp b/src/plugins/cpptools/builtineditordocumentparser.cpp index 24ae027bfc4..8c2232f1422 100644 --- a/src/plugins/cpptools/builtineditordocumentparser.cpp +++ b/src/plugins/cpptools/builtineditordocumentparser.cpp @@ -62,7 +62,7 @@ void BuiltinEditorDocumentParser::update(WorkingCopy workingCopy) QString projectConfigFile; LanguageFeatures features = LanguageFeatures::defaultFeatures(); - updateProjectPart(); + m_projectPart = determineProjectPart(); if (m_forceSnapshotInvalidation) { invalidateSnapshot = true;