forked from qt-creator/qt-creator
CppTools: Take "-include" files into account
Fixes: QTCREATORBUG-20602 Change-Id: Ibfc518fc64ed75f93265db800558ec1d2e424bb4 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
This commit is contained in:
committed by
Christian Kandeler
parent
c05ad9a951
commit
888ea6bbbb
@@ -77,6 +77,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface<void> &futur
|
||||
CppModelManager *modelManager = CppModelManager::instance();
|
||||
QByteArray configFile = modelManager->codeModelConfiguration();
|
||||
ProjectExplorer::HeaderPaths headerPaths;
|
||||
QStringList includedFiles;
|
||||
QStringList precompiledHeaders;
|
||||
QString projectConfigFile;
|
||||
LanguageFeatures features = LanguageFeatures::defaultFeatures();
|
||||
@@ -102,6 +103,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface<void> &futur
|
||||
configFile += ProjectPart::readProjectConfigFile(part);
|
||||
headerPaths = part->headerPaths;
|
||||
projectConfigFile = part->projectConfigFile;
|
||||
includedFiles = part->includedFiles;
|
||||
if (baseConfig.usePrecompiledHeaders)
|
||||
precompiledHeaders = part->precompiledHeaders;
|
||||
features = part->languageFeatures;
|
||||
@@ -129,6 +131,11 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface<void> &futur
|
||||
invalidateSnapshot = true;
|
||||
}
|
||||
|
||||
if (includedFiles != state.includedFiles) {
|
||||
state.includedFiles = includedFiles;
|
||||
invalidateSnapshot = true;
|
||||
}
|
||||
|
||||
if (precompiledHeaders != state.precompiledHeaders) {
|
||||
state.precompiledHeaders = precompiledHeaders;
|
||||
invalidateSnapshot = true;
|
||||
@@ -212,8 +219,11 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface<void> &futur
|
||||
}
|
||||
if (!baseState.editorDefines.isEmpty())
|
||||
sourceProcessor.run(editorDefinesFileName);
|
||||
sourceProcessor.run(filePath(), baseConfig.usePrecompiledHeaders ? state.precompiledHeaders
|
||||
: QStringList());
|
||||
QStringList includedFiles = state.includedFiles;
|
||||
if (baseConfig.usePrecompiledHeaders)
|
||||
includedFiles << state.precompiledHeaders;
|
||||
includedFiles.removeDuplicates();
|
||||
sourceProcessor.run(filePath(), includedFiles);
|
||||
state.snapshot = sourceProcessor.snapshot();
|
||||
Snapshot newSnapshot = state.snapshot.simplified(state.snapshot.document(filePath()));
|
||||
for (Snapshot::const_iterator i = state.snapshot.begin(), ei = state.snapshot.end(); i != ei; ++i) {
|
||||
|
||||
@@ -69,6 +69,7 @@ private:
|
||||
|
||||
ProjectExplorer::HeaderPaths headerPaths;
|
||||
QString projectConfigFile;
|
||||
QStringList includedFiles;
|
||||
QStringList precompiledHeaders;
|
||||
|
||||
CPlusPlus::Snapshot snapshot;
|
||||
|
||||
@@ -140,6 +140,7 @@ QStringList CompilerOptionsBuilder::build(ProjectFile::Kind fileKind,
|
||||
addLanguageVersionAndExtensions();
|
||||
addMsvcExceptions();
|
||||
|
||||
addIncludedFiles(m_projectPart.includedFiles); // GCC adds these before precompiled headers.
|
||||
addPrecompiledHeaderOptions(usePrecompiledHeaders);
|
||||
addProjectConfigFileInclude();
|
||||
|
||||
@@ -368,6 +369,21 @@ void CompilerOptionsBuilder::addHeaderPathOptions()
|
||||
}
|
||||
}
|
||||
|
||||
void CompilerOptionsBuilder::addIncludedFiles(const QStringList &files)
|
||||
{
|
||||
QStringList result;
|
||||
|
||||
const QString includeOptionString
|
||||
= QLatin1String(isClStyle() ? includeFileOptionCl : includeFileOptionGcc);
|
||||
for (const QString &file : files) {
|
||||
if (QFile::exists(file)) {
|
||||
result += includeOptionString;
|
||||
result += QDir::toNativeSeparators(file);
|
||||
}
|
||||
}
|
||||
m_options.append(result);
|
||||
}
|
||||
|
||||
void CompilerOptionsBuilder::addPrecompiledHeaderOptions(UsePrecompiledHeaders usePrecompiledHeaders)
|
||||
{
|
||||
for (const QString &pchFile : m_projectPart.precompiledHeaders) {
|
||||
@@ -830,6 +846,12 @@ void CompilerOptionsBuilder::evaluateCompilerFlags()
|
||||
continue;
|
||||
}
|
||||
|
||||
// These were already parsed into ProjectPart::includedFiles.
|
||||
if (option == includeFileOptionCl || option == includeFileOptionGcc) {
|
||||
skipNext = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (option.startsWith("/Y", Qt::CaseSensitive)
|
||||
|| (option.startsWith("/F", Qt::CaseSensitive) && option != "/F")) {
|
||||
// Precompiled header flags.
|
||||
|
||||
@@ -62,6 +62,7 @@ public:
|
||||
void addWordWidth();
|
||||
void addHeaderPathOptions();
|
||||
void addPrecompiledHeaderOptions(UsePrecompiledHeaders usePrecompiledHeaders);
|
||||
void addIncludedFiles(const QStringList &files);
|
||||
void addMacros(const ProjectExplorer::Macros ¯os);
|
||||
|
||||
void addTargetTriple();
|
||||
|
||||
@@ -106,6 +106,7 @@ static ProjectPart::Ptr projectPartFromRawProjectPart(
|
||||
}
|
||||
|
||||
part->precompiledHeaders = rawProjectPart.precompiledHeaders;
|
||||
part->includedFiles = rawProjectPart.includedFiles;
|
||||
part->selectedForBuilding = rawProjectPart.selectedForBuilding;
|
||||
|
||||
return part;
|
||||
@@ -205,6 +206,11 @@ ProjectPart::Ptr ProjectInfoGenerator::createProjectPart(
|
||||
part->extraCodeModelFlags = tcInfo.extraCodeModelFlags;
|
||||
part->compilerFlags = flags.commandLineFlags;
|
||||
part->warningFlags = flags.warningFlags;
|
||||
if (part->includedFiles.isEmpty()) {
|
||||
// The project manager did not provide the included files, so take
|
||||
// the ones we were able to detect from the toolchain's command line.
|
||||
part->includedFiles = flags.includedFiles;
|
||||
}
|
||||
part->language = language;
|
||||
part->languageExtensions = flags.languageExtensions;
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ public:
|
||||
|
||||
// Files
|
||||
ProjectFiles files;
|
||||
QStringList includedFiles;
|
||||
QStringList precompiledHeaders;
|
||||
ProjectExplorer::HeaderPaths headerPaths;
|
||||
QString projectConfigFile; // Generic Project Manager only
|
||||
|
||||
Reference in New Issue
Block a user