CppTools: Fix choosing project part after project open

As long as there are project parts for a source file, always determine
the best project part, instead of trying to stick to the previous one.
This ensures the best project part at all times and simplifies the code.

Change-Id: I25ea3eb43a5a3e6d93688d4b8965f596dc9ae22b
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2017-01-19 15:46:40 +01:00
parent bddfe21961
commit 7415964819
14 changed files with 69 additions and 63 deletions

View File

@@ -128,12 +128,13 @@ private:
bool m_isAmbiguous = false;
};
ProjectPartInfo ProjectPartChooser::choose(const QString &filePath,
ProjectPartInfo ProjectPartChooser::choose(
const QString &filePath,
const ProjectPartInfo &currentProjectPartInfo,
const QString &preferredProjectPartId,
const ProjectExplorer::Project *activeProject,
Language languagePreference,
bool projectHasChanged) const
bool projectsUpdated) const
{
QTC_CHECK(m_projectPartsForFile);
QTC_CHECK(m_projectPartsFromDependenciesForFile);
@@ -144,7 +145,8 @@ ProjectPartInfo ProjectPartChooser::choose(const QString &filePath,
QList<ProjectPart::Ptr> projectParts = m_projectPartsForFile(filePath);
if (projectParts.isEmpty()) {
if (projectPart && currentProjectPartInfo.hint == ProjectPartInfo::IsFallbackMatch)
if (!projectsUpdated && projectPart
&& currentProjectPartInfo.hint == ProjectPartInfo::IsFallbackMatch)
// Avoid re-calculating the expensive dependency table for non-project files.
return {projectPart, ProjectPartInfo::IsFallbackMatch};
@@ -162,16 +164,14 @@ ProjectPartInfo ProjectPartChooser::choose(const QString &filePath,
projectPart = prioritizer.projectPart();
}
} else {
if (projectHasChanged || !projectParts.contains(projectPart)) {
ProjectPartPrioritizer prioritizer(projectParts,
preferredProjectPartId,
activeProject,
languagePreference);
projectPart = prioritizer.projectPart();
hint = prioritizer.isAmbiguous()
? ProjectPartInfo::IsAmbiguousMatch
: ProjectPartInfo::NoHint;
}
ProjectPartPrioritizer prioritizer(projectParts,
preferredProjectPartId,
activeProject,
languagePreference);
projectPart = prioritizer.projectPart();
hint = prioritizer.isAmbiguous()
? ProjectPartInfo::IsAmbiguousMatch
: ProjectPartInfo::NoHint;
}
return {projectPart, hint};