diff --git a/src/plugins/cpptools/cppprojectfile.cpp b/src/plugins/cpptools/cppprojectfile.cpp index 52c599d10bc..3f1e590619f 100644 --- a/src/plugins/cpptools/cppprojectfile.cpp +++ b/src/plugins/cpptools/cppprojectfile.cpp @@ -47,30 +47,36 @@ bool ProjectFile::operator==(const ProjectFile &other) const && path == other.path; } +ProjectFile::Kind ProjectFile::classifyByMimeType(const QString &mt) +{ + if (mt == CppTools::Constants::C_SOURCE_MIMETYPE) + return CSource; + if (mt == CppTools::Constants::C_HEADER_MIMETYPE) + return CHeader; + if (mt == CppTools::Constants::CPP_SOURCE_MIMETYPE) + return CXXSource; + if (mt == CppTools::Constants::CPP_HEADER_MIMETYPE) + return CXXHeader; + if (mt == CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE) + return ObjCSource; + if (mt == CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE) + return ObjCXXSource; + if (mt == CppTools::Constants::QDOC_MIMETYPE) + return CXXSource; + if (mt == CppTools::Constants::MOC_MIMETYPE) + return CXXSource; + if (mt == CppTools::Constants::AMBIGUOUS_HEADER_MIMETYPE) + return AmbiguousHeader; + return Unsupported; +} + ProjectFile::Kind ProjectFile::classify(const QString &filePath) { if (isAmbiguousHeader(filePath)) return AmbiguousHeader; const Utils::MimeType mimeType = Utils::mimeTypeForFile(filePath); - const QString mt = mimeType.name(); - if (mt == QLatin1String(CppTools::Constants::C_SOURCE_MIMETYPE)) - return CSource; - if (mt == QLatin1String(CppTools::Constants::C_HEADER_MIMETYPE)) - return CHeader; - if (mt == QLatin1String(CppTools::Constants::CPP_SOURCE_MIMETYPE)) - return CXXSource; - if (mt == QLatin1String(CppTools::Constants::CPP_HEADER_MIMETYPE)) - return CXXHeader; - if (mt == QLatin1String(CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE)) - return ObjCSource; - if (mt == QLatin1String(CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE)) - return ObjCXXSource; - if (mt == QLatin1String(CppTools::Constants::QDOC_MIMETYPE)) - return CXXSource; - if (mt == QLatin1String(CppTools::Constants::MOC_MIMETYPE)) - return CXXSource; - return Unsupported; + return classifyByMimeType(mimeType.name()); } bool ProjectFile::isAmbiguousHeader(const QString &filePath) diff --git a/src/plugins/cpptools/cppprojectfile.h b/src/plugins/cpptools/cppprojectfile.h index 4cfda1be49f..942cf66f3b1 100644 --- a/src/plugins/cpptools/cppprojectfile.h +++ b/src/plugins/cpptools/cppprojectfile.h @@ -50,6 +50,7 @@ public: OpenCLSource, }; + static Kind classifyByMimeType(const QString &mt); static Kind classify(const QString &filePath); static bool isSource(Kind kind); diff --git a/src/plugins/cpptools/cppprojectfilecategorizer.cpp b/src/plugins/cpptools/cppprojectfilecategorizer.cpp index 35ec2d9263e..036022bb432 100644 --- a/src/plugins/cpptools/cppprojectfilecategorizer.cpp +++ b/src/plugins/cpptools/cppprojectfilecategorizer.cpp @@ -31,10 +31,11 @@ namespace CppTools { ProjectFileCategorizer::ProjectFileCategorizer(const QString &projectPartName, const QStringList &filePaths, - const FileClassifier &fileClassifier) + const FileIsActive &fileIsActive, + const GetMimeType &getMimeType) : m_partName(projectPartName) { - const ProjectFiles ambiguousHeaders = classifyFiles(filePaths, fileClassifier); + const ProjectFiles ambiguousHeaders = classifyFiles(filePaths, fileIsActive, getMimeType); expandSourcesWithAmbiguousHeaders(ambiguousHeaders); m_partCount = (m_cSources.isEmpty() ? 0 : 1) @@ -53,14 +54,17 @@ QString ProjectFileCategorizer::partName(const QString &languageName) const } ProjectFiles ProjectFileCategorizer::classifyFiles(const QStringList &filePaths, - const FileClassifier &fileClassifier) + const FileIsActive &fileIsActive, + const GetMimeType &getMimeType) { ProjectFiles ambiguousHeaders; foreach (const QString &filePath, filePaths) { - const ProjectFile projectFile = fileClassifier - ? fileClassifier(filePath) - : ProjectFile(filePath, ProjectFile::classify(filePath)); + const ProjectFile projectFile(filePath, + getMimeType + ? ProjectFile::classifyByMimeType(getMimeType(filePath)) + : ProjectFile::classify(filePath), + fileIsActive ? fileIsActive(filePath) : true); switch (projectFile.kind) { case ProjectFile::AmbiguousHeader: diff --git a/src/plugins/cpptools/cppprojectfilecategorizer.h b/src/plugins/cpptools/cppprojectfilecategorizer.h index 48cd2438c63..10b1ca7c7d5 100644 --- a/src/plugins/cpptools/cppprojectfilecategorizer.h +++ b/src/plugins/cpptools/cppprojectfilecategorizer.h @@ -36,12 +36,14 @@ namespace CppTools { class ProjectFileCategorizer { public: - using FileClassifier = RawProjectPart::FileClassifier; + using FileIsActive = RawProjectPart::FileIsActive; + using GetMimeType = RawProjectPart::GetMimeType; public: ProjectFileCategorizer(const QString &projectPartName, const QStringList &filePaths, - const FileClassifier &fileClassifier = FileClassifier()); + const FileIsActive &fileIsActive = {}, + const GetMimeType &getMimeType = {}); bool hasCSources() const { return !m_cSources.isEmpty(); } bool hasCxxSources() const { return !m_cxxSources.isEmpty(); } @@ -59,7 +61,9 @@ public: QString partName(const QString &languageName) const; private: - ProjectFiles classifyFiles(const QStringList &filePaths, const FileClassifier &fileClassifier); + ProjectFiles classifyFiles(const QStringList &filePaths, + const FileIsActive &fileIsActive, + const GetMimeType &getMimeType); void expandSourcesWithAmbiguousHeaders(const ProjectFiles &ambiguousHeaders); private: diff --git a/src/plugins/cpptools/cppprojectinfogenerator.cpp b/src/plugins/cpptools/cppprojectinfogenerator.cpp index 18c7d4fb761..dcefe65872c 100644 --- a/src/plugins/cpptools/cppprojectinfogenerator.cpp +++ b/src/plugins/cpptools/cppprojectinfogenerator.cpp @@ -87,7 +87,7 @@ QVector ProjectInfoGenerator::createProjectParts(const RawProj QVector result; ProjectFileCategorizer cat(rawProjectPart.displayName, rawProjectPart.files, - rawProjectPart.fileClassifier); + rawProjectPart.fileIsActive); if (!cat.hasParts()) return result; diff --git a/src/plugins/cpptools/cpprawprojectpart.cpp b/src/plugins/cpptools/cpprawprojectpart.cpp index 6c29c2bb34d..8c97e493bdf 100644 --- a/src/plugins/cpptools/cpprawprojectpart.cpp +++ b/src/plugins/cpptools/cpprawprojectpart.cpp @@ -50,10 +50,13 @@ void RawProjectPart::setDisplayName(const QString &displayName) this->displayName = displayName; } -void RawProjectPart::setFiles(const QStringList &files, const FileClassifier &fileClassifier) +void RawProjectPart::setFiles(const QStringList &files, + const FileIsActive &fileIsActive, + const GetMimeType &getMimeType) { this->files = files; - this->fileClassifier = fileClassifier; + this->fileIsActive = fileIsActive; + this->getMimeType = getMimeType; } static QString trimTrailingSlashes(const QString &path) { diff --git a/src/plugins/cpptools/cpprawprojectpart.h b/src/plugins/cpptools/cpprawprojectpart.h index 2cddd71bf94..f079dc5e457 100644 --- a/src/plugins/cpptools/cpprawprojectpart.h +++ b/src/plugins/cpptools/cpprawprojectpart.h @@ -58,9 +58,12 @@ public: void setConfigFileName(const QString &configFileName); void setCallGroupId(const QString &id); - // FileClassifier must be thread-safe. - using FileClassifier = std::function; - void setFiles(const QStringList &files, const FileClassifier &fileClassifier = FileClassifier()); + // FileIsActive and GetMimeType must be thread-safe. + using FileIsActive = std::function; + using GetMimeType = std::function; + void setFiles(const QStringList &files, + const FileIsActive &fileIsActive = {}, + const GetMimeType &getMimeType = {}); static ProjectExplorer::HeaderPath frameworkDetectionHeuristic(const ProjectExplorer::HeaderPath &header); void setHeaderPaths(const ProjectExplorer::HeaderPaths &headerPaths); void setIncludePaths(const QStringList &includePaths); @@ -86,7 +89,8 @@ public: // Files QStringList files; - FileClassifier fileClassifier; + FileIsActive fileIsActive; + GetMimeType getMimeType; QStringList precompiledHeaders; ProjectExplorer::HeaderPaths headerPaths; QString projectConfigFile; // Generic Project Manager only diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 8490f2ccf58..f62a06dee21 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -43,6 +43,7 @@ const char OBJECTIVE_CPP_SOURCE_MIMETYPE[] = "text/x-objc++src"; const char CPP_HEADER_MIMETYPE[] = "text/x-c++hdr"; const char QDOC_MIMETYPE[] = "text/x-qdoc"; const char MOC_MIMETYPE[] = "text/x-moc"; +const char AMBIGUOUS_HEADER_MIMETYPE[] = "application/vnd.qtc.ambiguousheader"; // not a real MIME type // QSettings keys for use by the "New Class" wizards. const char CPPTOOLS_SETTINGSGROUP[] = "CppTools"; diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index b17aaa6835a..92f7fa6519d 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include #include #include @@ -731,22 +732,22 @@ void QbsProject::updateDocuments(const std::set &files) setExtraProjectFiles(nonBuildDirFilePaths); } -static CppTools::ProjectFile::Kind cppFileType(const qbs::ArtifactData &sourceFile) +static QString getMimeType(const qbs::ArtifactData &sourceFile) { - if (sourceFile.fileTags().contains(QLatin1String("hpp"))) { + if (sourceFile.fileTags().contains("hpp")) { if (CppTools::ProjectFile::isAmbiguousHeader(sourceFile.filePath())) - return CppTools::ProjectFile::AmbiguousHeader; - return CppTools::ProjectFile::CXXHeader; + return CppTools::Constants::AMBIGUOUS_HEADER_MIMETYPE; + return CppTools::Constants::CPP_HEADER_MIMETYPE; } - if (sourceFile.fileTags().contains(QLatin1String("cpp"))) - return CppTools::ProjectFile::CXXSource; - if (sourceFile.fileTags().contains(QLatin1String("c"))) - return CppTools::ProjectFile::CSource; - if (sourceFile.fileTags().contains(QLatin1String("objc"))) - return CppTools::ProjectFile::ObjCSource; - if (sourceFile.fileTags().contains(QLatin1String("objcpp"))) - return CppTools::ProjectFile::ObjCXXSource; - return CppTools::ProjectFile::Unsupported; + if (sourceFile.fileTags().contains("cpp")) + return CppTools::Constants::CPP_SOURCE_MIMETYPE; + if (sourceFile.fileTags().contains("c")) + return CppTools::Constants::C_SOURCE_MIMETYPE; + if (sourceFile.fileTags().contains("objc")) + return CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE; + if (sourceFile.fileTags().contains("objcpp")) + return CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE; + return {}; } static QString groupLocationToCallGroupId(const qbs::CodeLocation &location) @@ -1011,11 +1012,12 @@ void QbsProject::updateCppCodeModel() qCWarning(qbsPmLog) << "Expect problems with code model"; } rpp.setPreCompiledHeaders(Utils::toList(pchFiles)); - rpp.setFiles(grp.allFilePaths(), [filePathToSourceArtifact](const QString &filePath) { - // Keep this lambda thread-safe! - return CppTools::ProjectFile(filePath, - cppFileType(filePathToSourceArtifact.value(filePath))); - }); + rpp.setFiles(grp.allFilePaths(), + {}, + [filePathToSourceArtifact](const QString &filePath) { + // Keep this lambda thread-safe! + return getMimeType(filePathToSourceArtifact.value(filePath)); + }); rpps.append(rpp); diff --git a/src/plugins/qmakeprojectmanager/qmakeproject.cpp b/src/plugins/qmakeprojectmanager/qmakeproject.cpp index 99623894699..5716f20a690 100644 --- a/src/plugins/qmakeprojectmanager/qmakeproject.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeproject.cpp @@ -279,9 +279,7 @@ void QmakeProject::updateCppCodeModel() fileList.prepend(CppTools::CppModelManager::configurationFileName()); rpp.setFiles(fileList, [cumulativeSourceFiles](const QString &filePath) { // Keep this lambda thread-safe! - return CppTools::ProjectFile(filePath, - CppTools::ProjectFile::classify(filePath), - !cumulativeSourceFiles.contains(filePath)); + return !cumulativeSourceFiles.contains(filePath); }); rpps.append(rpp);