CMakeProjectManager: Add File System virtual folder

If a CMake project cannot be parsed by CMake, it is practically unusable in
Qt Creator. According to discussion in QTCREATORBUG-24677, a virtual
folder with the project's file system view is added to the project
manager as a convenience feature.

Fixes: QTCREATORBUG-24677
Change-Id: I48775bb89c704d3f7e5bb21ec6481bd5cc0f4b6c
Reviewed-by: hjk <hjk@qt.io>
Reviewed-by: Kai Koehne <kai.koehne@qt.io>
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
Dmitriy Purgin
2020-10-26 15:36:59 +01:00
parent 56eb7628c3
commit 53115259ba
8 changed files with 94 additions and 14 deletions

View File

@@ -193,11 +193,14 @@ CMakeConfig FileApiReader::takeParsedConfiguration(QString &errorMessage)
}
std::unique_ptr<CMakeProjectNode> FileApiReader::generateProjectTree(
const QList<const FileNode *> &allFiles, QString &errorMessage)
const QList<const FileNode *> &allFiles, QString &errorMessage, bool includeHeaderNodes)
{
Q_UNUSED(errorMessage)
addHeaderNodes(m_rootProjectNode.get(), m_knownHeaders, allFiles);
if (includeHeaderNodes) {
addHeaderNodes(m_rootProjectNode.get(), m_knownHeaders, allFiles);
}
addFileSystemNodes(m_rootProjectNode.get(), allFiles);
return std::move(m_rootProjectNode);
}
@@ -230,19 +233,23 @@ void FileApiReader::endState(const QFileInfo &replyFi)
const FilePath sourceDirectory = m_parameters.sourceDirectory;
const FilePath buildDirectory = m_parameters.workDirectory;
const FilePath topCmakeFile = m_cmakeFiles.size() == 1 ? *m_cmakeFiles.begin() : FilePath{};
m_lastReplyTimestamp = replyFi.lastModified();
m_future = runAsync(ProjectExplorerPlugin::sharedThreadPool(),
[replyFi, sourceDirectory, buildDirectory]() {
[replyFi, sourceDirectory, buildDirectory, topCmakeFile]() {
auto result = std::make_unique<FileApiQtcData>();
FileApiData data = FileApiParser::parseData(replyFi,
result->errorMessage);
FileApiData data = FileApiParser::parseData(replyFi, result->errorMessage);
if (!result->errorMessage.isEmpty()) {
qWarning() << result->errorMessage;
return result.release();
*result = generateFallbackData(topCmakeFile,
sourceDirectory,
buildDirectory,
result->errorMessage);
} else {
*result = extractData(data, sourceDirectory, buildDirectory);
}
*result = extractData(data, sourceDirectory, buildDirectory);
if (!result->errorMessage.isEmpty()) {
qWarning() << result->errorMessage;
}