aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis Klychkov <kd.snake@gmail.com>2016-11-02 12:21:54 +0300
committerNikolai Kosjar <nikolai.kosjar@qt.io>2016-11-16 09:10:14 +0000
commit36d4d01cd374a21a8b7c229b261c5f1a23d1184e (patch)
treeebb2fb9b760253b0c315918db8fd4fcf3c29e6bd
parent569f4499c038f4186d511d15d2b626d57b57fcd1 (diff)
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>
-rw-r--r--src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp23
-rw-r--r--src/plugins/clangcodemodel/clangutils.cpp21
-rw-r--r--src/plugins/clangcodemodel/clangutils.h1
-rw-r--r--src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp4
-rw-r--r--src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.h3
-rw-r--r--src/plugins/clangrefactoring/refactoringengine.cpp5
-rw-r--r--src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp17
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.cpp27
-rw-r--r--src/plugins/cpptools/compileroptionsbuilder.h7
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.cpp8
-rw-r--r--src/plugins/cpptools/cpptoolsreuse.h4
11 files changed, 89 insertions, 31 deletions
diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
index 82f06b5994..769d2d0e37 100644
--- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
+++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp
@@ -401,9 +401,30 @@ static QStringList warningOptions(CppTools::ProjectPart *projectPart)
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)
{
- return languageOptions(filePath, projectPart) + warningOptions(projectPart);
+ return languageOptions(filePath, projectPart)
+ + warningOptions(projectPart)
+ + precompiledHeaderOptions(filePath, projectPart);
}
ClangBackEnd::FileContainer
diff --git a/src/plugins/clangcodemodel/clangutils.cpp b/src/plugins/clangcodemodel/clangutils.cpp
index 1d704c8a88..5bdf36051d 100644
--- a/src/plugins/clangcodemodel/clangutils.cpp
+++ b/src/plugins/clangcodemodel/clangutils.cpp
@@ -192,27 +192,6 @@ QStringList createClangOptions(const ProjectPart::Ptr &pPart, ProjectFile::Kind
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)
{
if (const auto parser = CppTools::BaseEditorDocumentParser::get(filePath))
diff --git a/src/plugins/clangcodemodel/clangutils.h b/src/plugins/clangcodemodel/clangutils.h
index 4bdc6c00d4..dcec449139 100644
--- a/src/plugins/clangcodemodel/clangutils.h
+++ b/src/plugins/clangcodemodel/clangutils.h
@@ -34,7 +34,6 @@ QStringList createClangOptions(const CppTools::ProjectPart::Ptr &pPart,
CppTools::ProjectFile::Kind fileKind);
QStringList createClangOptions(const CppTools::ProjectPart::Ptr &pPart,
const QString &fileName = QString());
-QStringList createPCHInclusionOptions(const QString &pchFile);
CppTools::ProjectPart::Ptr projectPartForFile(const QString &filePath);
CppTools::ProjectPart::Ptr projectPartForFileBasedOnProcessor(const QString &filePath);
diff --git a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp
index 5fa28940f5..4500d01115 100644
--- a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp
+++ b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.cpp
@@ -117,7 +117,8 @@ void RefactoringCompilerOptionsBuilder::addExtraOptions()
}
Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::ProjectPart *projectPart,
- CppTools::ProjectFile::Kind fileKind)
+ CppTools::ProjectFile::Kind fileKind,
+ PchUsage pchUsage)
{
if (projectPart == nullptr)
return Utils::SmallStringVector();
@@ -138,6 +139,7 @@ Utils::SmallStringVector RefactoringCompilerOptionsBuilder::build(CppTools::Proj
optionsBuilder.addPredefinedMacrosAndHeaderPathsOptions();
optionsBuilder.addWrappedQtHeadersIncludePath();
optionsBuilder.addHeaderPathOptions();
+ optionsBuilder.addPrecompiledHeaderOptions(pchUsage);
optionsBuilder.addProjectConfigFileInclude();
optionsBuilder.addMsvcCompatibilityVersion();
diff --git a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.h b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.h
index 9a11573e8d..74532dea16 100644
--- a/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.h
+++ b/src/plugins/clangrefactoring/refactoringcompileroptionsbuilder.h
@@ -41,7 +41,8 @@ class RefactoringCompilerOptionsBuilder : public CppTools::CompilerOptionsBuilde
{
public:
static Utils::SmallStringVector build(CppTools::ProjectPart *projectPart,
- CppTools::ProjectFile::Kind fileKind);
+ CppTools::ProjectFile::Kind fileKind,
+ PchUsage pchUsage);
private:
RefactoringCompilerOptionsBuilder(CppTools::ProjectPart *projectPart);
diff --git a/src/plugins/clangrefactoring/refactoringengine.cpp b/src/plugins/clangrefactoring/refactoringengine.cpp
index fe33c82c09..ea930c2029 100644
--- a/src/plugins/clangrefactoring/refactoringengine.cpp
+++ b/src/plugins/clangrefactoring/refactoringengine.cpp
@@ -30,6 +30,8 @@
#include <refactoringserverinterface.h>
#include <requestsourcelocationforrenamingmessage.h>
+#include <cpptools/cpptoolsreuse.h>
+
#include <QTextCursor>
#include <QTextDocument>
@@ -89,7 +91,8 @@ void RefactoringEngine::startLocalRenaming(const QTextCursor &textCursor,
client.setLocalRenamingCallback(std::move(renameSymbolsCallback));
auto commandLine = RefactoringCompilerOptionsBuilder::build(projectPart,
- fileKind(projectPart, filePath.toString()));
+ fileKind(projectPart, filePath.toString()),
+ CppTools::getPchUsage());
commandLine.push_back(filePath.toString());
qDebug() << commandLine.join(" ");
diff --git a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
index 10cb6115ba..2a8a5f58c9 100644
--- a/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
+++ b/src/plugins/clangstaticanalyzer/clangstaticanalyzerruncontrol.cpp
@@ -40,6 +40,7 @@
#include <cpptools/compileroptionsbuilder.h>
#include <cpptools/cppmodelmanager.h>
#include <cpptools/cppprojectfile.h>
+#include <cpptools/cpptoolsreuse.h>
#include <cpptools/projectinfo.h>
#include <projectexplorer/abi.h>
@@ -165,7 +166,8 @@ class ClangStaticAnalyzerOptionsBuilder : public CompilerOptionsBuilder
{
public:
static QStringList build(const CppTools::ProjectPart &projectPart,
- CppTools::ProjectFile::Kind fileKind)
+ CppTools::ProjectFile::Kind fileKind,
+ PchUsage pchUsage)
{
ClangStaticAnalyzerOptionsBuilder optionsBuilder(projectPart);
@@ -184,6 +186,7 @@ public:
optionsBuilder.undefineClangVersionMacrosForMsvc();
optionsBuilder.undefineCppLanguageFeatureMacrosForMsvc2015();
optionsBuilder.addHeaderPathOptions();
+ optionsBuilder.addPrecompiledHeaderOptions(pchUsage);
optionsBuilder.addMsvcCompatibilityVersion();
if (type != ProjectExplorer::Constants::MSVC_TOOLCHAIN_TYPEID)
@@ -243,10 +246,17 @@ private:
QString includeOption() const override
{
if (m_isMsvcToolchain)
- return QLatin1String("/I");
+ return QLatin1String("/FI");
return CompilerOptionsBuilder::includeOption();
}
+ QString includeDirOption() const override
+ {
+ if (m_isMsvcToolchain)
+ return QLatin1String("/I");
+ return CompilerOptionsBuilder::includeDirOption();
+ }
+
QString defineOption() const override
{
if (m_isMsvcToolchain)
@@ -376,8 +386,9 @@ static AnalyzeUnits unitsToAnalyzeFromProjectParts(const QList<ProjectPart::Ptr>
continue;
QTC_CHECK(file.kind != ProjectFile::Unclassified);
if (ProjectFile::isSource(file.kind)) {
+ const CompilerOptionsBuilder::PchUsage pchUsage = CppTools::getPchUsage();
const QStringList arguments
- = ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind);
+ = ClangStaticAnalyzerOptionsBuilder::build(*projectPart.data(), file.kind, pchUsage);
unitsToAnalyze << AnalyzeUnit(file.path, arguments);
}
}
diff --git a/src/plugins/cpptools/compileroptionsbuilder.cpp b/src/plugins/cpptools/compileroptionsbuilder.cpp
index 01378ec88e..d99692536d 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.cpp
+++ b/src/plugins/cpptools/compileroptionsbuilder.cpp
@@ -112,7 +112,7 @@ void CompilerOptionsBuilder::enableExceptions()
void CompilerOptionsBuilder::addHeaderPathOptions()
{
typedef ProjectPartHeaderPath HeaderPath;
- const QString defaultPrefix = includeOption();
+ const QString defaultPrefix = includeDirOption();
QStringList result;
@@ -141,6 +141,24 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
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()
{
addDefines(m_projectPart.toolchainDefines);
@@ -376,7 +394,7 @@ void CompilerOptionsBuilder::addDefineFloat128ForMingw()
addDefine("#define __float128 void");
}
-QString CompilerOptionsBuilder::includeOption() const
+QString CompilerOptionsBuilder::includeDirOption() const
{
return QLatin1String("-I");
}
@@ -399,6 +417,11 @@ QString CompilerOptionsBuilder::undefineOption() const
return QLatin1String("-U");
}
+QString CompilerOptionsBuilder::includeOption() const
+{
+ return QLatin1String("-include");
+}
+
static bool isGccOrMinGwToolchain(const Core::Id &toolchainType)
{
return toolchainType == ProjectExplorer::Constants::GCC_TOOLCHAIN_TYPEID
diff --git a/src/plugins/cpptools/compileroptionsbuilder.h b/src/plugins/cpptools/compileroptionsbuilder.h
index ced3c0af1b..75b0c4f530 100644
--- a/src/plugins/cpptools/compileroptionsbuilder.h
+++ b/src/plugins/cpptools/compileroptionsbuilder.h
@@ -34,6 +34,11 @@ namespace CppTools {
class CPPTOOLS_EXPORT CompilerOptionsBuilder
{
public:
+ enum class PchUsage {
+ None,
+ Use
+ };
+
CompilerOptionsBuilder(const ProjectPart &projectPart);
virtual ~CompilerOptionsBuilder() {}
@@ -48,6 +53,7 @@ public:
virtual void addTargetTriple();
virtual void enableExceptions();
void addHeaderPathOptions();
+ void addPrecompiledHeaderOptions(PchUsage pchUsage);
void addToolchainAndProjectDefines();
void addDefines(const QByteArray &defineDirectives);
virtual void addLanguageOption(ProjectFile::Kind fileKind);
@@ -67,6 +73,7 @@ protected:
virtual QString defineOption() const;
virtual QString undefineOption() const;
virtual QString includeOption() const;
+ virtual QString includeDirOption() const;
const ProjectPart m_projectPart;
diff --git a/src/plugins/cpptools/cpptoolsreuse.cpp b/src/plugins/cpptools/cpptoolsreuse.cpp
index 7a21b4c6da..fcb3c8b878 100644
--- a/src/plugins/cpptools/cpptoolsreuse.cpp
+++ b/src/plugins/cpptools/cpptoolsreuse.cpp
@@ -288,4 +288,12 @@ bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb)
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
diff --git a/src/plugins/cpptools/cpptoolsreuse.h b/src/plugins/cpptools/cpptoolsreuse.h
index b60eceeb64..46ef50d7b1 100644
--- a/src/plugins/cpptools/cpptoolsreuse.h
+++ b/src/plugins/cpptools/cpptoolsreuse.h
@@ -29,6 +29,8 @@
#include <texteditor/texteditor.h>
+#include <cpptools/compileroptionsbuilder.h>
+
#include <cplusplus/CppDocument.h>
QT_BEGIN_NAMESPACE
@@ -72,6 +74,8 @@ void CPPTOOLS_EXPORT switchHeaderSource();
class CppCodeModelSettings;
QSharedPointer<CppCodeModelSettings> CPPTOOLS_EXPORT codeModelSettings();
+CompilerOptionsBuilder::PchUsage CPPTOOLS_EXPORT getPchUsage();
+
int indexerFileSizeLimitInMb();
bool fileSizeExceedsLimit(const QFileInfo &fileInfo, int sizeLimitInMb);