diff --git a/src/plugins/cpptools/cppmodelmanager.cpp b/src/plugins/cpptools/cppmodelmanager.cpp index a07bf91238a..2fb94adea90 100644 --- a/src/plugins/cpptools/cppmodelmanager.cpp +++ b/src/plugins/cpptools/cppmodelmanager.cpp @@ -629,21 +629,9 @@ public: , m_newSourceFiles(newProjectInfo.sourceFiles()) {} - bool definesChanged() const - { - return m_new.defines() != m_old.defines(); - } - - bool configurationChanged() const - { - return definesChanged() - || m_new.headerPaths() != m_old.headerPaths(); - } - - bool nothingChanged() const - { - return !configurationChanged() && m_new.sourceFiles() == m_old.sourceFiles(); - } + bool definesChanged() const { return m_new.definesChanged(m_old); } + bool configurationChanged() const { return m_new.configurationChanged(m_old); } + bool configurationOrFilesChanged() const { return m_new.configurationOrFilesChanged(m_old); } QSet addedFiles() const { @@ -735,8 +723,12 @@ QFuture CppModelManager::updateProjectInfo(const ProjectInfo &newProjectIn ProjectInfo oldProjectInfo = d->m_projectToProjectsInfo.value(project); if (oldProjectInfo.isValid()) { ProjectInfoComparer comparer(oldProjectInfo, newProjectInfo); - if (comparer.nothingChanged()) + + if (!comparer.configurationOrFilesChanged()) { + // Some other attached data might have changed + d->m_projectToProjectsInfo.insert(project, newProjectInfo); return QFuture(); + } // If the project configuration changed, do a full reindexing if (comparer.configurationChanged()) { diff --git a/src/plugins/cpptools/cppprojects.cpp b/src/plugins/cpptools/cppprojects.cpp index 4aab008f28c..710a387f3a4 100644 --- a/src/plugins/cpptools/cppprojects.cpp +++ b/src/plugins/cpptools/cppprojects.cpp @@ -137,6 +137,36 @@ ProjectInfo::ProjectInfo(QPointer project) : m_project(project) {} +bool ProjectInfo::operator ==(const ProjectInfo &other) const +{ + return m_project == other.m_project + && m_projectParts == other.m_projectParts + && m_compilerCallData == other.m_compilerCallData + && m_headerPaths == other.m_headerPaths + && m_sourceFiles == other.m_sourceFiles + && m_defines == other.m_defines; +} + +bool ProjectInfo::operator !=(const ProjectInfo &other) const +{ + return !operator ==(other); +} + +bool ProjectInfo::definesChanged(const ProjectInfo &other) const +{ + return m_defines != other.m_defines; +} + +bool ProjectInfo::configurationChanged(const ProjectInfo &other) const +{ + return definesChanged(other) || m_headerPaths != other.m_headerPaths; +} + +bool ProjectInfo::configurationOrFilesChanged(const ProjectInfo &other) const +{ + return configurationChanged(other) || m_sourceFiles != other.m_sourceFiles; +} + bool ProjectInfo::isValid() const { return !m_project.isNull(); @@ -193,6 +223,7 @@ void ProjectInfo::clearProjectParts() m_headerPaths.clear(); m_sourceFiles.clear(); m_defines.clear(); + m_compilerCallData.clear(); } const ProjectPart::HeaderPaths ProjectInfo::headerPaths() const @@ -210,6 +241,16 @@ const QByteArray ProjectInfo::defines() const return m_defines; } +void ProjectInfo::setCompilerCallData(const CompilerCallData &data) +{ + m_compilerCallData = data; +} + +ProjectInfo::CompilerCallData ProjectInfo::compilerCallData() const +{ + return m_compilerCallData; +} + namespace { class ProjectFileCategorizer { diff --git a/src/plugins/cpptools/cppprojects.h b/src/plugins/cpptools/cppprojects.h index 5277a0a9dac..b1ef7553112 100644 --- a/src/plugins/cpptools/cppprojects.h +++ b/src/plugins/cpptools/cppprojects.h @@ -142,6 +142,12 @@ public: bool isValid() const; + bool operator ==(const ProjectInfo &other) const; + bool operator !=(const ProjectInfo &other) const; + bool definesChanged(const ProjectInfo &other) const; + bool configurationChanged(const ProjectInfo &other) const; + bool configurationOrFilesChanged(const ProjectInfo &other) const; + QPointer project() const; const QList projectParts() const; @@ -153,10 +159,16 @@ public: const QSet sourceFiles() const; const QByteArray defines() const; + // Source file --> List of compiler calls + typedef QHash> CompilerCallData; + void setCompilerCallData(const CompilerCallData &data); + CompilerCallData compilerCallData() const; + private: QPointer m_project; QList m_projectParts; - // The members below are (re)calculated from the project parts once a part is appended. + CompilerCallData m_compilerCallData; + // The members below are (re)calculated from the project parts with finish() ProjectPart::HeaderPaths m_headerPaths; QSet m_sourceFiles; QByteArray m_defines;