forked from qt-creator/qt-creator
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 <hjk@qt.io> Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
@@ -47,30 +47,36 @@ bool ProjectFile::operator==(const ProjectFile &other) const
|
|||||||
&& path == other.path;
|
&& 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)
|
ProjectFile::Kind ProjectFile::classify(const QString &filePath)
|
||||||
{
|
{
|
||||||
if (isAmbiguousHeader(filePath))
|
if (isAmbiguousHeader(filePath))
|
||||||
return AmbiguousHeader;
|
return AmbiguousHeader;
|
||||||
|
|
||||||
const Utils::MimeType mimeType = Utils::mimeTypeForFile(filePath);
|
const Utils::MimeType mimeType = Utils::mimeTypeForFile(filePath);
|
||||||
const QString mt = mimeType.name();
|
return classifyByMimeType(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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool ProjectFile::isAmbiguousHeader(const QString &filePath)
|
bool ProjectFile::isAmbiguousHeader(const QString &filePath)
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ public:
|
|||||||
OpenCLSource,
|
OpenCLSource,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static Kind classifyByMimeType(const QString &mt);
|
||||||
static Kind classify(const QString &filePath);
|
static Kind classify(const QString &filePath);
|
||||||
|
|
||||||
static bool isSource(Kind kind);
|
static bool isSource(Kind kind);
|
||||||
|
|||||||
@@ -31,10 +31,11 @@ namespace CppTools {
|
|||||||
|
|
||||||
ProjectFileCategorizer::ProjectFileCategorizer(const QString &projectPartName,
|
ProjectFileCategorizer::ProjectFileCategorizer(const QString &projectPartName,
|
||||||
const QStringList &filePaths,
|
const QStringList &filePaths,
|
||||||
const FileClassifier &fileClassifier)
|
const FileIsActive &fileIsActive,
|
||||||
|
const GetMimeType &getMimeType)
|
||||||
: m_partName(projectPartName)
|
: m_partName(projectPartName)
|
||||||
{
|
{
|
||||||
const ProjectFiles ambiguousHeaders = classifyFiles(filePaths, fileClassifier);
|
const ProjectFiles ambiguousHeaders = classifyFiles(filePaths, fileIsActive, getMimeType);
|
||||||
expandSourcesWithAmbiguousHeaders(ambiguousHeaders);
|
expandSourcesWithAmbiguousHeaders(ambiguousHeaders);
|
||||||
|
|
||||||
m_partCount = (m_cSources.isEmpty() ? 0 : 1)
|
m_partCount = (m_cSources.isEmpty() ? 0 : 1)
|
||||||
@@ -53,14 +54,17 @@ QString ProjectFileCategorizer::partName(const QString &languageName) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
ProjectFiles ProjectFileCategorizer::classifyFiles(const QStringList &filePaths,
|
ProjectFiles ProjectFileCategorizer::classifyFiles(const QStringList &filePaths,
|
||||||
const FileClassifier &fileClassifier)
|
const FileIsActive &fileIsActive,
|
||||||
|
const GetMimeType &getMimeType)
|
||||||
{
|
{
|
||||||
ProjectFiles ambiguousHeaders;
|
ProjectFiles ambiguousHeaders;
|
||||||
|
|
||||||
foreach (const QString &filePath, filePaths) {
|
foreach (const QString &filePath, filePaths) {
|
||||||
const ProjectFile projectFile = fileClassifier
|
const ProjectFile projectFile(filePath,
|
||||||
? fileClassifier(filePath)
|
getMimeType
|
||||||
: ProjectFile(filePath, ProjectFile::classify(filePath));
|
? ProjectFile::classifyByMimeType(getMimeType(filePath))
|
||||||
|
: ProjectFile::classify(filePath),
|
||||||
|
fileIsActive ? fileIsActive(filePath) : true);
|
||||||
|
|
||||||
switch (projectFile.kind) {
|
switch (projectFile.kind) {
|
||||||
case ProjectFile::AmbiguousHeader:
|
case ProjectFile::AmbiguousHeader:
|
||||||
|
|||||||
@@ -36,12 +36,14 @@ namespace CppTools {
|
|||||||
class ProjectFileCategorizer
|
class ProjectFileCategorizer
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using FileClassifier = RawProjectPart::FileClassifier;
|
using FileIsActive = RawProjectPart::FileIsActive;
|
||||||
|
using GetMimeType = RawProjectPart::GetMimeType;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
ProjectFileCategorizer(const QString &projectPartName,
|
ProjectFileCategorizer(const QString &projectPartName,
|
||||||
const QStringList &filePaths,
|
const QStringList &filePaths,
|
||||||
const FileClassifier &fileClassifier = FileClassifier());
|
const FileIsActive &fileIsActive = {},
|
||||||
|
const GetMimeType &getMimeType = {});
|
||||||
|
|
||||||
bool hasCSources() const { return !m_cSources.isEmpty(); }
|
bool hasCSources() const { return !m_cSources.isEmpty(); }
|
||||||
bool hasCxxSources() const { return !m_cxxSources.isEmpty(); }
|
bool hasCxxSources() const { return !m_cxxSources.isEmpty(); }
|
||||||
@@ -59,7 +61,9 @@ public:
|
|||||||
QString partName(const QString &languageName) const;
|
QString partName(const QString &languageName) const;
|
||||||
|
|
||||||
private:
|
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);
|
void expandSourcesWithAmbiguousHeaders(const ProjectFiles &ambiguousHeaders);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ QVector<ProjectPart::Ptr> ProjectInfoGenerator::createProjectParts(const RawProj
|
|||||||
QVector<ProjectPart::Ptr> result;
|
QVector<ProjectPart::Ptr> result;
|
||||||
ProjectFileCategorizer cat(rawProjectPart.displayName,
|
ProjectFileCategorizer cat(rawProjectPart.displayName,
|
||||||
rawProjectPart.files,
|
rawProjectPart.files,
|
||||||
rawProjectPart.fileClassifier);
|
rawProjectPart.fileIsActive);
|
||||||
|
|
||||||
if (!cat.hasParts())
|
if (!cat.hasParts())
|
||||||
return result;
|
return result;
|
||||||
|
|||||||
@@ -50,10 +50,13 @@ void RawProjectPart::setDisplayName(const QString &displayName)
|
|||||||
this->displayName = 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->files = files;
|
||||||
this->fileClassifier = fileClassifier;
|
this->fileIsActive = fileIsActive;
|
||||||
|
this->getMimeType = getMimeType;
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString trimTrailingSlashes(const QString &path) {
|
static QString trimTrailingSlashes(const QString &path) {
|
||||||
|
|||||||
@@ -58,9 +58,12 @@ public:
|
|||||||
void setConfigFileName(const QString &configFileName);
|
void setConfigFileName(const QString &configFileName);
|
||||||
void setCallGroupId(const QString &id);
|
void setCallGroupId(const QString &id);
|
||||||
|
|
||||||
// FileClassifier must be thread-safe.
|
// FileIsActive and GetMimeType must be thread-safe.
|
||||||
using FileClassifier = std::function<ProjectFile(const QString &filePath)>;
|
using FileIsActive = std::function<bool(const QString &filePath)>;
|
||||||
void setFiles(const QStringList &files, const FileClassifier &fileClassifier = FileClassifier());
|
using GetMimeType = std::function<QString(const QString &filePath)>;
|
||||||
|
void setFiles(const QStringList &files,
|
||||||
|
const FileIsActive &fileIsActive = {},
|
||||||
|
const GetMimeType &getMimeType = {});
|
||||||
static ProjectExplorer::HeaderPath frameworkDetectionHeuristic(const ProjectExplorer::HeaderPath &header);
|
static ProjectExplorer::HeaderPath frameworkDetectionHeuristic(const ProjectExplorer::HeaderPath &header);
|
||||||
void setHeaderPaths(const ProjectExplorer::HeaderPaths &headerPaths);
|
void setHeaderPaths(const ProjectExplorer::HeaderPaths &headerPaths);
|
||||||
void setIncludePaths(const QStringList &includePaths);
|
void setIncludePaths(const QStringList &includePaths);
|
||||||
@@ -86,7 +89,8 @@ public:
|
|||||||
|
|
||||||
// Files
|
// Files
|
||||||
QStringList files;
|
QStringList files;
|
||||||
FileClassifier fileClassifier;
|
FileIsActive fileIsActive;
|
||||||
|
GetMimeType getMimeType;
|
||||||
QStringList precompiledHeaders;
|
QStringList precompiledHeaders;
|
||||||
ProjectExplorer::HeaderPaths headerPaths;
|
ProjectExplorer::HeaderPaths headerPaths;
|
||||||
QString projectConfigFile; // Generic Project Manager only
|
QString projectConfigFile; // Generic Project Manager only
|
||||||
|
|||||||
@@ -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 CPP_HEADER_MIMETYPE[] = "text/x-c++hdr";
|
||||||
const char QDOC_MIMETYPE[] = "text/x-qdoc";
|
const char QDOC_MIMETYPE[] = "text/x-qdoc";
|
||||||
const char MOC_MIMETYPE[] = "text/x-moc";
|
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.
|
// QSettings keys for use by the "New Class" wizards.
|
||||||
const char CPPTOOLS_SETTINGSGROUP[] = "CppTools";
|
const char CPPTOOLS_SETTINGSGROUP[] = "CppTools";
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#include <coreplugin/vcsmanager.h>
|
#include <coreplugin/vcsmanager.h>
|
||||||
#include <cpptools/cppmodelmanager.h>
|
#include <cpptools/cppmodelmanager.h>
|
||||||
#include <cpptools/cppprojectupdater.h>
|
#include <cpptools/cppprojectupdater.h>
|
||||||
|
#include <cpptools/cpptoolsconstants.h>
|
||||||
#include <cpptools/generatedcodemodelsupport.h>
|
#include <cpptools/generatedcodemodelsupport.h>
|
||||||
#include <extensionsystem/pluginmanager.h>
|
#include <extensionsystem/pluginmanager.h>
|
||||||
#include <projectexplorer/buildenvironmentwidget.h>
|
#include <projectexplorer/buildenvironmentwidget.h>
|
||||||
@@ -731,22 +732,22 @@ void QbsProject::updateDocuments(const std::set<QString> &files)
|
|||||||
setExtraProjectFiles(nonBuildDirFilePaths);
|
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()))
|
if (CppTools::ProjectFile::isAmbiguousHeader(sourceFile.filePath()))
|
||||||
return CppTools::ProjectFile::AmbiguousHeader;
|
return CppTools::Constants::AMBIGUOUS_HEADER_MIMETYPE;
|
||||||
return CppTools::ProjectFile::CXXHeader;
|
return CppTools::Constants::CPP_HEADER_MIMETYPE;
|
||||||
}
|
}
|
||||||
if (sourceFile.fileTags().contains(QLatin1String("cpp")))
|
if (sourceFile.fileTags().contains("cpp"))
|
||||||
return CppTools::ProjectFile::CXXSource;
|
return CppTools::Constants::CPP_SOURCE_MIMETYPE;
|
||||||
if (sourceFile.fileTags().contains(QLatin1String("c")))
|
if (sourceFile.fileTags().contains("c"))
|
||||||
return CppTools::ProjectFile::CSource;
|
return CppTools::Constants::C_SOURCE_MIMETYPE;
|
||||||
if (sourceFile.fileTags().contains(QLatin1String("objc")))
|
if (sourceFile.fileTags().contains("objc"))
|
||||||
return CppTools::ProjectFile::ObjCSource;
|
return CppTools::Constants::OBJECTIVE_C_SOURCE_MIMETYPE;
|
||||||
if (sourceFile.fileTags().contains(QLatin1String("objcpp")))
|
if (sourceFile.fileTags().contains("objcpp"))
|
||||||
return CppTools::ProjectFile::ObjCXXSource;
|
return CppTools::Constants::OBJECTIVE_CPP_SOURCE_MIMETYPE;
|
||||||
return CppTools::ProjectFile::Unsupported;
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
static QString groupLocationToCallGroupId(const qbs::CodeLocation &location)
|
static QString groupLocationToCallGroupId(const qbs::CodeLocation &location)
|
||||||
@@ -1011,10 +1012,11 @@ void QbsProject::updateCppCodeModel()
|
|||||||
qCWarning(qbsPmLog) << "Expect problems with code model";
|
qCWarning(qbsPmLog) << "Expect problems with code model";
|
||||||
}
|
}
|
||||||
rpp.setPreCompiledHeaders(Utils::toList(pchFiles));
|
rpp.setPreCompiledHeaders(Utils::toList(pchFiles));
|
||||||
rpp.setFiles(grp.allFilePaths(), [filePathToSourceArtifact](const QString &filePath) {
|
rpp.setFiles(grp.allFilePaths(),
|
||||||
|
{},
|
||||||
|
[filePathToSourceArtifact](const QString &filePath) {
|
||||||
// Keep this lambda thread-safe!
|
// Keep this lambda thread-safe!
|
||||||
return CppTools::ProjectFile(filePath,
|
return getMimeType(filePathToSourceArtifact.value(filePath));
|
||||||
cppFileType(filePathToSourceArtifact.value(filePath)));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
rpps.append(rpp);
|
rpps.append(rpp);
|
||||||
|
|||||||
@@ -279,9 +279,7 @@ void QmakeProject::updateCppCodeModel()
|
|||||||
fileList.prepend(CppTools::CppModelManager::configurationFileName());
|
fileList.prepend(CppTools::CppModelManager::configurationFileName());
|
||||||
rpp.setFiles(fileList, [cumulativeSourceFiles](const QString &filePath) {
|
rpp.setFiles(fileList, [cumulativeSourceFiles](const QString &filePath) {
|
||||||
// Keep this lambda thread-safe!
|
// Keep this lambda thread-safe!
|
||||||
return CppTools::ProjectFile(filePath,
|
return !cumulativeSourceFiles.contains(filePath);
|
||||||
CppTools::ProjectFile::classify(filePath),
|
|
||||||
!cumulativeSourceFiles.contains(filePath));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
rpps.append(rpp);
|
rpps.append(rpp);
|
||||||
|
|||||||
Reference in New Issue
Block a user