QMakeProjectManager: Use ProjectPartBuilder

...as the other project managers.

This removes extra code paths, duplication and improves classification
of source files (ambiguous headers).

Change-Id: Iae05cbbc61ab2e5dd841ae617bec994e0a1e52d5
Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
Nikolai Kosjar
2016-12-05 17:30:56 +01:00
parent 43c6e97529
commit 0265442c93
5 changed files with 37 additions and 99 deletions

View File

@@ -101,6 +101,11 @@ void BaseProjectPartBuilder::setPreCompiledHeaders(const QStringList &preCompile
m_templatePart->precompiledHeaders = preCompiledHeaders; m_templatePart->precompiledHeaders = preCompiledHeaders;
} }
void BaseProjectPartBuilder::setSelectedForBuilding(bool yesno)
{
m_templatePart->selectedForBuilding = yesno;
}
void BaseProjectPartBuilder::setProjectFile(const QString &projectFile) void BaseProjectPartBuilder::setProjectFile(const QString &projectFile)
{ {
m_templatePart->projectFile = projectFile; m_templatePart->projectFile = projectFile;
@@ -262,13 +267,6 @@ private:
} // anynomous } // anynomous
void BaseProjectPartBuilder::evaluateToolChain(ProjectPart &projectPart,
const ToolChainInterface &toolChain)
{
ToolChainEvaluator evaluator(projectPart, toolChain);
evaluator.evaluate();
}
void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles, void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles,
const QString &partName, const QString &partName,
ProjectPart::LanguageVersion languageVersion, ProjectPart::LanguageVersion languageVersion,
@@ -281,8 +279,10 @@ void BaseProjectPartBuilder::createProjectPart(const ProjectFiles &projectFiles,
QTC_ASSERT(part->project, return); QTC_ASSERT(part->project, return);
// TODO: If not toolchain is set, show a warning // TODO: If not toolchain is set, show a warning
if (const ToolChainInterfacePtr toolChain = selectToolChain(languageVersion)) if (const ToolChainInterfacePtr toolChain = selectToolChain(languageVersion)) {
evaluateToolChain(*part.data(), *toolChain.get()); ToolChainEvaluator evaluator(*part.data(), *toolChain.get());
evaluator.evaluate();
}
part->languageExtensions |= languageExtensions; part->languageExtensions |= languageExtensions;
part->updateLanguageFeatures(); part->updateLanguageFeatures();

View File

@@ -60,13 +60,12 @@ public:
void setPreCompiledHeaders(const QStringList &preCompiledHeaders); void setPreCompiledHeaders(const QStringList &preCompiledHeaders);
void setSelectedForBuilding(bool yesno);
using FileClassifier = std::function<ProjectFile::Kind (const QString &filePath)>; using FileClassifier = std::function<ProjectFile::Kind (const QString &filePath)>;
QList<Core::Id> createProjectPartsForFiles(const QStringList &filePaths, QList<Core::Id> createProjectPartsForFiles(const QStringList &filePaths,
FileClassifier fileClassifier = FileClassifier()); FileClassifier fileClassifier = FileClassifier());
static void evaluateToolChain(ProjectPart &projectPart,
const ToolChainInterface &selectToolChain);
private: private:
void createProjectPart(const ProjectFiles &projectFiles, void createProjectPart(const ProjectFiles &projectFiles,
const QString &partName, const QString &partName,

View File

@@ -140,13 +140,4 @@ ProjectPartBuilder::ProjectPartBuilder(ProjectInfo &projectInfo)
{ {
} }
void ProjectPartBuilder::evaluateToolChain(ProjectPart &projectPart,
ProjectExplorer::ToolChain &toolChain,
const ProjectExplorer::Kit *kit,
const QStringList commandLineFlags)
{
const ToolChainImpl toolChainImpl(toolChain, kit, commandLineFlags);
BaseProjectPartBuilder::evaluateToolChain(projectPart, toolChainImpl);
}
} // namespace CppTools } // namespace CppTools

View File

@@ -29,11 +29,6 @@
#include "cppbaseprojectpartbuilder.h" #include "cppbaseprojectpartbuilder.h"
namespace ProjectExplorer {
class Kit;
class ToolChain;
}
namespace CppTools { namespace CppTools {
class ProjectInfo; class ProjectInfo;
@@ -42,11 +37,6 @@ class CPPTOOLS_EXPORT ProjectPartBuilder : public BaseProjectPartBuilder
{ {
public: public:
ProjectPartBuilder(ProjectInfo &projectInfo); ProjectPartBuilder(ProjectInfo &projectInfo);
static void evaluateToolChain(ProjectPart &projectPart,
ProjectExplorer::ToolChain &toolChain,
const ProjectExplorer::Kit *kit,
const QStringList commandLineFlags);
}; };
} // namespace CppTools } // namespace CppTools

View File

@@ -357,7 +357,6 @@ void QmakeProject::updateCodeModels()
void QmakeProject::updateCppCodeModel() void QmakeProject::updateCppCodeModel()
{ {
using ProjectPart = CppTools::ProjectPart; using ProjectPart = CppTools::ProjectPart;
using ProjectFile = CppTools::ProjectFile;
m_toolChainWarnings.clear(); m_toolChainWarnings.clear();
@@ -380,95 +379,54 @@ void QmakeProject::updateCppCodeModel()
FindQmakeProFiles findQmakeProFiles; FindQmakeProFiles findQmakeProFiles;
const QList<QmakeProFileNode *> proFiles = findQmakeProFiles(rootProjectNode()); const QList<QmakeProFileNode *> proFiles = findQmakeProFiles(rootProjectNode());
CppTools::ProjectInfo projectInfo(this); CppTools::ProjectInfo projectInfo(this);
CppTools::ProjectPartBuilder ppBuilder(projectInfo);
QList<ProjectExplorer::ExtraCompiler *> generators; QList<ProjectExplorer::ExtraCompiler *> generators;
foreach (QmakeProFileNode *pro, proFiles) { foreach (QmakeProFileNode *pro, proFiles) {
warnOnToolChainMismatch(pro); warnOnToolChainMismatch(pro);
ProjectPart::Ptr templatePart(new ProjectPart); ppBuilder.setDisplayName(pro->displayName());
templatePart->project = this; ppBuilder.setProjectFile(pro->filePath().toString());
templatePart->displayName = pro->displayName(); ppBuilder.setCxxFlags(pro->variableValue(CppFlagsVar)); // TODO: Handle QMAKE_CFLAGS
templatePart->projectFile = pro->filePath().toString(); ppBuilder.setDefines(pro->cxxDefines());
templatePart->selectedForBuilding = pro->includedInExactParse(); ppBuilder.setPreCompiledHeaders(pro->variableValue(PrecompiledHeaderVar));
templatePart->projectDefines += pro->cxxDefines(); ppBuilder.setSelectedForBuilding(pro->includedInExactParse());
templatePart->precompiledHeaders.append(pro->variableValue(PrecompiledHeaderVar));
// Qt Version
if (pro->variableValue(ConfigVar).contains(QLatin1String("qt"))) if (pro->variableValue(ConfigVar).contains(QLatin1String("qt")))
templatePart->qtVersion = qtVersionForPart; ppBuilder.setQtVersion(qtVersionForPart);
else else
templatePart->qtVersion = ProjectPart::NoQt; ppBuilder.setQtVersion(ProjectPart::NoQt);
// Header paths
CppTools::ProjectPartHeaderPaths headerPaths;
using CppToolsHeaderPath = CppTools::ProjectPartHeaderPath;
foreach (const QString &inc, pro->variableValue(IncludePathVar)) { foreach (const QString &inc, pro->variableValue(IncludePathVar)) {
const auto headerPath const auto headerPath = CppToolsHeaderPath(inc, CppToolsHeaderPath::IncludePath);
= CppTools::ProjectPartHeaderPath(inc, CppTools::ProjectPartHeaderPath::IncludePath); if (!headerPaths.contains(headerPath))
if (!templatePart->headerPaths.contains(headerPath)) headerPaths += headerPath;
templatePart->headerPaths += headerPath;
} }
if (qtVersion && !qtVersion->frameworkInstallPath().isEmpty()) { if (qtVersion && !qtVersion->frameworkInstallPath().isEmpty()) {
templatePart->headerPaths += CppTools::ProjectPartHeaderPath( headerPaths += CppToolsHeaderPath(qtVersion->frameworkInstallPath(),
qtVersion->frameworkInstallPath(), CppToolsHeaderPath::FrameworkPath);
CppTools::ProjectPartHeaderPath::FrameworkPath);
} }
ppBuilder.setHeaderPaths(headerPaths);
// TODO: there is no LANG_OBJCXX, so: // Files and generators
const QStringList cxxflags = pro->variableValue(CppFlagsVar); QStringList fileList = pro->variableValue(SourceVar);
if (ToolChain *t = ToolChainKitInformation::toolChain(k, ToolChain::Language::Cxx))
CppTools::ProjectPartBuilder::evaluateToolChain(*templatePart.data(), *t, k, cxxflags);
setProjectLanguage(ProjectExplorer::Constants::LANG_CXX, true);
ProjectPart::Ptr cppPart = templatePart->copy();
ProjectPart::Ptr objcppPart = templatePart->copy();
foreach (const QString &file, pro->variableValue(SourceVar)) {
const ProjectFile::Kind kind = ProjectFile::classify(file);
switch (kind) {
case ProjectFile::ObjCHeader:
case ProjectFile::ObjCSource:
case ProjectFile::ObjCXXHeader:
case ProjectFile::ObjCXXSource:
objcppPart->files << ProjectFile(file, kind);
break;
default:
cppPart->files << ProjectFile(file, kind);
break;
}
}
// generated files:
QList<ProjectExplorer::ExtraCompiler *> proGenerators = pro->extraCompilers(); QList<ProjectExplorer::ExtraCompiler *> proGenerators = pro->extraCompilers();
foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) { foreach (ProjectExplorer::ExtraCompiler *ec, proGenerators) {
ec->forEachTarget([&](const Utils::FileName &generatedFile) { ec->forEachTarget([&](const Utils::FileName &generatedFile) {
const QString name = generatedFile.toString(); fileList += generatedFile.toString();
const ProjectFile::Kind kind = ProjectFile::classify(name);
switch (kind) {
case ProjectFile::AmbiguousHeader:
case ProjectFile::CHeader:
case ProjectFile::CSource:
case ProjectFile::CXXHeader:
case ProjectFile::CXXSource:
cppPart->files << ProjectFile(name, kind);
break;
case ProjectFile::ObjCHeader:
case ProjectFile::ObjCSource:
case ProjectFile::ObjCXXHeader:
case ProjectFile::ObjCXXSource:
objcppPart->files << ProjectFile(name, kind);
break;
default:
break;
}
}); });
} }
generators.append(proGenerators); generators.append(proGenerators);
projectInfo.appendProjectPart(cppPart); const QList<Core::Id> languages = ppBuilder.createProjectPartsForFiles(fileList);
foreach (const Core::Id &language, languages)
if (!objcppPart->files.isEmpty()) { setProjectLanguage(language, true);
objcppPart->displayName += QLatin1String(" (ObjC++)");
objcppPart->languageExtensions |= ProjectPart::ObjectiveCExtensions;
projectInfo.appendProjectPart(objcppPart);
cppPart->displayName += QLatin1String(" (C++)");
}
} }
CppTools::GeneratedCodeModelSupport::update(generators); CppTools::GeneratedCodeModelSupport::update(generators);