diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index b11480eb2c7..ce4c54a9fef 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -531,8 +531,8 @@ void CMakeProject::createGeneratedCodeModelSupport() = Utils::transform(factories, [](const ExtraCompilerFactory *f) { return f->sourceTag(); }); // Find all files generated by any of the extra compilers, in a rather crude way. - const QStringList fileList = files(SourceFiles, [&fileExtensions](const FileNode *fn) { - const QString fp = fn->filePath().toString(); + const QStringList fileList = files(SourceFiles, [&fileExtensions](const Node *n) { + const QString fp = n->filePath().toString(); const int pos = fp.lastIndexOf('.'); return pos >= 0 && fileExtensions.contains(fp.mid(pos + 1)); }); diff --git a/src/plugins/nim/project/nimproject.cpp b/src/plugins/nim/project/nimproject.cpp index fe58ea5c373..5db9fd554a3 100644 --- a/src/plugins/nim/project/nimproject.cpp +++ b/src/plugins/nim/project/nimproject.cpp @@ -168,8 +168,8 @@ bool NimProject::supportsKit(Kit *k, QString *errorMessage) const FileNameList NimProject::nimFiles() const { - const QStringList nim = files(AllFiles, [](const ProjectExplorer::FileNode *fn) { - return fn->filePath().endsWith(".nim"); + const QStringList nim = files(AllFiles, [](const ProjectExplorer::Node *n) { + return n->filePath().endsWith(".nim"); }); return Utils::transform(nim, [](const QString &fp) { return Utils::FileName::fromString(fp); }); } diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index f12efd6d44f..09475e24b8f 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -548,7 +548,7 @@ Project::RestoreResult Project::restoreSettings(QString *errorMessage) } QStringList Project::files(Project::FilesMode fileMode, - const std::function &filter) const + const std::function &filter) const { QStringList result; @@ -556,17 +556,19 @@ QStringList Project::files(Project::FilesMode fileMode, return result; QSet alreadySeen; - rootProjectNode()->forEachNode([&](const FileNode *fn) { - const QString path = fn->filePath().toString(); + rootProjectNode()->forEachGenericNode([&](const Node *n) { + const QString path = n->filePath().toString(); const int count = alreadySeen.count(); alreadySeen.insert(path); if (count == alreadySeen.count()) return; // skip duplicates - if (filter && !filter(fn)) + if (!n->listInProject()) + return; + if (filter && !filter(n)) return; if ((fileMode == AllFiles) - || (fileMode == SourceFiles && !fn->isGenerated()) - || (fileMode == GeneratedFiles && fn->isGenerated())) + || (fileMode == SourceFiles && !n->isGenerated()) + || (fileMode == GeneratedFiles && n->isGenerated())) result.append(path); }); return result; diff --git a/src/plugins/projectexplorer/project.h b/src/plugins/projectexplorer/project.h index edc5b4c2ce4..f76a1513dea 100644 --- a/src/plugins/projectexplorer/project.h +++ b/src/plugins/projectexplorer/project.h @@ -47,8 +47,8 @@ namespace ProjectExplorer { class BuildInfo; class ContainerNode; class EditorConfiguration; -class FileNode; class NamedWidget; +class Node; class ProjectImporter; class ProjectNode; class ProjectPrivate; @@ -133,7 +133,7 @@ public: AllFiles = SourceFiles | GeneratedFiles }; QStringList files(FilesMode fileMode, - const std::function &filter = {}) const; + const std::function &filter = {}) const; virtual QStringList filesGeneratedFrom(const QString &sourceFile) const; static QString makeUnique(const QString &preferredName, const QStringList &usedNames); diff --git a/src/plugins/projectexplorer/projectnodes.cpp b/src/plugins/projectexplorer/projectnodes.cpp index 3b121a95948..da531056eba 100644 --- a/src/plugins/projectexplorer/projectnodes.cpp +++ b/src/plugins/projectexplorer/projectnodes.cpp @@ -127,6 +127,11 @@ void Node::setPriority(int p) m_priority = p; } +void Node::setListInProject(bool l) +{ + m_flags.setFlag(FlagListInProject, l); +} + void Node::setIsGenerated(bool g) { m_flags.setFlag(FlagIsGenerated, g); @@ -153,6 +158,14 @@ int Node::priority() const return m_priority; } +/*! + Returns \c true if the Node should be listed as part of the projects file list. + */ +bool Node::listInProject() const +{ + return m_flags.testFlag(FlagListInProject); +} + /*! The project that owns and manages the node. It is the first project in the list of ancestors. @@ -291,6 +304,7 @@ FileNode::FileNode(const Utils::FileName &filePath, bool generated, int line) : Node(NodeType::File, filePath, line), m_fileType(fileType) { + setListInProject(true); setIsGenerated(generated); if (fileType == FileType::Project) setPriority(DefaultProjectFilePriority); @@ -303,6 +317,7 @@ FileNode *FileNode::clone() const auto fn = new FileNode(filePath(), fileType(), isGenerated(), line()); fn->setEnabled(isEnabled()); fn->setPriority(priority()); + fn->setListInProject(listInProject()); return fn; } @@ -390,6 +405,7 @@ FolderNode::FolderNode(const Utils::FileName &folderPath, NodeType nodeType, con m_displayName(displayName) { setPriority(DefaultFolderPriority); + setListInProject(false); setIsGenerated(false); if (m_displayName.isEmpty()) m_displayName = folderPath.toUserOutput(); diff --git a/src/plugins/projectexplorer/projectnodes.h b/src/plugins/projectexplorer/projectnodes.h index 64d09abc743..dc03cd5aecb 100644 --- a/src/plugins/projectexplorer/projectnodes.h +++ b/src/plugins/projectexplorer/projectnodes.h @@ -129,6 +129,7 @@ public: virtual QString displayName() const; virtual QString tooltip() const; bool isEnabled() const; + bool listInProject() const; bool isGenerated() const; virtual bool supportsAction(ProjectAction action, Node *node) const; @@ -155,6 +156,7 @@ protected: Node(NodeType nodeType, const Utils::FileName &filePath, int line = -1); void setPriority(int priority); + void setListInProject(bool l); void setIsGenerated(bool g); private: @@ -167,6 +169,7 @@ private: FlagNone = 0, FlagIsEnabled = 1 << 0, FlagIsGenerated = 1 << 1, + FlagListInProject = 1 << 2, }; using NodeFlags = QFlags; NodeFlags m_flags = FlagIsEnabled; diff --git a/src/plugins/qmljstools/qmljsmodelmanager.cpp b/src/plugins/qmljstools/qmljsmodelmanager.cpp index e13bbb3e292..4b21b6d4a1a 100644 --- a/src/plugins/qmljstools/qmljsmodelmanager.cpp +++ b/src/plugins/qmljstools/qmljsmodelmanager.cpp @@ -84,10 +84,13 @@ ModelManagerInterface::ProjectInfo ModelManager::defaultProjectInfoForProject( Constants::QMLTYPES_MIMETYPE, Constants::QMLUI_MIMETYPE }; projectInfo.sourceFiles = project->files(Project::SourceFiles, - [&qmlTypeNames](const FileNode *fn) { - return fn->fileType() == FileType::QML - && qmlTypeNames.contains(Utils::mimeTypeForFile(fn->filePath().toString(), - MimeMatchMode::MatchExtension).name()); + [&qmlTypeNames](const Node *n) { + if (const FileNode *fn = n->asFileNode()) { + return fn->fileType() == FileType::QML + && qmlTypeNames.contains(Utils::mimeTypeForFile(fn->filePath().toString(), + MimeMatchMode::MatchExtension).name()); + } + return false; }); activeTarget = project->activeTarget(); }