CompilationDatabase: Allow the second root node

The 'directory' field of a compilation database can be
in many cases another root directory to look into.

Change-Id: Ie0d11bdc706f09e4d466b20fef614dd6ce00d4e9
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Ivan Donchevskii
2019-04-26 11:41:49 +02:00
parent 625ecdf687
commit a5c73fef3d

View File

@@ -299,23 +299,35 @@ FileType fileTypeForName(const QString &fileName)
return FileType::Source;
}
void createTree(FolderNode *root,
void addChild(FolderNode *root, const Utils::FileName &fileName)
{
FolderNode *parentNode = createFoldersIfNeeded(root, fileName.parentDir());
if (!parentNode->fileNode(fileName)) {
parentNode->addNode(
std::make_unique<FileNode>(fileName, fileTypeForName(fileName.fileName())));
}
}
void createTree(std::unique_ptr<ProjectNode> &root,
const Utils::FileName &rootPath,
const CppTools::RawProjectParts &rpps,
const QList<FileNode *> &scannedFiles = QList<FileNode *>())
{
root->setAbsoluteFilePathAndLine(rootPath, -1);
std::unique_ptr<FolderNode> secondRoot;
for (const CppTools::RawProjectPart &rpp : rpps) {
for (const QString &filePath : rpp.files) {
Utils::FileName fileName = Utils::FileName::fromString(filePath);
if (!fileName.isChildOf(rootPath))
continue;
FolderNode *parentNode = createFoldersIfNeeded(root, fileName.parentDir());
if (!parentNode->fileNode(fileName)) {
parentNode->addNode(std::make_unique<FileNode>(fileName,
fileTypeForName(fileName.fileName())));
if (!fileName.isChildOf(rootPath)) {
if (fileName.isChildOf(Utils::FileName::fromString(rpp.buildSystemTarget))) {
if (!secondRoot)
secondRoot = std::make_unique<ProjectNode>(
Utils::FileName::fromString(rpp.buildSystemTarget));
addChild(secondRoot.get(), fileName);
}
} else {
addChild(root.get(), fileName);
}
}
}
@@ -327,7 +339,7 @@ void createTree(FolderNode *root,
const Utils::FileName fileName = node->filePath();
if (!fileName.isChildOf(rootPath))
continue;
FolderNode *parentNode = createFoldersIfNeeded(root, fileName.parentDir());
FolderNode *parentNode = createFoldersIfNeeded(root.get(), fileName.parentDir());
if (!parentNode->fileNode(fileName)) {
std::unique_ptr<FileNode> headerNode(node->clone());
headerNode->setEnabled(false);
@@ -335,6 +347,14 @@ void createTree(FolderNode *root,
}
}
qDeleteAll(scannedFiles);
if (secondRoot) {
std::unique_ptr<ProjectNode> firstRoot = std::move(root);
root = std::make_unique<ProjectNode>(firstRoot->filePath());
firstRoot->setDisplayName(rootPath.fileName());
root->addNode(std::move(firstRoot));
root->addNode(std::move(secondRoot));
}
}
struct Entry
@@ -426,9 +446,9 @@ void CompilationDatabaseProject::buildTreeAndProjectParts(const Utils::FileName
QCoreApplication::processEvents();
if (m_treeScanner.future().isCanceled())
createTree(root.get(), rootProjectDirectory(), rpps);
createTree(root, rootProjectDirectory(), rpps);
else
createTree(root.get(), rootProjectDirectory(), rpps, m_treeScanner.release());
createTree(root, rootProjectDirectory(), rpps, m_treeScanner.release());
root->addNode(std::make_unique<FileNode>(projectFile, FileType::Project));