CppTools: Prioritize project parts with selectedForBuilding=true

...when selecting one for the editor document.

This flag is only set by the QmakeProject.

Change-Id: I648886e12148bd1ebeccca52d9faaf4b528597c9
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-12-16 15:30:08 +01:00
committed by David Schulz
parent 0718f536a7
commit 9861a58400
2 changed files with 38 additions and 7 deletions

View File

@@ -31,12 +31,29 @@
namespace CppTools { namespace CppTools {
namespace Internal { namespace Internal {
static ProjectPart::Ptr selectFromActiveProject(const QList<ProjectPart::Ptr> &projectParts, static int priority(const ProjectPart &projectPart, const ProjectExplorer::Project *activeProject)
{
int thePriority = 0;
if (projectPart.project == activeProject)
thePriority += 10;
if (projectPart.selectedForBuilding)
thePriority += 1;
return thePriority;
}
static ProjectPart::Ptr chooseFromMultiple(const QList<ProjectPart::Ptr> &projectParts,
const ProjectExplorer::Project *activeProject) const ProjectExplorer::Project *activeProject)
{ {
return Utils::findOr(projectParts, projectParts.first(), [&](const ProjectPart::Ptr &projectPart){ QList<ProjectPart::Ptr> projectPartsPrioritized = projectParts;
return projectPart->project == activeProject; const auto lessThan = [activeProject] (const ProjectPart::Ptr &p1, const ProjectPart::Ptr &p2) {
}); return priority(*p1, activeProject) > priority(*p2, activeProject);
};
std::stable_sort(projectPartsPrioritized.begin(), projectPartsPrioritized.end(), lessThan);
return projectPartsPrioritized.first();
} }
ProjectPart::Ptr ProjectPartChooser::choose(const QString &filePath, ProjectPart::Ptr ProjectPartChooser::choose(const QString &filePath,
@@ -68,10 +85,10 @@ ProjectPart::Ptr ProjectPartChooser::choose(const QString &filePath,
// Fall-back step 2: Use fall-back part from the model manager: // Fall-back step 2: Use fall-back part from the model manager:
projectPart = m_fallbackProjectPart(); projectPart = m_fallbackProjectPart();
else else
projectPart = selectFromActiveProject(projectParts, activeProject); projectPart = chooseFromMultiple(projectParts, activeProject);
} else { } else {
if (projectHasChanged || !projectParts.contains(projectPart)) if (projectHasChanged || !projectParts.contains(projectPart))
projectPart = selectFromActiveProject(projectParts, activeProject); projectPart = chooseFromMultiple(projectParts, activeProject);
} }
return projectPart; return projectPart;

View File

@@ -89,6 +89,20 @@ TEST_F(ProjectPartChooser, ForMultipleChooseFromActiveProject)
ASSERT_THAT(chosen, Eq(secondProjectPart)); ASSERT_THAT(chosen, Eq(secondProjectPart));
} }
TEST_F(ProjectPartChooser, ForMultiplePreferSelectedForBuilding)
{
const ProjectPart::Ptr firstProjectPart{new ProjectPart};
const ProjectPart::Ptr secondProjectPart{new ProjectPart};
firstProjectPart->selectedForBuilding = false;
secondProjectPart->selectedForBuilding = true;
projectPartsForFile += firstProjectPart;
projectPartsForFile += secondProjectPart;
const ProjectPart::Ptr chosen = choose();
ASSERT_THAT(chosen, Eq(secondProjectPart));
}
TEST_F(ProjectPartChooser, ForMultipleFromDependenciesChooseFromActiveProject) TEST_F(ProjectPartChooser, ForMultipleFromDependenciesChooseFromActiveProject)
{ {
const QList<ProjectPart::Ptr> projectParts = createProjectPartsWithDifferentProjects(); const QList<ProjectPart::Ptr> projectParts = createProjectPartsWithDifferentProjects();