diff options
-rw-r--r-- | src/plugins/cppeditor/cppmodelmanager.cpp | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/src/plugins/cppeditor/cppmodelmanager.cpp b/src/plugins/cppeditor/cppmodelmanager.cpp index a2f93635fea..231740899be 100644 --- a/src/plugins/cppeditor/cppmodelmanager.cpp +++ b/src/plugins/cppeditor/cppmodelmanager.cpp @@ -1465,8 +1465,11 @@ void CppModelManager::recalculateProjectPartMappings() for (const ProjectData &projectData : std::as_const(d->m_projectData)) { for (const ProjectPart::ConstPtr &projectPart : projectData.projectInfo->projectParts()) { d->m_projectPartIdToProjectProjectPart[projectPart->id()] = projectPart; - for (const ProjectFile &cxxFile : projectPart->files) - d->m_fileToProjectParts[cxxFile.path.canonicalPath()].append(projectPart); + for (const ProjectFile &cxxFile : projectPart->files) { + d->m_fileToProjectParts[cxxFile.path].append(projectPart); + if (FilePath canonical = cxxFile.path.canonicalPath(); canonical != cxxFile.path) + d->m_fileToProjectParts[canonical].append(projectPart); + } } } @@ -1639,8 +1642,16 @@ ProjectPart::ConstPtr CppModelManager::projectPartForId(const QString &projectPa QList<ProjectPart::ConstPtr> CppModelManager::projectPart(const FilePath &fileName) { - QReadLocker locker(&d->m_projectLock); - return d->m_fileToProjectParts.value(fileName.canonicalPath()); + { + QReadLocker locker(&d->m_projectLock); + auto it = d->m_fileToProjectParts.find(fileName); + if (it != d->m_fileToProjectParts.end()) + return it.value(); + } + const FilePath canonicalPath = fileName.canonicalPath(); + QWriteLocker locker(&d->m_projectLock); + auto it = d->m_fileToProjectParts.insert(fileName, d->m_fileToProjectParts.value(canonicalPath)); + return it.value(); } QList<ProjectPart::ConstPtr> CppModelManager::projectPartFromDependencies( @@ -1651,7 +1662,7 @@ QList<ProjectPart::ConstPtr> CppModelManager::projectPartFromDependencies( QReadLocker locker(&d->m_projectLock); for (const FilePath &dep : deps) - parts.unite(Utils::toSet(d->m_fileToProjectParts.value(dep.canonicalPath()))); + parts.unite(Utils::toSet(projectPart(dep))); return parts.values(); } |