diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp index fc31c30e1b7..9229ad7009d 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.cpp +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.cpp @@ -432,15 +432,13 @@ bool pInfoLessThanImports(const ModelManagerInterface::ProjectInfo &p1, } -static QList generatedQrc(QList applicationDirectories) +static QSet generatedQrc( + const QList &projectInfos) { - QList res; - for (const Utils::FilePath &path : applicationDirectories) { - Utils::FilePath generatedQrcDir = path.pathAppended(".rcc"); - if (generatedQrcDir.isReadableDir()) { - for (const Utils::FilePath & qrcPath: generatedQrcDir.dirEntries(FileFilter(QStringList({QStringLiteral(u"*.qrc")}), QDir::Files))) - res.append(qrcPath.canonicalPath()); - } + QSet res; + for (const auto &pInfo : projectInfos) { + for (const auto &generatedQrcFile: pInfo.generatedQrcFiles) + res.insert(generatedQrcFile); } return res; } @@ -467,7 +465,7 @@ void ModelManagerInterface::iterateQrcFiles( qrcFilePaths = pInfo.activeResourceFiles; else qrcFilePaths = pInfo.allResourceFiles; - for (const Utils::FilePath &p : generatedQrc(pInfo.applicationDirectories)) + for (const Utils::FilePath &p : generatedQrc({pInfo})) qrcFilePaths.append(p); for (const Utils::FilePath &qrcFilePath : std::as_const(qrcFilePaths)) { if (pathsChecked.contains(qrcFilePath)) @@ -590,7 +588,7 @@ void ModelManagerInterface::updateProjectInfo(const ProjectInfo &pinfo, ProjectE m_qrcContents = pinfo.resourceFileContents; for (const Utils::FilePath &newQrc : std::as_const(pinfo.allResourceFiles)) m_qrcCache.addPath(newQrc.toString(), m_qrcContents.value(newQrc)); - for (const Utils::FilePath &newQrc : generatedQrc(pinfo.applicationDirectories)) + for (const Utils::FilePath &newQrc : pinfo.generatedQrcFiles) m_qrcCache.addPath(newQrc.toString(), m_qrcContents.value(newQrc)); for (const Utils::FilePath &oldQrc : std::as_const(oldInfo.allResourceFiles)) m_qrcCache.removePath(oldQrc.toString()); @@ -1293,7 +1291,7 @@ void ModelManagerInterface::updateImportPaths() allImportPaths.maybeInsert(path, Dialect::Qml); findNewQmlApplicationInPath(path, snapshot, this, &newLibraries); } - for (const Utils::FilePath &qrcPath : generatedQrc(allApplicationDirectories)) + for (const Utils::FilePath &qrcPath : generatedQrc(m_projects.values())) updateQrcFile(qrcPath); updateSourceFiles(importedFiles, true); @@ -1625,8 +1623,10 @@ ModelManagerInterface::ProjectInfo ModelManagerInterface::defaultProjectInfo() c } ModelManagerInterface::ProjectInfo ModelManagerInterface::defaultProjectInfoForProject( - ProjectExplorer::Project *) const + ProjectExplorer::Project *project, const FilePaths &hiddenRccFolders) const { + Q_UNUSED(project); + Q_UNUSED(hiddenRccFolders); return ModelManagerInterface::ProjectInfo(); } diff --git a/src/libs/qmljs/qmljsmodelmanagerinterface.h b/src/libs/qmljs/qmljsmodelmanagerinterface.h index e5d29a90ff8..041cf9dfedd 100644 --- a/src/libs/qmljs/qmljsmodelmanagerinterface.h +++ b/src/libs/qmljs/qmljsmodelmanagerinterface.h @@ -51,6 +51,7 @@ public: PathsAndLanguages importPaths; QList activeResourceFiles; QList allResourceFiles; + QList generatedQrcFiles; QHash resourceFileContents; QList applicationDirectories; QHash moduleMappings; // E.g.: QtQuick.Controls -> MyProject.MyControls @@ -164,8 +165,8 @@ public: void setDefaultVContext(const ViewerContext &vContext); virtual ProjectInfo defaultProjectInfo() const; - virtual ProjectInfo defaultProjectInfoForProject(ProjectExplorer::Project *project) const; - + virtual ProjectInfo defaultProjectInfoForProject(ProjectExplorer::Project *project, + const Utils::FilePaths &hiddenRccFolders) const; // Blocks until all parsing threads are done. Use for testing only! void test_joinAllThreads(); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 0cf89fd241a..8e1f3b6e65e 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -1186,8 +1186,8 @@ void CMakeBuildSystem::updateQmlJSCodeModel(const QStringList &extraHeaderPaths, return; Project *p = project(); - QmlJS::ModelManagerInterface::ProjectInfo projectInfo = modelManager - ->defaultProjectInfoForProject(p); + QmlJS::ModelManagerInterface::ProjectInfo projectInfo + = modelManager->defaultProjectInfoForProject(p, p->files(Project::HiddenRccFolders)); projectInfo.importPaths.clear(); diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index de503fff874..afb7eca08c0 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -109,6 +109,10 @@ const Project::NodeMatcher Project::GeneratedFiles = [](const Node *node) { return isListedFileNode(node) && node->isGenerated(); }; +const Project::NodeMatcher Project::HiddenRccFolders = [](const Node *node) { + return node->isFolderNodeType() && node->filePath().fileName() == ".rcc"; +}; + // -------------------------------------------------------------------- // ProjectDocument: // -------------------------------------------------------------------- diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index 2a966f01bc9..1868ea50256 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -101,6 +101,7 @@ public: static const NodeMatcher AllFiles; static const NodeMatcher SourceFiles; static const NodeMatcher GeneratedFiles; + static const NodeMatcher HiddenRccFolders; Utils::FilePaths files(const NodeMatcher &matcher) const; bool isKnownFile(const Utils::FilePath &filename) const; diff --git a/src/plugins/python/pythonproject.cpp b/src/plugins/python/pythonproject.cpp index a255c5ab5c2..b06b822efa1 100644 --- a/src/plugins/python/pythonproject.cpp +++ b/src/plugins/python/pythonproject.cpp @@ -250,7 +250,8 @@ void PythonBuildSystem::triggerParsing() auto modelManager = QmlJS::ModelManagerInterface::instance(); if (modelManager) { - auto projectInfo = modelManager->defaultProjectInfoForProject(project()); + const auto hiddenRccFolders = project()->files(Project::HiddenRccFolders); + auto projectInfo = modelManager->defaultProjectInfoForProject(project(), hiddenRccFolders); for (const QString &importPath : std::as_const(m_qmlImportPaths)) { const FilePath filePath = FilePath::fromString(importPath); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 1249025387a..c9e69b5fdcb 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -1052,8 +1052,9 @@ void QbsBuildSystem::updateQmlJsCodeModel() QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); if (!modelManager) return; - QmlJS::ModelManagerInterface::ProjectInfo projectInfo = - modelManager->defaultProjectInfoForProject(project()); + QmlJS::ModelManagerInterface::ProjectInfo projectInfo + = modelManager->defaultProjectInfoForProject(project(), + project()->files(Project::HiddenRccFolders)); const QJsonObject projectData = session()->projectData(); if (projectData.isEmpty()) @@ -1068,7 +1069,7 @@ void QbsBuildSystem::updateQmlJsCodeModel() }); project()->setProjectLanguage(ProjectExplorer::Constants::QMLJS_LANGUAGE_ID, - !projectInfo.sourceFiles.isEmpty()); + !projectInfo.sourceFiles.isEmpty()); modelManager->updateProjectInfo(projectInfo, project()); } diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 47adf657e9a..12176bb6194 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -410,8 +410,9 @@ void QmakeBuildSystem::updateQmlJSCodeModel() if (!modelManager) return; - QmlJS::ModelManagerInterface::ProjectInfo projectInfo = - modelManager->defaultProjectInfoForProject(project()); + QmlJS::ModelManagerInterface::ProjectInfo projectInfo + = modelManager->defaultProjectInfoForProject(project(), + project()->files(Project::HiddenRccFolders)); const QList proFiles = rootProFile()->allProFiles(); diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index bbed26eb41a..0aed233426c 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -81,8 +81,36 @@ static void setupProjectInfoQmlBundles(ModelManagerInterface::ProjectInfo &proje } } +static void findAllQrcFiles(const FilePath &filePath, FilePaths &out) +{ + filePath.iterateDirectory( + [&out](const FilePath &path) { + out.append(path.canonicalPath()); + return true; + }, + {{"*.qrc"}, QDir::Files}); +} + +static FilePaths findGeneratedQrcFiles(const ModelManagerInterface::ProjectInfo &pInfo, + const FilePaths &hiddenRccFolders) +{ + FilePaths result; + // Search in Application Directories for directories named ".rcc" + // and add all .qrc files in there to the resource file list. + for (const Utils::FilePath &path : pInfo.applicationDirectories) { + Utils::FilePath generatedQrcDir = path.pathAppended(".rcc"); + findAllQrcFiles(generatedQrcDir, result); + } + + for (const Utils::FilePath &hiddenRccFolder : hiddenRccFolders) { + findAllQrcFiles(hiddenRccFolder, result); + } + + return result; +} + ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject( - Project *project) const + Project *project, const FilePaths &hiddenRccFolders) const { ModelManagerInterface::ProjectInfo projectInfo; projectInfo.project = project; @@ -183,6 +211,7 @@ ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject( } setupProjectInfoQmlBundles(projectInfo); + projectInfo.generatedQrcFiles = findGeneratedQrcFiles(projectInfo, hiddenRccFolders); return projectInfo; } @@ -294,7 +323,7 @@ void ModelManager::updateDefaultProjectInfo() Project *currentProject = SessionManager::startupProject(); setDefaultProject(containsProject(currentProject) ? projectInfo(currentProject) - : defaultProjectInfoForProject(currentProject), + : defaultProjectInfoForProject(currentProject, {}), currentProject); } diff --git a/src/plugins/qmljstools/qmljsmodelmanager.h b/src/plugins/qmljstools/qmljsmodelmanager.h index c8e9d62058b..085d77b95e5 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.h +++ b/src/plugins/qmljstools/qmljsmodelmanager.h @@ -32,7 +32,8 @@ protected: WorkingCopy workingCopyInternal() const override; void addTaskInternal(const QFuture &result, const QString &msg, const char *taskId) const override; - ProjectInfo defaultProjectInfoForProject(ProjectExplorer::Project *project) const override; + ProjectInfo defaultProjectInfoForProject( + ProjectExplorer::Project *project, const Utils::FilePaths &hiddenRccFolders) const override; private: void updateDefaultProjectInfo(); void loadDefaultQmlTypeDescriptions(); diff --git a/src/plugins/qmlprojectmanager/qmlproject.cpp b/src/plugins/qmlprojectmanager/qmlproject.cpp index a64a3a888d9..88aea5cab41 100644 --- a/src/plugins/qmlprojectmanager/qmlproject.cpp +++ b/src/plugins/qmlprojectmanager/qmlproject.cpp @@ -312,8 +312,9 @@ void QmlBuildSystem::refresh(RefreshOptions options) if (!modelManager) return; - QmlJS::ModelManagerInterface::ProjectInfo projectInfo = - modelManager->defaultProjectInfoForProject(project()); + QmlJS::ModelManagerInterface::ProjectInfo projectInfo + = modelManager->defaultProjectInfoForProject(project(), + project()->files(Project::HiddenRccFolders)); const QStringList searchPaths = makeAbsolute(canonicalProjectDir(), customImportPaths()); for (const QString &searchPath : searchPaths) projectInfo.importPaths.maybeInsert(Utils::FilePath::fromString(searchPath),