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

@@ -517,11 +517,11 @@ void CMakeBuildSystem::clearCMakeCache()
Utils::FileUtils::removeRecursively(cmakeFiles);
}
std::unique_ptr<CMakeProjectNode>
CMakeBuildSystem::generateProjectTree(const QList<const FileNode *> &allFiles)
std::unique_ptr<CMakeProjectNode> CMakeBuildSystem::generateProjectTree(
const QList<const FileNode *> &allFiles, bool includeHeaderNodes)
{
QString errorMessage;
auto root = m_reader.generateProjectTree(allFiles, errorMessage);
auto root = m_reader.generateProjectTree(allFiles, errorMessage, includeHeaderNodes);
checkAndReportError(errorMessage);
return root;
}
@@ -535,6 +535,8 @@ void CMakeBuildSystem::combineScanAndParse()
if (m_combinedScanAndParseResult) {
updateProjectData();
m_currentGuard.markAsSuccess();
} else {
updateFallbackProjectData();
}
}
@@ -590,7 +592,7 @@ void CMakeBuildSystem::updateProjectData()
Project *p = project();
{
auto newRoot = generateProjectTree(m_allFiles);
auto newRoot = generateProjectTree(m_allFiles, true);
if (newRoot) {
setRootProjectNode(std::move(newRoot));
CMakeConfigItem settingFileItem;
@@ -671,6 +673,18 @@ void CMakeBuildSystem::updateProjectData()
qCDebug(cmakeBuildSystemLog) << "All CMake project data up to date.";
}
void CMakeBuildSystem::updateFallbackProjectData()
{
qCDebug(cmakeBuildSystemLog) << "Updating fallback CMake project data";
QTC_ASSERT(m_treeScanner.isFinished() && !m_reader.isParsing(), return );
auto newRoot = generateProjectTree(m_allFiles, false);
setRootProjectNode(std::move(newRoot));
qCDebug(cmakeBuildSystemLog) << "All fallback CMake project data up to date.";
}
void CMakeBuildSystem::handleParsingSucceeded()
{
if (!cmakeBuildConfiguration()->isActive()) {