From c7e3bbcd118f4b7aec7f56f2e8301d91a418703d Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Wed, 28 Aug 2019 12:23:37 +0200 Subject: [PATCH] CppTools: Remove dependency of RawProjectPart to ProjectFile The feature to category files to ProjectFiles was used by the qmake project manager to specify if the file is "active", and by the Qbs project manager to avoid unnecessary MIME type checking. Make these two different use-cases explicit in the API. Change-Id: Ia5a7da37f100149366fc75060fe04687e15f2bd3 Reviewed-by: hjk Reviewed-by: Nikolai Kosjar --- src/plugins/cpptools/cppprojectfile.cpp | 42 +++++++++++-------- src/plugins/cpptools/cppprojectfile.h | 1 + .../cpptools/cppprojectfilecategorizer.cpp | 16 ++++--- .../cpptools/cppprojectfilecategorizer.h | 10 +++-- .../cpptools/cppprojectinfogenerator.cpp | 2 +- src/plugins/cpptools/cpprawprojectpart.cpp | 7 +++- src/plugins/cpptools/cpprawprojectpart.h | 12 ++++-- src/plugins/cpptools/cpptoolsconstants.h | 1 + src/plugins/qbsprojectmanager/qbsproject.cpp | 38 +++++++++-------- .../qmakeprojectmanager/qmakeproject.cpp | 4 +- 10 files changed, 78 insertions(+), 55 deletions(-) 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);