diff options
author | Denis Klychkov <kd.snake@gmail.com> | 2016-11-02 12:21:54 +0300 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2016-11-16 09:10:14 +0000 |
commit | 36d4d01cd374a21a8b7c229b261c5f1a23d1184e (patch) | |
tree | ebb2fb9b760253b0c315918db8fd4fcf3c29e6bd | |
parent | 569f4499c038f4186d511d15d2b626d57b57fcd1 (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>
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); |