CMake: Fix some more SOFT-ASSERTS in CMake server-mode

Fix two more SOFT-ASSERTs in CMake server-mode that could be triggered
by complex projects.

Move and simplify search functionality into FolderNode and use that instead
of hand-crafting a custom tree search in CMake.

Change-Id: If4bde5c4a7ff84c7d5dba4f595e99b39f54ac8aa
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Tobias Hunger
2017-03-14 16:21:33 +01:00
parent 6e91fe5046
commit 1621aaa26e
3 changed files with 43 additions and 22 deletions

View File

@@ -540,28 +540,16 @@ void ServerModeReader::addCMakeLists(CMakeProjectNode *root, const QList<FileNod
});
}
static CMakeListsNode *findCMakeNode(FolderNode *root, const Utils::FileName &dir)
static ProjectNode *findCMakeNode(ProjectNode *root, const Utils::FileName &dir)
{
const Utils::FileName stepDir = dir;
const Utils::FileName topDir = root->filePath();
QStringList relative = stepDir.relativeChildPath(topDir).toString().split('/', QString::SkipEmptyParts);
FolderNode *result = root;
while (!relative.isEmpty()) {
Utils::FileName nextFullPath = result->filePath();
nextFullPath.appendPath(relative.takeFirst());
result = findOrDefault(result->folderNodes(), Utils::equal(&FolderNode::filePath, nextFullPath));
if (!result)
return nullptr;
}
return dynamic_cast<CMakeListsNode *>(result);
Node *n = root->findNode([&dir](Node *n) { return n->asProjectNode() && n->filePath() == dir; });
return n ? n->asProjectNode() : nullptr;
}
static CMakeProjectNode *findOrCreateProjectNode(FolderNode *root, const Utils::FileName &dir,
const QString &displayName)
static ProjectNode *findOrCreateProjectNode(ProjectNode *root, const Utils::FileName &dir,
const QString &displayName)
{
CMakeListsNode *cmln = findCMakeNode(root, dir);
ProjectNode *cmln = findCMakeNode(root, dir);
QTC_ASSERT(cmln, return nullptr);
Utils::FileName projectName = dir;
@@ -588,17 +576,16 @@ void ServerModeReader::addProjects(CMakeProjectNode *root,
}
for (const Project *p : projects) {
CMakeProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name);
ProjectNode *pNode = findOrCreateProjectNode(root, p->sourceDirectory, p->name);
QTC_ASSERT(pNode, continue);
QTC_ASSERT(root, continue);
addTargets(root, p->targets, includeFiles);
}
}
static CMakeTargetNode *findOrCreateTargetNode(FolderNode *root, const Utils::FileName &dir,
static CMakeTargetNode *findOrCreateTargetNode(ProjectNode *root, const Utils::FileName &dir,
const QString &displayName)
{
CMakeListsNode *cmln = findCMakeNode(root, dir);
ProjectNode *cmln = findCMakeNode(root, dir);
QTC_ASSERT(cmln, return nullptr);
Utils::FileName targetName = dir;