forked from qt-creator/qt-creator
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:
@@ -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(),
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user