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:
Eike Ziller
2019-08-28 12:23:37 +02:00
parent b4dd2ea2cc
commit c7e3bbcd11
10 changed files with 78 additions and 55 deletions

View File

@@ -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)

View File

@@ -50,6 +50,7 @@ public:
OpenCLSource,
};
static Kind classifyByMimeType(const QString &mt);
static Kind classify(const QString &filePath);
static bool isSource(Kind kind);

View File

@@ -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:

View File

@@ -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:

View File

@@ -87,7 +87,7 @@ QVector<ProjectPart::Ptr> ProjectInfoGenerator::createProjectParts(const RawProj
QVector<ProjectPart::Ptr> result;
ProjectFileCategorizer cat(rawProjectPart.displayName,
rawProjectPart.files,
rawProjectPart.fileClassifier);
rawProjectPart.fileIsActive);
if (!cat.hasParts())
return result;

View File

@@ -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) {

View File

@@ -58,9 +58,12 @@ public:
void setConfigFileName(const QString &configFileName);
void setCallGroupId(const QString &id);
// FileClassifier must be thread-safe.
using FileClassifier = std::function<ProjectFile(const QString &filePath)>;
void setFiles(const QStringList &files, const FileClassifier &fileClassifier = FileClassifier());
// FileIsActive and GetMimeType must be thread-safe.
using FileIsActive = std::function<bool(const QString &filePath)>;
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);
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

View File

@@ -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";