PchManager: Split pch tasks in project and system pch tasks

Like you can see in the task numbers this patch is touching many different
areas. So I will only touch the main parts. It is using a clang action
instead of an extra process which will be enabling the handling of
generated files in PCHs. The flags from the project part are now not
anymore transformed in a command line but they are saved in the container
semantically aware so that they can later be merged. Most of this patch is
simply polishing of other patches.

Task-number: QTCREATORBUG-21346
Task-number: QTCREATORBUG-21380
Task-number: QTCREATORBUG-21382
Task-number: QTCREATORBUG-21383
Task-number: QTCREATORBUG-21693
Task-number: QTCREATORBUG-21778
Change-Id: I9b0c02d8149b554254e819448fbc61eeaa5b7494
Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
This commit is contained in:
Marco Bubke
2018-12-17 12:06:57 +01:00
parent a78e3e5dd5
commit dd366b68de
114 changed files with 3742 additions and 1787 deletions

View File

@@ -36,6 +36,7 @@
#include <cpptools/compileroptionsbuilder.h>
#include <cpptools/projectpart.h>
#include <cpptools/headerpathfilter.h>
#include <utils/algorithm.h>
@@ -64,10 +65,11 @@ ProjectUpdater::ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &s
{
}
void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts)
void ProjectUpdater::updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts,
Utils::SmallStringVector &&toolChainArguments)
{
m_server.updateProjectParts(
ClangBackEnd::UpdateProjectPartsMessage{toProjectPartContainers(projectParts)});
m_server.updateProjectParts(ClangBackEnd::UpdateProjectPartsMessage{
toProjectPartContainers(projectParts), std::move(toolChainArguments)});
}
void ProjectUpdater::removeProjectParts(const QStringList &projectPartIds)
@@ -147,11 +149,21 @@ HeaderAndSources ProjectUpdater::headerAndSourcesFromProjectPart(
return headerAndSources;
}
QStringList ProjectUpdater::compilerArguments(CppTools::ProjectPart *projectPart)
QStringList ProjectUpdater::toolChainArguments(CppTools::ProjectPart *projectPart)
{
using CppTools::CompilerOptionsBuilder;
CompilerOptionsBuilder builder(*projectPart, CppTools::UseSystemHeader::Yes);
return builder.build(CppTools::ProjectFile::CXXHeader, CppTools::UsePrecompiledHeaders::No);
builder.addWordWidth();
builder.addPicIfCompilerFlagsContainsIt();
builder.addTargetTriple();
builder.addExtraCodeModelFlags();
builder.undefineClangVersionMacrosForMsvc();
builder.undefineCppLanguageFeatureMacrosForMsvc2015();
builder.addProjectConfigFileInclude();
builder.addMsvcCompatibilityVersion();
return builder.options();
}
ClangBackEnd::CompilerMacros ProjectUpdater::createCompilerMacros(const ProjectExplorer::Macros &projectMacros)
@@ -167,43 +179,102 @@ ClangBackEnd::CompilerMacros ProjectUpdater::createCompilerMacros(const ProjectE
return macros;
}
Utils::SmallStringVector ProjectUpdater::createIncludeSearchPaths(
const ProjectExplorer::HeaderPaths &projectPartHeaderPaths)
namespace {
ClangBackEnd::IncludeSearchPathType convertType(ProjectExplorer::HeaderPathType sourceType)
{
Utils::SmallStringVector includePaths;
using ProjectExplorer::HeaderPathType;
using ClangBackEnd::IncludeSearchPathType;
for (const ProjectExplorer::HeaderPath &projectPartHeaderPath : projectPartHeaderPaths) {
if (!projectPartHeaderPath.path.isEmpty())
includePaths.emplace_back(projectPartHeaderPath.path);
switch (sourceType) {
case HeaderPathType::User:
return IncludeSearchPathType::User;
case HeaderPathType::System:
return IncludeSearchPathType::System;
case HeaderPathType::BuiltIn:
return IncludeSearchPathType::BuiltIn;
case HeaderPathType::Framework:
return IncludeSearchPathType::Framework;
}
std::sort(includePaths.begin(), includePaths.end());
return includePaths;
return IncludeSearchPathType::Invalid;
}
ClangBackEnd::V2::ProjectPartContainer ProjectUpdater::toProjectPartContainer(
ClangBackEnd::IncludeSearchPaths convertToIncludeSearchPaths(ProjectExplorer::HeaderPaths headerPaths)
{
ClangBackEnd::IncludeSearchPaths paths;
paths.reserve(Utils::usize(headerPaths));
int index = 0;
for (const ProjectExplorer::HeaderPath &headerPath : headerPaths)
paths.emplace_back(headerPath.path, ++index, convertType(headerPath.type));
std::sort(paths.begin(), paths.end());
return paths;
}
ClangBackEnd::IncludeSearchPaths convertToIncludeSearchPaths(
ProjectExplorer::HeaderPaths headerPaths, ProjectExplorer::HeaderPaths headerPaths2)
{
ClangBackEnd::IncludeSearchPaths paths;
paths.reserve(Utils::usize(headerPaths) + Utils::usize(headerPaths2));
int index = 0;
for (const ProjectExplorer::HeaderPath &headerPath : headerPaths)
paths.emplace_back(headerPath.path, ++index, convertType(headerPath.type));
for (const ProjectExplorer::HeaderPath &headerPath : headerPaths2)
paths.emplace_back(headerPath.path, ++index, convertType(headerPath.type));
std::sort(paths.begin(), paths.end());
return paths;
}
} // namespace
ProjectUpdater::SystemAndProjectIncludeSearchPaths ProjectUpdater::createIncludeSearchPaths(
const CppTools::ProjectPart &projectPart)
{
CppTools::HeaderPathFilter filter(projectPart,
CppTools::UseTweakedHeaderPaths::Yes,
CLANG_VERSION,
CLANG_RESOURCE_DIR);
filter.process();
return {convertToIncludeSearchPaths(filter.systemHeaderPaths, filter.builtInHeaderPaths),
convertToIncludeSearchPaths(filter.userHeaderPaths)};
}
ClangBackEnd::ProjectPartContainer ProjectUpdater::toProjectPartContainer(
CppTools::ProjectPart *projectPart) const
{
QStringList arguments = compilerArguments(projectPart);
QStringList arguments = toolChainArguments(projectPart);
HeaderAndSources headerAndSources = headerAndSourcesFromProjectPart(projectPart);
return ClangBackEnd::V2::ProjectPartContainer(projectPart->id(),
Utils::SmallStringVector(arguments),
createCompilerMacros(projectPart->projectMacros),
createIncludeSearchPaths(projectPart->headerPaths),
std::move(headerAndSources.headers),
std::move(headerAndSources.sources));
auto includeSearchPaths = createIncludeSearchPaths(*projectPart);
return ClangBackEnd::ProjectPartContainer(projectPart->id(),
Utils::SmallStringVector(arguments),
createCompilerMacros(projectPart->projectMacros),
std::move(includeSearchPaths.system),
std::move(includeSearchPaths.project),
std::move(headerAndSources.headers),
std::move(headerAndSources.sources),
projectPart->language,
projectPart->languageVersion,
static_cast<Utils::LanguageExtension>(
int(projectPart->languageExtensions)));
}
std::vector<ClangBackEnd::V2::ProjectPartContainer> ProjectUpdater::toProjectPartContainers(
ClangBackEnd::ProjectPartContainers ProjectUpdater::toProjectPartContainers(
std::vector<CppTools::ProjectPart *> projectParts) const
{
using namespace std::placeholders;
std::vector<ClangBackEnd::V2::ProjectPartContainer> projectPartContainers;
std::vector<ClangBackEnd::ProjectPartContainer> projectPartContainers;
projectPartContainers.reserve(projectParts.size());
std::transform(projectParts.begin(),

View File

@@ -31,6 +31,8 @@
#include <filecontainerv2.h>
#include <filepathcachinginterface.h>
#include <generatedfiles.h>
#include <includesearchpath.h>
#include <projectpartcontainer.h>
#include <projectexplorer/headerpath.h>
@@ -46,10 +48,6 @@ class ProjectFile;
namespace ClangBackEnd {
class ProjectManagementServerInterface;
namespace V2 {
class ProjectPartContainer;
}
}
QT_FORWARD_DECLARE_CLASS(QStringList)
@@ -64,33 +62,39 @@ class PchManagerClient;
class CLANGPCHMANAGER_EXPORT ProjectUpdater
{
public:
struct SystemAndProjectIncludeSearchPaths
{
ClangBackEnd::IncludeSearchPaths system;
ClangBackEnd::IncludeSearchPaths project;
};
ProjectUpdater(ClangBackEnd::ProjectManagementServerInterface &server,
ClangBackEnd::FilePathCachingInterface &filePathCache);
void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts);
void updateProjectParts(const std::vector<CppTools::ProjectPart *> &projectParts,
Utils::SmallStringVector &&toolChainArguments);
void removeProjectParts(const QStringList &projectPartIds);
void updateGeneratedFiles(ClangBackEnd::V2::FileContainers &&generatedFiles);
void removeGeneratedFiles(ClangBackEnd::FilePaths &&filePaths);
unittest_public:
void setExcludedPaths(ClangBackEnd::FilePaths &&excludedPaths);
const ClangBackEnd::FilePaths &excludedPaths() const;
const ClangBackEnd::GeneratedFiles &generatedFiles() const;
HeaderAndSources headerAndSourcesFromProjectPart(CppTools::ProjectPart *projectPart) const;
ClangBackEnd::V2::ProjectPartContainer toProjectPartContainer(
ClangBackEnd::ProjectPartContainer toProjectPartContainer(
CppTools::ProjectPart *projectPart) const;
std::vector<ClangBackEnd::V2::ProjectPartContainer> toProjectPartContainers(
ClangBackEnd::ProjectPartContainers toProjectPartContainers(
std::vector<CppTools::ProjectPart *> projectParts) const;
void addToHeaderAndSources(HeaderAndSources &headerAndSources,
const CppTools::ProjectFile &projectFile) const;
static QStringList compilerArguments(CppTools::ProjectPart *projectPart);
static QStringList toolChainArguments(CppTools::ProjectPart *projectPart);
static ClangBackEnd::CompilerMacros createCompilerMacros(
const ProjectExplorer::Macros &projectMacros);
static Utils::SmallStringVector createIncludeSearchPaths(
const ProjectExplorer::HeaderPaths &projectPartHeaderPaths);
static SystemAndProjectIncludeSearchPaths createIncludeSearchPaths(
const CppTools::ProjectPart &projectPart);
static ClangBackEnd::FilePaths createExcludedPaths(
const ClangBackEnd::V2::FileContainers &generatedFiles);

View File

@@ -71,7 +71,8 @@ public:
void projectPartsUpdated(ProjectExplorer::Project *project)
{
ProjectUpdaterType::updateProjectParts(Internal::createProjectParts(project));
ProjectUpdaterType::updateProjectParts(Internal::createProjectParts(project), {}); // TODO add support for toolchainarguments
}
void projectPartsRemoved(const QStringList &projectPartIds)