forked from qt-creator/qt-creator
Clang: Take precompiled headers into account when parsing source files
Task-number: QTCREATORBUG-15590 Change-Id: Icbfce4ffd6e9f9802641d35d898fa1dc1c4c18ee Reviewed-by: Nikolai Kosjar <nikolai.kosjar@qt.io>
This commit is contained in:
committed by
Nikolai Kosjar
parent
569f4499c0
commit
36d4d01cd3
@@ -401,9 +401,30 @@ static QStringList warningOptions(CppTools::ProjectPart *projectPart)
|
|||||||
return CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineOptions();
|
return CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static QStringList precompiledHeaderOptions(
|
||||||
|
const QString& filePath,
|
||||||
|
CppTools::ProjectPart *projectPart)
|
||||||
|
{
|
||||||
|
using namespace CppTools;
|
||||||
|
|
||||||
|
if (CppTools::getPchUsage() == CompilerOptionsBuilder::PchUsage::None)
|
||||||
|
return QStringList();
|
||||||
|
|
||||||
|
if (projectPart->precompiledHeaders.contains(filePath))
|
||||||
|
return QStringList();
|
||||||
|
|
||||||
|
const CppTools::ProjectPart theProjectPart = projectPartForLanguageOption(projectPart);
|
||||||
|
CppTools::CompilerOptionsBuilder builder(theProjectPart);
|
||||||
|
builder.addPrecompiledHeaderOptions(CompilerOptionsBuilder::PchUsage::Use);
|
||||||
|
|
||||||
|
return builder.options();
|
||||||
|
}
|
||||||
|
|
||||||
static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart *projectPart)
|
static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart *projectPart)
|
||||||
{
|
{
|
||||||
return languageOptions(filePath, projectPart) + warningOptions(projectPart);
|
return languageOptions(filePath, projectPart)
|
||||||
|
+ warningOptions(projectPart)
|
||||||
|
+ precompiledHeaderOptions(filePath, projectPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
ClangBackEnd::FileContainer
|
ClangBackEnd::FileContainer
|
||||||
|
@@ -192,27 +192,6 @@ QStringList createClangOptions(const ProjectPart::Ptr &pPart, ProjectFile::Kind
|
|||||||
return LibClangOptionsBuilder::build(pPart, fileKind);
|
return LibClangOptionsBuilder::build(pPart, fileKind);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// @return Option to speed up parsing with precompiled header
|
|
||||||
QStringList createPCHInclusionOptions(const QStringList &pchFiles)
|
|
||||||
{
|
|
||||||
QStringList opts;
|
|
||||||
|
|
||||||
foreach (const QString &pchFile, pchFiles) {
|
|
||||||
if (QFile(pchFile).exists()) {
|
|
||||||
opts += QLatin1String("-include-pch");
|
|
||||||
opts += pchFile;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return opts;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// @return Option to speed up parsing with precompiled header
|
|
||||||
QStringList createPCHInclusionOptions(const QString &pchFile)
|
|
||||||
{
|
|
||||||
return createPCHInclusionOptions(QStringList() << pchFile);
|
|
||||||
}
|
|
||||||
|
|
||||||
ProjectPart::Ptr projectPartForFile(const QString &filePath)
|
ProjectPart::Ptr projectPartForFile(const QString &filePath)
|
||||||
{
|
{
|
||||||
if (const auto parser = CppTools::BaseEditorDocumentParser::get(filePath))
|
if (const auto parser = CppTools::BaseEditorDocumentParser::get(filePath))
|
||||||
|
@@ -34,7 +34,6 @@ QStringList createClangOptions(const CppTools::ProjectPart::Ptr &pPart,
|
|||||||
CppTools::ProjectFile::Kind fileKind);
|
CppTools::ProjectFile::Kind fileKind);
|
||||||
QStringList createClangOptions(const CppTools::ProjectPart::Ptr &pPart,
|
QStringList createClangOptions(const CppTools::ProjectPart::Ptr &pPart,
|
||||||
const QString &fileName = QString());
|
const QString &fileName = QString());
|
||||||
QStringList createPCHInclusionOptions(const QString &pchFile);
|
|
||||||
|
|
||||||
CppTools::ProjectPart::Ptr projectPartForFile(const QString &filePath);
|
CppTools::ProjectPart::Ptr projectPartForFile(const QString &filePath);
|
||||||
CppTools::ProjectPart::Ptr projectPartForFileBasedOnProcessor(const QString &filePath);
|
CppTools::ProjectPart::Ptr projectPartForFileBasedOnProcessor(const QString &filePath);
|
||||||
|
@@ -117,7 +117,8 @@ void RefactoringCompilerOptionsBuilder::addExtraOptions()
|
|||||||
}
|
}
|
||||||
|
|
||||||
Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::ProjectPart *projectPart,
|
Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::ProjectPart *projectPart,
|
||||||
CppTools::ProjectFile::Kind fileKind)
|
CppTools::ProjectFile::Kind fileKind,
|
||||||
|
PchUsage pchUsage)
|
||||||
{
|
{
|
||||||
if (projectPart == nullptr)
|
if (projectPart == nullptr)
|
||||||
return Utils::SmallStringVector();
|
return Utils::SmallStringVector();
|
||||||
@@ -138,6 +139,7 @@ Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::Proj
|
|||||||
optionsBuilder.addPredefinedMacrosAndHeaderPathsOptions();
|
optionsBuilder.addPredefinedMacrosAndHeaderPathsOptions();
|
||||||
optionsBuilder.addWrappedQtHeadersIncludePath();
|
optionsBuilder.addWrappedQtHeadersIncludePath();
|
||||||
optionsBuilder.addHeaderPathOptions();
|
optionsBuilder.addHeaderPathOptions();
|
||||||
|
optionsBuilder.addPrecompiledHeaderOptions(pchUsage);
|
||||||
optionsBuilder.addProjectConfigFileInclude();
|
optionsBuilder.addProjectConfigFileInclude();
|
||||||
|
|
||||||
optionsBuilder.addMsvcCompatibilityVersion();
|
optionsBuilder.addMsvcCompatibilityVersion();
|
||||||
|
@@ -41,7 +41,8 @@ class RefactoringCompilerOptionsBuilder : public CppTools::CompilerOptionsBuilde
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static Utils::SmallStringVector build(CppTools::ProjectPart *projectPart,
|
static Utils::SmallStringVector build(CppTools::ProjectPart *projectPart,
|
||||||
CppTools::ProjectFile::Kind fileKind);
|
CppTools::ProjectFile::Kind fileKind,
|
||||||
|
PchUsage pchUsage);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
RefactoringCompilerOptionsBuilder(CppTools::ProjectPart *projectPart);
|
RefactoringCompilerOptionsBuilder(CppTools::ProjectPart *projectPart);
|
||||||
|
@@ -30,6 +30,8 @@
|
|||||||
#include <refactoringserverinterface.h>
|
#include <refactoringserverinterface.h>
|
||||||
#include <requestsourcelocationforrenamingmessage.h>
|
#include <requestsourcelocationforrenamingmessage.h>
|
||||||
|
|
||||||
|
#include <cpptools/cpptoolsreuse.h>
|
||||||
|
|
||||||
#include <QTextCursor>
|
#include <QTextCursor>
|
||||||
#include <QTextDocument>
|
#include <QTextDocument>
|
||||||
|
|
||||||
@@ -89,7 +91,8 @@ void RefactoringEngine::startLocalRenaming(const QTextCursor &textCursor,
|
|||||||
client.setLocalRenamingCallback(std::move(renameSymbolsCallback));
|
client.setLocalRenamingCallback(std::move(renameSymbolsCallback));
|
||||||
|
|
||||||
auto commandLine = RefactoringCompilerOptionsBuilder::build(projectPart,
|
auto commandLine = RefactoringCompilerOptionsBuilder::build(projectPart,
|
||||||
fileKind(projectPart, filePath.toString()));
|
fileKind(projectPart, filePath.toString()),
|
||||||
|
CppTools::getPchUsage());
|
||||||
|
|
||||||
commandLine.push_back(filePath.toString());
|
commandLine.push_back(filePath.toString());
|
||||||
qDebug() << commandLine.join(" ");
|
qDebug() << commandLine.join(" ");
|
||||||
|
@@ -40,6 +40,7 @@
|
|||||||
#include <cpptools/compileroptionsbuilder.h>
|
#include <cpptools/compileroptionsbuilder.h>
|
||||||
#include <cpptools/cppmodelmanager.h>
|
#include <cpptools/cppmodelmanager.h>
|
||||||
#include <cpptools/cppprojectfile.h>
|
#include <cpptools/cppprojectfile.h>
|
||||||
|
#include <cpptools/cpptoolsreuse.h>
|
||||||
#include <cpptools/projectinfo.h>
|
#include <cpptools/projectinfo.h>
|
||||||
|
|
||||||
#include <projectexplorer/abi.h>
|
#include <projectexplorer/abi.h>
|
||||||
@@ -165,7 +166,8 @@ class ClangStaticAnalyzerOptionsBuilder : public CompilerOptionsBuilder
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static QStringList build(const CppTools::ProjectPart &projectPart,
|
static QStringList build(const CppTools::ProjectPart &projectPart,
|
||||||
CppTools::ProjectFile::Kind fileKind)
|
CppTools::ProjectFile::Kind fileKind,
|
||||||
|
PchUsage pchUsage)
|
||||||
{
|
{
|
||||||
ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart);
|
ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart);
|
||||||
|
|
||||||
@@ -184,6 +186,7 @@ public:
|
|||||||
optionsBuilder.undefineClangVersionMacrosForMsvc();
|
optionsBuilder.undefineClangVersionMacrosForMsvc();
|
||||||
optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015();
|
optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015();
|
||||||
optionsBuilder.addHeaderPathOptions();
|
optionsBuilder.addHeaderPathOptions();
|
||||||
|
optionsBuilder.addPrecompiledHeaderOptions(pchUsage);
|
||||||
optionsBuilder.addMsvcCompatibilityVersion();
|
optionsBuilder.addMsvcCompatibilityVersion();
|
||||||
|
|
||||||
if (type != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
|
if (type != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
|
||||||
@@ -243,10 +246,17 @@ private:
|
|||||||
QString includeOption() const override
|
QString includeOption() const override
|
||||||
{
|
{
|
||||||
if (m_isMsvcToolchain)
|
if (m_isMsvcToolchain)
|
||||||
return QLatin1String("/I");
|
return QLatin1String("/FI");
|
||||||
return CompilerOptionsBuilder::includeOption();
|
return CompilerOptionsBuilder::includeOption();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString includeDirOption() const override
|
||||||
|
{
|
||||||
|
if (m_isMsvcToolchain)
|
||||||
|
return QLatin1String("/I");
|
||||||
|
return CompilerOptionsBuilder::includeDirOption();
|
||||||
|
}
|
||||||
|
|
||||||
QString defineOption() const override
|
QString defineOption() const override
|
||||||
{
|
{
|
||||||
if (m_isMsvcToolchain)
|
if (m_isMsvcToolchain)
|
||||||
@@ -376,8 +386,9 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr>
|
|||||||
continue;
|
continue;
|
||||||
QTC_CHECK(file.kind != ProjectFile::Unclassified);
|
QTC_CHECK(file.kind != ProjectFile::Unclassified);
|
||||||
if (ProjectFile::isSource(file.kind)) {
|
if (ProjectFile::isSource(file.kind)) {
|
||||||
|
const CompilerOptionsBuilder::PchUsage pchUsage = CppTools::getPchUsage();
|
||||||
const QStringList arguments
|
const QStringList arguments
|
||||||
= ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind);
|
= ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind, pchUsage);
|
||||||
unitsToAnalyze << AnalyzeUnit(file.path, arguments);
|
unitsToAnalyze << AnalyzeUnit(file.path, arguments);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -112,7 +112,7 @@ void CompilerOptionsBuilder::enableExceptions()
|
|||||||
void CompilerOptionsBuilder::addHeaderPathOptions()
|
void CompilerOptionsBuilder::addHeaderPathOptions()
|
||||||
{
|
{
|
||||||
typedef ProjectPartHeaderPath HeaderPath;
|
typedef ProjectPartHeaderPath HeaderPath;
|
||||||
const QString defaultPrefix = includeOption();
|
const QString defaultPrefix = includeDirOption();
|
||||||
|
|
||||||
QStringList result;
|
QStringList result;
|
||||||
|
|
||||||
@@ -141,6 +141,24 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
|
|||||||
m_options.append(result);
|
m_options.append(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CompilerOptionsBuilder::addPrecompiledHeaderOptions(PchUsage pchUsage)
|
||||||
|
{
|
||||||
|
if (pchUsage == PchUsage::None)
|
||||||
|
return;
|
||||||
|
|
||||||
|
QStringList result;
|
||||||
|
|
||||||
|
const QString includeOptionString = includeOption();
|
||||||
|
foreach (const QString &pchFile, m_projectPart.precompiledHeaders) {
|
||||||
|
if (QFile::exists(pchFile)) {
|
||||||
|
result += includeOptionString;
|
||||||
|
result += QDir::toNativeSeparators(pchFile);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
m_options.append(result);
|
||||||
|
}
|
||||||
|
|
||||||
void CompilerOptionsBuilder::addToolchainAndProjectDefines()
|
void CompilerOptionsBuilder::addToolchainAndProjectDefines()
|
||||||
{
|
{
|
||||||
addDefines(m_projectPart.toolchainDefines);
|
addDefines(m_projectPart.toolchainDefines);
|
||||||
@@ -376,7 +394,7 @@ void CompilerOptionsBuilder::addDefineFloat128ForMingw()
|
|||||||
addDefine("#define __float128 void");
|
addDefine("#define __float128 void");
|
||||||
}
|
}
|
||||||
|
|
||||||
QString CompilerOptionsBuilder::includeOption() const
|
QString CompilerOptionsBuilder::includeDirOption() const
|
||||||
{
|
{
|
||||||
return QLatin1String("-I");
|
return QLatin1String("-I");
|
||||||
}
|
}
|
||||||
@@ -399,6 +417,11 @@ QString CompilerOptionsBuilder::undefineOption() const
|
|||||||
return QLatin1String("-U");
|
return QLatin1String("-U");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString CompilerOptionsBuilder::includeOption() const
|
||||||
|
{
|
||||||
|
return QLatin1String("-include");
|
||||||
|
}
|
||||||
|
|
||||||
static bool isGccOrMinGwToolchain(const Core::Id &toolchainType)
|
static bool isGccOrMinGwToolchain(const Core::Id &toolchainType)
|
||||||
{
|
{
|
||||||
return toolchainType == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID
|
return toolchainType == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID
|
||||||
|
@@ -34,6 +34,11 @@ namespace CppTools {
|
|||||||
class CPPTOOLS_EXPORT CompilerOptionsBuilder
|
class CPPTOOLS_EXPORT CompilerOptionsBuilder
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
enum class PchUsage {
|
||||||
|
None,
|
||||||
|
Use
|
||||||
|
};
|
||||||
|
|
||||||
CompilerOptionsBuilder(const ProjectPart &projectPart);
|
CompilerOptionsBuilder(const ProjectPart &projectPart);
|
||||||
virtual ~CompilerOptionsBuilder() {}
|
virtual ~CompilerOptionsBuilder() {}
|
||||||
|
|
||||||
@@ -48,6 +53,7 @@ public:
|
|||||||
virtual void addTargetTriple();
|
virtual void addTargetTriple();
|
||||||
virtual void enableExceptions();
|
virtual void enableExceptions();
|
||||||
void addHeaderPathOptions();
|
void addHeaderPathOptions();
|
||||||
|
void addPrecompiledHeaderOptions(PchUsage pchUsage);
|
||||||
void addToolchainAndProjectDefines();
|
void addToolchainAndProjectDefines();
|
||||||
void addDefines(const QByteArray &defineDirectives);
|
void addDefines(const QByteArray &defineDirectives);
|
||||||
virtual void addLanguageOption(ProjectFile::Kind fileKind);
|
virtual void addLanguageOption(ProjectFile::Kind fileKind);
|
||||||
@@ -67,6 +73,7 @@ protected:
|
|||||||
virtual QString defineOption() const;
|
virtual QString defineOption() const;
|
||||||
virtual QString undefineOption() const;
|
virtual QString undefineOption() const;
|
||||||
virtual QString includeOption() const;
|
virtual QString includeOption() const;
|
||||||
|
virtual QString includeDirOption() const;
|
||||||
|
|
||||||
const ProjectPart m_projectPart;
|
const ProjectPart m_projectPart;
|
||||||
|
|
||||||
|
@@ -288,4 +288,12 @@ bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CompilerOptionsBuilder::PchUsage getPchUsage()
|
||||||
|
{
|
||||||
|
const QSharedPointer<CppCodeModelSettings> cms = codeModelSettings();
|
||||||
|
if (cms->pchUsage() == CppCodeModelSettings::PchUse_None)
|
||||||
|
return CompilerOptionsBuilder::PchUsage::None;
|
||||||
|
return CompilerOptionsBuilder::PchUsage::Use;
|
||||||
|
}
|
||||||
|
|
||||||
} // CppTools
|
} // CppTools
|
||||||
|
@@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include <texteditor/texteditor.h>
|
#include <texteditor/texteditor.h>
|
||||||
|
|
||||||
|
#include <cpptools/compileroptionsbuilder.h>
|
||||||
|
|
||||||
#include <cplusplus/CppDocument.h>
|
#include <cplusplus/CppDocument.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
@@ -72,6 +74,8 @@ void CPPTOOLS_EXPORT switchHeaderSource();
|
|||||||
class CppCodeModelSettings;
|
class CppCodeModelSettings;
|
||||||
QSharedPointer<CppCodeModelSettings> CPPTOOLS_EXPORT codeModelSettings();
|
QSharedPointer<CppCodeModelSettings> CPPTOOLS_EXPORT codeModelSettings();
|
||||||
|
|
||||||
|
CompilerOptionsBuilder::PchUsage CPPTOOLS_EXPORT getPchUsage();
|
||||||
|
|
||||||
int indexerFileSizeLimitInMb();
|
int indexerFileSizeLimitInMb();
|
||||||
bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb);
|
bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user