diff --git a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp index 1d76245dc85..33ec351b4c2 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentparser.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentparser.cpp @@ -43,6 +43,7 @@ void ClangEditorDocumentParser::updateImpl(const QFutureInterface &, configuration(), state_, updateParams.activeProject, + updateParams.languagePreference, updateParams.hasActiveProjectChanged); setState(state_); } diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 33f944db50d..9104d5d1165 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -384,8 +384,17 @@ static CppTools::ProjectPart projectPartForLanguageOption(CppTools::ProjectPart static QStringList languageOptions(const QString &filePath, CppTools::ProjectPart *projectPart) { const auto theProjectPart = projectPartForLanguageOption(projectPart); + + // Determine file kind with respect to ambiguous headers. + CppTools::ProjectFile::Kind fileKind = CppTools::ProjectFile::classify(filePath); + if (fileKind == CppTools::ProjectFile::AmbiguousHeader) { + fileKind = theProjectPart.languageVersion <= CppTools::ProjectPart::LatestCVersion + ? CppTools::ProjectFile::CHeader + : CppTools::ProjectFile::CXXHeader; + } + CppTools::CompilerOptionsBuilder builder(theProjectPart); - builder.addLanguageOption(CppTools::ProjectFile::classify(filePath)); + builder.addLanguageOption(fileKind); return builder.options(); } diff --git a/src/plugins/cpptools/baseeditordocumentparser.cpp b/src/plugins/cpptools/baseeditordocumentparser.cpp index f346e054155..ca4d16e5646 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.cpp +++ b/src/plugins/cpptools/baseeditordocumentparser.cpp @@ -122,6 +122,7 @@ ProjectPart::Ptr BaseEditorDocumentParser::determineProjectPart( const Configuration &config, const State &state, const ProjectExplorer::Project *activeProject, + Language languagePreference, bool hasActiveProjectChanged) { Internal::ProjectPartChooser chooser; @@ -141,6 +142,7 @@ ProjectPart::Ptr BaseEditorDocumentParser::determineProjectPart( config.manuallySetProjectPart, config.stickToPreviousProjectPart, activeProject, + languagePreference, hasActiveProjectChanged); } diff --git a/src/plugins/cpptools/baseeditordocumentparser.h b/src/plugins/cpptools/baseeditordocumentparser.h index 11f76fa67d2..92f919e96d9 100644 --- a/src/plugins/cpptools/baseeditordocumentparser.h +++ b/src/plugins/cpptools/baseeditordocumentparser.h @@ -25,6 +25,7 @@ #pragma once +#include "cpplanguage.h" #include "cpptools_global.h" #include "cppworkingcopy.h" #include "projectpart.h" @@ -55,15 +56,18 @@ public: struct UpdateParams { UpdateParams(const WorkingCopy &workingCopy, const ProjectExplorer::Project *activeProject, + Language languagePreference, bool hasActiveProjectChanged) : workingCopy(workingCopy) , activeProject(activeProject) + , languagePreference(languagePreference) , hasActiveProjectChanged(hasActiveProjectChanged) { } WorkingCopy workingCopy; const ProjectExplorer::Project *activeProject = nullptr; + Language languagePreference = Language::Cxx; bool hasActiveProjectChanged = false; }; @@ -92,6 +96,7 @@ protected: const Configuration &config, const State &state, const ProjectExplorer::Project *activeProject, + Language languagePreference, bool hasActiveProjectChanged); mutable QMutex m_stateAndConfigurationMutex; diff --git a/src/plugins/cpptools/baseeditordocumentprocessor.cpp b/src/plugins/cpptools/baseeditordocumentprocessor.cpp index bf68bc1c4ea..b656c5798a5 100644 --- a/src/plugins/cpptools/baseeditordocumentprocessor.cpp +++ b/src/plugins/cpptools/baseeditordocumentprocessor.cpp @@ -25,8 +25,11 @@ #include "baseeditordocumentprocessor.h" +#include "cppcodemodelsettings.h" +#include "cpplanguage.h" #include "cppmodelmanager.h" #include "cpptoolsbridge.h" +#include "cpptoolsreuse.h" #include "editordocumenthandle.h" #include @@ -55,8 +58,13 @@ BaseEditorDocumentProcessor::~BaseEditorDocumentProcessor() void BaseEditorDocumentProcessor::run(bool hasActiveProjectChanged) { + const Language languagePreference = codeModelSettings()->interpretAmbigiousHeadersAsCHeaders() + ? Language::C + : Language::Cxx; + runImpl({CppModelManager::instance()->workingCopy(), ProjectExplorer::SessionManager::startupProject(), + languagePreference, hasActiveProjectChanged}); } diff --git a/src/plugins/cpptools/builtineditordocumentparser.cpp b/src/plugins/cpptools/builtineditordocumentparser.cpp index 77700e2cdfe..5243e2a76bb 100644 --- a/src/plugins/cpptools/builtineditordocumentparser.cpp +++ b/src/plugins/cpptools/builtineditordocumentparser.cpp @@ -81,6 +81,7 @@ void BuiltinEditorDocumentParser::updateImpl(const QFutureInterface &futur baseConfig, baseState, updateParams.activeProject, + updateParams.languagePreference, updateParams.hasActiveProjectChanged); if (state.forceSnapshotInvalidation) { diff --git a/src/plugins/cpptools/builtinindexingsupport.cpp b/src/plugins/cpptools/builtinindexingsupport.cpp index c4360f5fd79..6d3eac843b2 100644 --- a/src/plugins/cpptools/builtinindexingsupport.cpp +++ b/src/plugins/cpptools/builtinindexingsupport.cpp @@ -158,7 +158,8 @@ void indexFindErrors(QFutureInterface &future, const ParseParams params) // Parse the file as precisely as possible BuiltinEditorDocumentParser parser(file); parser.setReleaseSourceAndAST(false); - parser.update({CppModelManager::instance()->workingCopy(), nullptr, false}); + parser.update({CppModelManager::instance()->workingCopy(), nullptr, + Language::Cxx, false}); CPlusPlus::Document::Ptr document = parser.document(); QTC_ASSERT(document, return); diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index 43d8e5f8122..a129fa61daa 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -58,6 +58,9 @@ static QString clangDiagnosticConfigsArrayOptionsKey() static QString pchUsageKey() { return QLatin1String(Constants::CPPTOOLS_MODEL_MANAGER_PCH_USAGE); } +static QString interpretAmbiguousHeadersAsCHeadersKey() +{ return QLatin1String(Constants::CPPTOOLS_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS); } + static QString skipIndexingBigFilesKey() { return QLatin1String(Constants::CPPTOOLS_SKIP_INDEXING_BIG_FILES); } @@ -88,6 +91,10 @@ void CppCodeModelSettings::fromSettings(QSettings *s) const QVariant pchUsageVariant = s->value(pchUsageKey(), initialPchUsage()); setPCHUsage(static_cast(pchUsageVariant.toInt())); + const QVariant interpretAmbiguousHeadersAsCHeaders + = s->value(interpretAmbiguousHeadersAsCHeadersKey(), false); + setInterpretAmbigiousHeadersAsCHeaders(interpretAmbiguousHeadersAsCHeaders.toBool()); + const QVariant skipIndexingBigFiles = s->value(skipIndexingBigFilesKey(), true); setSkipIndexingBigFiles(skipIndexingBigFiles.toBool()); @@ -116,6 +123,8 @@ void CppCodeModelSettings::toSettings(QSettings *s) s->setValue(clangDiagnosticConfigKey(), clangDiagnosticConfigId().toSetting()); s->setValue(pchUsageKey(), pchUsage()); + + s->setValue(interpretAmbiguousHeadersAsCHeadersKey(), interpretAmbigiousHeadersAsCHeaders()); s->setValue(skipIndexingBigFilesKey(), skipIndexingBigFiles()); s->setValue(indexerFileSizeLimitKey(), indexerFileSizeLimitInMb()); @@ -166,6 +175,16 @@ void CppCodeModelSettings::emitChanged() emit changed(); } +bool CppCodeModelSettings::interpretAmbigiousHeadersAsCHeaders() const +{ + return m_interpretAmbigiousHeadersAsCHeaders; +} + +void CppCodeModelSettings::setInterpretAmbigiousHeadersAsCHeaders(bool yesno) +{ + m_interpretAmbigiousHeadersAsCHeaders = yesno; +} + bool CppCodeModelSettings::skipIndexingBigFiles() const { return m_skipIndexingBigFiles; diff --git a/src/plugins/cpptools/cppcodemodelsettings.h b/src/plugins/cpptools/cppcodemodelsettings.h index c57ee8bbc41..4c6404e506c 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.h +++ b/src/plugins/cpptools/cppcodemodelsettings.h @@ -63,6 +63,9 @@ public: PCHUsage pchUsage() const; void setPCHUsage(PCHUsage pchUsage); + bool interpretAmbigiousHeadersAsCHeaders() const; + void setInterpretAmbigiousHeadersAsCHeaders(bool yesno); + bool skipIndexingBigFiles() const; void setSkipIndexingBigFiles(bool yesno); @@ -78,6 +81,7 @@ signals: private: PCHUsage m_pchUsage = PchUse_None; + bool m_interpretAmbigiousHeadersAsCHeaders = false; bool m_skipIndexingBigFiles = true; int m_indexerFileSizeLimitInMB = 5; ClangDiagnosticConfigs m_clangCustomDiagnosticConfigs; diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.cpp b/src/plugins/cpptools/cppcodemodelsettingspage.cpp index e1792ed0b71..e6af115aed4 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.cpp +++ b/src/plugins/cpptools/cppcodemodelsettingspage.cpp @@ -56,18 +56,16 @@ void CppCodeModelSettingsWidget::setSettings(const QSharedPointertoSettings(Core::ICore::settings()); @@ -88,16 +86,16 @@ void CppCodeModelSettingsWidget::setupClangCodeModelWidgets() m_ui->clangSettingsGroupBox->layout()->addWidget(m_clangDiagnosticConfigsWidget); } -void CppCodeModelSettingsWidget::setupPchCheckBox() const +void CppCodeModelSettingsWidget::setupGeneralWidgets() { - const bool ignorePch = m_settings->pchUsage() == CppCodeModelSettings::PchUse_None; - m_ui->ignorePCHCheckBox->setChecked(ignorePch); -} + m_ui->interpretAmbiguousHeadersAsCHeaders->setChecked( + m_settings->interpretAmbigiousHeadersAsCHeaders()); -void CppCodeModelSettingsWidget::setupSkipIndexingFilesWidgets() -{ m_ui->skipIndexingBigFilesCheckBox->setChecked(m_settings->skipIndexingBigFiles()); m_ui->bigFilesLimitSpinBox->setValue(m_settings->indexerFileSizeLimitInMb()); + + const bool ignorePch = m_settings->pchUsage() == CppCodeModelSettings::PchUse_None; + m_ui->ignorePCHCheckBox->setChecked(ignorePch); } bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const @@ -122,39 +120,39 @@ bool CppCodeModelSettingsWidget::applyClangCodeModelWidgetsToSettings() const return settingsChanged; } -bool CppCodeModelSettingsWidget::applyPchCheckBoxToSettings() const -{ - const bool newIgnorePch = m_ui->ignorePCHCheckBox->isChecked(); - const bool previousIgnorePch = m_settings->pchUsage() == CppCodeModelSettings::PchUse_None; - - if (newIgnorePch != previousIgnorePch) { - const CppCodeModelSettings::PCHUsage pchUsage = m_ui->ignorePCHCheckBox->isChecked() - ? CppCodeModelSettings::PchUse_None - : CppCodeModelSettings::PchUse_BuildSystem; - m_settings->setPCHUsage(pchUsage); - - return true; - } - - return false; -} - -bool CppCodeModelSettingsWidget::applySkipIndexingFilesWidgets() const +bool CppCodeModelSettingsWidget::applyGeneralWidgetsToSettings() const { bool settingsChanged = false; + const bool newInterpretAmbiguousHeaderAsCHeaders + = m_ui->interpretAmbiguousHeadersAsCHeaders->isChecked(); + if (m_settings->interpretAmbigiousHeadersAsCHeaders() + != newInterpretAmbiguousHeaderAsCHeaders) { + m_settings->setInterpretAmbigiousHeadersAsCHeaders(newInterpretAmbiguousHeaderAsCHeaders); + settingsChanged = true; + } + const bool newSkipIndexingBigFiles = m_ui->skipIndexingBigFilesCheckBox->isChecked(); if (m_settings->skipIndexingBigFiles() != newSkipIndexingBigFiles) { m_settings->setSkipIndexingBigFiles(newSkipIndexingBigFiles); settingsChanged = true; } - const int newFileSizeLimit = m_ui->bigFilesLimitSpinBox->value(); if (m_settings->indexerFileSizeLimitInMb() != newFileSizeLimit) { m_settings->setIndexerFileSizeLimitInMb(newFileSizeLimit); settingsChanged = true; } + const bool newIgnorePch = m_ui->ignorePCHCheckBox->isChecked(); + const bool previousIgnorePch = m_settings->pchUsage() == CppCodeModelSettings::PchUse_None; + if (newIgnorePch != previousIgnorePch) { + const CppCodeModelSettings::PCHUsage pchUsage = m_ui->ignorePCHCheckBox->isChecked() + ? CppCodeModelSettings::PchUse_None + : CppCodeModelSettings::PchUse_BuildSystem; + m_settings->setPCHUsage(pchUsage); + settingsChanged = true; + } + return settingsChanged; } diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.h b/src/plugins/cpptools/cppcodemodelsettingspage.h index fc249d4285b..21911763a13 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.h +++ b/src/plugins/cpptools/cppcodemodelsettingspage.h @@ -55,13 +55,11 @@ public: void applyToSettings() const; private: + void setupGeneralWidgets(); void setupClangCodeModelWidgets(); - void setupPchCheckBox() const; - void setupSkipIndexingFilesWidgets(); + bool applyGeneralWidgetsToSettings() const; bool applyClangCodeModelWidgetsToSettings() const; - bool applyPchCheckBoxToSettings() const; - bool applySkipIndexingFilesWidgets() const; private: Ui::CppCodeModelSettingsPage *m_ui; diff --git a/src/plugins/cpptools/cppcodemodelsettingspage.ui b/src/plugins/cpptools/cppcodemodelsettingspage.ui index 34a946854b0..025b91dba98 100644 --- a/src/plugins/cpptools/cppcodemodelsettingspage.ui +++ b/src/plugins/cpptools/cppcodemodelsettingspage.ui @@ -14,37 +14,19 @@ Form - - - - <i>The Clang Code Model is enabled because the corresponding plugin is loaded.</i> - - - - - - - <i>The Clang Code Model is disabled because the corresponding plugin is not loaded.</i> - - - - - - - Clang Code Model Warnings - - - false - - - - - Files to Skip + General + + + + Interpret ambiguous headers as C headers + + + @@ -101,6 +83,31 @@ + + + + <i>The Clang Code Model is enabled because the corresponding plugin is loaded.</i> + + + + + + + <i>The Clang Code Model is disabled because the corresponding plugin is not loaded.</i> + + + + + + + Clang Code Model Warnings + + + false + + + + diff --git a/src/plugins/cpptools/cppcompletionassist.cpp b/src/plugins/cpptools/cppcompletionassist.cpp index 73800a094da..30b1a0d9dc8 100644 --- a/src/plugins/cpptools/cppcompletionassist.cpp +++ b/src/plugins/cpptools/cppcompletionassist.cpp @@ -2122,7 +2122,10 @@ void CppCompletionAssistInterface::getCppSpecifics() const m_gotCppSpecifics = true; if (m_parser) { - m_parser->update({CppTools::CppModelManager::instance()->workingCopy(), nullptr, false}); + m_parser->update({CppTools::CppModelManager::instance()->workingCopy(), + nullptr, + Language::Cxx, + false}); m_snapshot = m_parser->snapshot(); m_headerPaths = m_parser->headerPaths(); } diff --git a/src/plugins/cpptools/cpplanguage.h b/src/plugins/cpptools/cpplanguage.h new file mode 100644 index 00000000000..2a84641d4de --- /dev/null +++ b/src/plugins/cpptools/cpplanguage.h @@ -0,0 +1,32 @@ +/**************************************************************************** +** +** Copyright (C) 2016 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3 as published by the Free Software +** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT +** included in the packaging of this file. Please review the following +** information to ensure the GNU General Public License requirements will +** be met: https://www.gnu.org/licenses/gpl-3.0.html. +** +****************************************************************************/ + +#pragma once + +namespace CppTools { + +enum class Language { C, Cxx }; + +} // namespace CppTools diff --git a/src/plugins/cpptools/cppmodelmanager_test.cpp b/src/plugins/cpptools/cppmodelmanager_test.cpp index d5f0b2fc090..4db38959c39 100644 --- a/src/plugins/cpptools/cppmodelmanager_test.cpp +++ b/src/plugins/cpptools/cppmodelmanager_test.cpp @@ -877,7 +877,8 @@ void CppToolsPlugin::test_modelmanager_precompiled_headers() BaseEditorDocumentParser::Configuration config = parser->configuration(); config.usePrecompiledHeaders = true; parser->setConfiguration(config); - parser->update({CppModelManager::instance()->workingCopy(), nullptr, false}); + parser->update({CppModelManager::instance()->workingCopy(), nullptr, + Language::Cxx, false}); // Check if defines from pch are considered Document::Ptr document = mm->document(fileName); @@ -955,7 +956,8 @@ void CppToolsPlugin::test_modelmanager_defines_per_editor() BaseEditorDocumentParser::Configuration config = parser->configuration(); config.editorDefines = editorDefines.toUtf8(); parser->setConfiguration(config); - parser->update({CppModelManager::instance()->workingCopy(), nullptr, false}); + parser->update({CppModelManager::instance()->workingCopy(), nullptr, + Language::Cxx, false}); Document::Ptr doc = mm->document(main1File); QCOMPARE(nameOfFirstDeclaration(doc), firstDeclarationName); diff --git a/src/plugins/cpptools/cppprojectpartchooser.cpp b/src/plugins/cpptools/cppprojectpartchooser.cpp index 19c40c5fe0f..5f7d3de1370 100644 --- a/src/plugins/cpptools/cppprojectpartchooser.cpp +++ b/src/plugins/cpptools/cppprojectpartchooser.cpp @@ -31,25 +31,39 @@ namespace CppTools { namespace Internal { -static int priority(const ProjectPart &projectPart, const ProjectExplorer::Project *activeProject) +static bool isPreferredLanguage(const ProjectPart &projectPart, Language preference) +{ + const bool isCProjectPart = projectPart.languageVersion <= ProjectPart::LatestCVersion; + return (preference == Language::C && isCProjectPart) + || (preference == Language::Cxx && !isCProjectPart); +} + +static int priority(const ProjectPart &projectPart, + const ProjectExplorer::Project *activeProject, + Language languagePreference) { int thePriority = 0; if (projectPart.project == activeProject) - thePriority += 10; + thePriority += 100; if (projectPart.selectedForBuilding) + thePriority += 10; + + if (isPreferredLanguage(projectPart, languagePreference)) thePriority += 1; return thePriority; } static ProjectPart::Ptr chooseFromMultiple(const QList &projectParts, - const ProjectExplorer::Project *activeProject) + const ProjectExplorer::Project *activeProject, + Language languagePreference) { QList projectPartsPrioritized = projectParts; - const auto lessThan = [activeProject] (const ProjectPart::Ptr &p1, const ProjectPart::Ptr &p2) { - return priority(*p1, activeProject) > priority(*p2, activeProject); + const auto lessThan = [&] (const ProjectPart::Ptr &p1, const ProjectPart::Ptr &p2) { + return priority(*p1, activeProject, languagePreference) + > priority(*p2, activeProject, languagePreference); }; std::stable_sort(projectPartsPrioritized.begin(), projectPartsPrioritized.end(), lessThan); @@ -61,6 +75,7 @@ ProjectPart::Ptr ProjectPartChooser::choose(const QString &filePath, const ProjectPart::Ptr &manuallySetProjectPart, bool stickToPreviousProjectPart, const ProjectExplorer::Project *activeProject, + Language languagePreference, bool projectHasChanged) const { QTC_CHECK(m_projectPartsForFile); @@ -85,10 +100,10 @@ ProjectPart::Ptr ProjectPartChooser::choose(const QString &filePath, // Fall-back step 2: Use fall-back part from the model manager: projectPart = m_fallbackProjectPart(); else - projectPart = chooseFromMultiple(projectParts, activeProject); + projectPart = chooseFromMultiple(projectParts, activeProject, languagePreference); } else { if (projectHasChanged || !projectParts.contains(projectPart)) - projectPart = chooseFromMultiple(projectParts, activeProject); + projectPart = chooseFromMultiple(projectParts, activeProject, languagePreference); } return projectPart; diff --git a/src/plugins/cpptools/cppprojectpartchooser.h b/src/plugins/cpptools/cppprojectpartchooser.h index 1ad6da10af5..e0a8581c344 100644 --- a/src/plugins/cpptools/cppprojectpartchooser.h +++ b/src/plugins/cpptools/cppprojectpartchooser.h @@ -25,6 +25,7 @@ #pragma once +#include "cpplanguage.h" #include "projectpart.h" #include @@ -52,6 +53,7 @@ public: const ProjectPart::Ptr &manuallySetProjectPart, bool stickToPreviousProjectPart, const ProjectExplorer::Project *activeProject, + Language languagePreference, bool projectHasChanged) const; private: diff --git a/src/plugins/cpptools/cpptools.pro b/src/plugins/cpptools/cpptools.pro index 00611dbca11..9b3b064b777 100644 --- a/src/plugins/cpptools/cpptools.pro +++ b/src/plugins/cpptools/cpptools.pro @@ -34,6 +34,7 @@ HEADERS += \ cppfunctionsfilter.h \ cppincludesfilter.h \ cppindexingsupport.h \ + cpplanguage.h \ cpplocalsymbols.h \ cpplocatordata.h \ cpplocatorfilter.h \ diff --git a/src/plugins/cpptools/cpptools.qbs b/src/plugins/cpptools/cpptools.qbs index 53ff39b5e9d..f7047ed28dd 100644 --- a/src/plugins/cpptools/cpptools.qbs +++ b/src/plugins/cpptools/cpptools.qbs @@ -61,6 +61,7 @@ Project { "cppfunctionsfilter.cpp", "cppfunctionsfilter.h", "cppincludesfilter.cpp", "cppincludesfilter.h", "cppindexingsupport.cpp", "cppindexingsupport.h", + "cpplanguage.h", "cpplocalsymbols.cpp", "cpplocalsymbols.h", "cpplocatordata.cpp", "cpplocatordata.h", "cpplocatorfilter.cpp", "cpplocatorfilter.h", diff --git a/src/plugins/cpptools/cpptoolsconstants.h b/src/plugins/cpptools/cpptoolsconstants.h index 11a5f1a1abf..18192317ce3 100644 --- a/src/plugins/cpptools/cpptoolsconstants.h +++ b/src/plugins/cpptools/cpptoolsconstants.h @@ -51,10 +51,13 @@ enum { lowerCaseFilesDefault = 1 }; const char CPPTOOLS_SORT_EDITOR_DOCUMENT_OUTLINE[] = "SortedMethodOverview"; const char CPPTOOLS_SHOW_INFO_BAR_FOR_HEADER_ERRORS[] = "ShowInfoBarForHeaderErrors"; const char CPPTOOLS_MODEL_MANAGER_PCH_USAGE[] = "PCHUsage"; +const char CPPTOOLS_INTERPRET_AMBIGIUOUS_HEADERS_AS_C_HEADERS[] + = "InterpretAmbiguousHeadersAsCHeaders"; const char CPPTOOLS_SKIP_INDEXING_BIG_FILES[] = "SkipIndexingBigFiles"; const char CPPTOOLS_INDEXER_FILE_SIZE_LIMIT[] = "IndexerFileSizeLimit"; -const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] = "Builtin.EverythingWithExceptions"; +const char CPP_CLANG_BUILTIN_CONFIG_ID_EVERYTHING_WITH_EXCEPTIONS[] + = "Builtin.EverythingWithExceptions"; const char CPP_CODE_STYLE_SETTINGS_ID[] = "A.Cpp.Code Style"; const char CPP_CODE_STYLE_SETTINGS_NAME[] = QT_TRANSLATE_NOOP("CppTools", "Code Style"); diff --git a/tests/unit/unittest/cppprojectpartchooser-test.cpp b/tests/unit/unittest/cppprojectpartchooser-test.cpp index a8b47d6a85a..aed61b3f610 100644 --- a/tests/unit/unittest/cppprojectpartchooser-test.cpp +++ b/tests/unit/unittest/cppprojectpartchooser-test.cpp @@ -25,11 +25,13 @@ #include "googletest.h" +#include #include #include using CppTools::Internal::ProjectPartChooser; using CppTools::ProjectPart; +using CppTools::Language; using testing::Eq; @@ -42,6 +44,7 @@ protected: const ProjectPart::Ptr choose() const; static QList createProjectPartsWithDifferentProjects(); + static QList createCAndCxxProjectParts(); protected: QString filePath; @@ -50,6 +53,7 @@ protected: bool stickToPreviousProjectPart = false; const ProjectExplorer::Project *activeProject = nullptr; bool projectHasChanged = false; + Language languagePreference = Language::Cxx; ::ProjectPartChooser chooser; QList projectPartsForFile; @@ -130,6 +134,28 @@ TEST_F(ProjectPartChooser, ForMultipleCheckIfActiveProjectChanged) ASSERT_THAT(chosen, Eq(secondProjectPart)); } +TEST_F(ProjectPartChooser, ForMultipleAndAmbigiousHeaderPreferCProjectPart) +{ + languagePreference = Language::C; + projectPartsForFile = createCAndCxxProjectParts(); + const ProjectPart::Ptr cProjectPart = projectPartsForFile.at(0); + + const ProjectPart::Ptr chosen = choose(); + + ASSERT_THAT(chosen, Eq(cProjectPart)); +} + +TEST_F(ProjectPartChooser, ForMultipleAndAmbigiousHeaderPreferCxxProjectPart) +{ + languagePreference = Language::Cxx; + projectPartsForFile = createCAndCxxProjectParts(); + const ProjectPart::Ptr cxxProjectPart = projectPartsForFile.at(1); + + const ProjectPart::Ptr chosen = choose(); + + ASSERT_THAT(chosen, Eq(cxxProjectPart)); +} + TEST_F(ProjectPartChooser, IfProjectIsGoneStickToPrevious) // Built-in Code Model { stickToPreviousProjectPart = true; @@ -198,6 +224,7 @@ const ProjectPart::Ptr ProjectPartChooser::choose() const manuallySetProjectPart, stickToPreviousProjectPart, activeProject, + languagePreference, projectHasChanged); } @@ -215,4 +242,21 @@ QList ProjectPartChooser::createProjectPartsWithDifferentProje return projectParts; } +QList ProjectPartChooser::createCAndCxxProjectParts() +{ + QList projectParts; + + // Create project part for C + const ProjectPart::Ptr cprojectpart{new ProjectPart}; + cprojectpart->languageVersion = ProjectPart::C11; + projectParts.append(cprojectpart); + + // Create project part for CXX + const ProjectPart::Ptr cxxprojectpart{new ProjectPart}; + cxxprojectpart->languageVersion = ProjectPart::CXX98; + projectParts.append(cxxprojectpart); + + return projectParts; +} + } // anonymous namespace