diff --git a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp index 19f3bdaa22ec511937f57591e12e654e6af2a53d..35165926183e49fca90ac7b921777f5ddcf957eb 100644 --- a/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp +++ b/src/plugins/clangcodemodel/clangeditordocumentprocessor.cpp @@ -419,16 +419,24 @@ static QStringList warningOptions(CppTools::ProjectPart *projectPart) { if (projectPart && projectPart->project) { ClangProjectSettings projectSettings(projectPart->project); - if (!projectSettings.useGlobalWarningConfig()) { + if (!projectSettings.useGlobalConfig()) { const Core::Id warningConfigId = projectSettings.warningConfigId(); const CppTools::ClangDiagnosticConfigsModel configsModel( CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); if (configsModel.hasConfigWithId(warningConfigId)) - return configsModel.configWithId(warningConfigId).commandLineOptions(); + return configsModel.configWithId(warningConfigId).commandLineWarnings(); } } - return CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineOptions(); + return CppTools::codeModelSettings()->clangDiagnosticConfig().commandLineWarnings(); +} + +static QStringList commandLineOptions(CppTools::ProjectPart *projectPart) +{ + if (!projectPart || !projectPart->project) + return ClangProjectSettings::globalCommandLineOptions(); + + return ClangProjectSettings{projectPart->project}.commandLineOptions(); } static QStringList precompiledHeaderOptions( @@ -454,6 +462,7 @@ static QStringList fileArguments(const QString &filePath, CppTools::ProjectPart { return languageOptions(filePath, projectPart) + warningOptions(projectPart) + + commandLineOptions(projectPart) + precompiledHeaderOptions(filePath, projectPart); } diff --git a/src/plugins/clangcodemodel/clangprojectsettings.cpp b/src/plugins/clangcodemodel/clangprojectsettings.cpp index 5cb02d6909779f1df08872eb638cec3e863e9770..2668ee399852af53576873b68be5b941fe0be40f 100644 --- a/src/plugins/clangcodemodel/clangprojectsettings.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettings.cpp @@ -25,15 +25,23 @@ #include "clangprojectsettings.h" +#include +#include + +#include + namespace ClangCodeModel { namespace Internal { -static QString useGlobalWarningConfigKey() -{ return QStringLiteral("ClangCodeModel.UseGlobalWarningConfig"); } +static QString useGlobalConfigKey() +{ return QStringLiteral("ClangCodeModel.UseGlobalConfig"); } static QString warningConfigIdKey() { return QStringLiteral("ClangCodeModel.WarningConfigId"); } +static QString customCommandLineKey() +{ return QLatin1String("ClangCodeModel.CustomCommandLineKey"); } + ClangProjectSettings::ClangProjectSettings(ProjectExplorer::Project *project) : m_project(project) { @@ -55,31 +63,55 @@ void ClangProjectSettings::setWarningConfigId(const Core::Id &customConfigId) m_warningConfigId = customConfigId; } -bool ClangProjectSettings::useGlobalWarningConfig() const +bool ClangProjectSettings::useGlobalConfig() const +{ + return m_useGlobalConfig; +} + +void ClangProjectSettings::setUseGlobalConfig(bool useGlobalConfig) { - return m_useGlobalWarningConfig; + m_useGlobalConfig = useGlobalConfig; } -void ClangProjectSettings::setUseGlobalWarningConfig(bool useGlobalWarningConfig) +QStringList ClangProjectSettings::commandLineOptions() const { - m_useGlobalWarningConfig = useGlobalWarningConfig; + return m_useGlobalConfig ? globalCommandLineOptions() + : m_customCommandLineOptions; +} + +void ClangProjectSettings::setCommandLineOptions(const QStringList &options) +{ + QTC_ASSERT(!m_useGlobalConfig, qDebug() + << "setCommandLineOptions was called while using global project config"); + m_customCommandLineOptions = options; } void ClangProjectSettings::load() { - const QVariant useGlobalConfigVariant = m_project->namedSettings(useGlobalWarningConfigKey()); + const QVariant useGlobalConfigVariant = m_project->namedSettings(useGlobalConfigKey()); const bool useGlobalConfig = useGlobalConfigVariant.isValid() ? useGlobalConfigVariant.toBool() : true; - setUseGlobalWarningConfig(useGlobalConfig); + setUseGlobalConfig(useGlobalConfig); setWarningConfigId(Core::Id::fromSetting(m_project->namedSettings(warningConfigIdKey()))); + m_customCommandLineOptions = m_project->namedSettings(customCommandLineKey()).toStringList(); + if (m_customCommandLineOptions.empty()) + m_customCommandLineOptions = globalCommandLineOptions(); } void ClangProjectSettings::store() { - m_project->setNamedSettings(useGlobalWarningConfigKey(), useGlobalWarningConfig()); + m_project->setNamedSettings(useGlobalConfigKey(), useGlobalConfig()); m_project->setNamedSettings(warningConfigIdKey(), warningConfigId().toSetting()); + m_project->setNamedSettings(customCommandLineKey(), m_customCommandLineOptions); +} + +QStringList ClangProjectSettings::globalCommandLineOptions() +{ + if (Utils::HostOsInfo::isWindowsHost()) + return {QLatin1String{GlobalWindowsCmdOptions}}; + return {}; } } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangprojectsettings.h b/src/plugins/clangcodemodel/clangprojectsettings.h index 481f7932dc1ee9275c2d421f54c331266e7213af..01aabfb6e98bd838b32152b9b862f8af58d89540 100644 --- a/src/plugins/clangcodemodel/clangprojectsettings.h +++ b/src/plugins/clangcodemodel/clangprojectsettings.h @@ -39,21 +39,32 @@ class ClangProjectSettings: public QObject Q_OBJECT public: + constexpr static const char* DelayedTemplateParsing = "-fdelayed-template-parsing"; + constexpr static const char* NoDelayedTemplateParsing = "-fno-delayed-template-parsing"; + constexpr static const char* GlobalWindowsCmdOptions = NoDelayedTemplateParsing; + ClangProjectSettings(ProjectExplorer::Project *project); - bool useGlobalWarningConfig() const; - void setUseGlobalWarningConfig(bool useGlobalWarningConfig); + bool useGlobalConfig() const; + void setUseGlobalConfig(bool useGlobalConfig); Core::Id warningConfigId() const; void setWarningConfigId(const Core::Id &warningConfigId); + QStringList commandLineOptions() const; + void setCommandLineOptions(const QStringList &options); + void load(); void store(); + static QStringList globalCommandLineOptions(); + private: ProjectExplorer::Project *m_project; - bool m_useGlobalWarningConfig = true; + bool m_useGlobalConfig = true; Core::Id m_warningConfigId; + + QStringList m_customCommandLineOptions; }; } // namespace Internal diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp index b44408f26f19a14c4bbc53d3952a5e40355efaa5..d8148a158da70a0e4a867e8b3fa50179ed27faa3 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp @@ -34,60 +34,21 @@ #include #include -static const char GLOBAL_PROXY_CONFIG_ID[] = "globalProxyConfig"; +#include namespace ClangCodeModel { namespace Internal { -static CppTools::ClangDiagnosticConfig -createConfigRepresentingGlobalSetting(const CppTools::ClangDiagnosticConfig &baseConfig) +static Core::Id configIdForProject(ClangProjectSettings &projectSettings) { - CppTools::ClangDiagnosticConfig config = baseConfig; - config.setId(GLOBAL_PROXY_CONFIG_ID); - - QString displayName = config.displayName(); - if (config.isReadOnly()) - displayName = CppTools::ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config); - displayName = ClangProjectSettingsWidget::tr("Global setting (%1)").arg(displayName); - - config.setDisplayName(displayName); - config.setIsReadOnly(true); - - return config; -} - -static Core::Id globalConfigId(const CppTools::CppCodeModelSettings &settings, - const CppTools::ClangDiagnosticConfigsModel &model) -{ - const Core::Id configId = settings.clangDiagnosticConfigId(); - - if (model.hasConfigWithId(configId)) - return configId; - - return model.at(0).id(); // Config saved in the settings was removed, fallback to first. -} - -static CppTools::ClangDiagnosticConfigsModel -createConfigsModelWithGlobalProxyConfig(const CppTools::CppCodeModelSettings &settings) -{ - using namespace CppTools; - ClangDiagnosticConfigsModel configsModel(settings.clangCustomDiagnosticConfigs()); - - const Core::Id globalId = globalConfigId(settings, configsModel); - const ClangDiagnosticConfig globalConfig = configsModel.configWithId(globalId); - const ClangDiagnosticConfig globalProxy - = createConfigRepresentingGlobalSetting(globalConfig); - - configsModel.prepend(globalProxy); - - return configsModel; -} - -static Core::Id configIdForProject(const ClangProjectSettings &projectSettings) -{ - return projectSettings.useGlobalWarningConfig() - ? Core::Id(GLOBAL_PROXY_CONFIG_ID) - : projectSettings.warningConfigId(); + if (projectSettings.useGlobalConfig()) + return CppTools::codeModelSettings()->clangDiagnosticConfigId(); + Core::Id configId = projectSettings.warningConfigId(); + if (!configId.isValid()) { + configId = CppTools::codeModelSettings()->clangDiagnosticConfigId(); + projectSettings.setWarningConfigId(configId); + } + return configId; } ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project *project) @@ -98,24 +59,33 @@ ClangProjectSettingsWidget::ClangProjectSettingsWidget(ProjectExplorer::Project using namespace CppTools; m_diagnosticConfigWidget = new ClangDiagnosticConfigsWidget; - m_diagnosticConfigWidget->setConfigWithUndecoratedDisplayName(Core::Id(GLOBAL_PROXY_CONFIG_ID)); refreshDiagnosticConfigsWidgetFromSettings(); + + m_ui.generalConfigurationGroupBox->setVisible(Utils::HostOsInfo::isWindowsHost()); + + m_ui.clangSettings->setCurrentIndex(m_projectSettings.useGlobalConfig() ? 0 : 1); + syncOtherWidgetsToComboBox(); + connectToCppCodeModelSettingsChanged(); connect(m_diagnosticConfigWidget.data(), &ClangDiagnosticConfigsWidget::currentConfigChanged, this, &ClangProjectSettingsWidget::onCurrentWarningConfigChanged); connect(m_diagnosticConfigWidget.data(), &ClangDiagnosticConfigsWidget::customConfigsChanged, this, &ClangProjectSettingsWidget::onCustomWarningConfigsChanged); + connect(m_ui.delayedTemplateParse, &QCheckBox::toggled, + this, &ClangProjectSettingsWidget::onDelayedTemplateParseClicked); + connect(m_ui.clangSettings, + static_cast(&QComboBox::currentIndexChanged), + this, &ClangProjectSettingsWidget::onClangSettingsChanged); m_ui.diagnosticConfigurationGroupBox->layout()->addWidget(m_diagnosticConfigWidget); } void ClangProjectSettingsWidget::onCurrentWarningConfigChanged(const Core::Id ¤tConfigId) { - const bool useGlobalConfig = currentConfigId == Core::Id(GLOBAL_PROXY_CONFIG_ID); - - m_projectSettings.setUseGlobalWarningConfig(useGlobalConfig); + // Don't save it when we reset the global config in code + if (m_projectSettings.useGlobalConfig()) + return; m_projectSettings.setWarningConfigId(currentConfigId); - m_projectSettings.store(); } @@ -132,11 +102,48 @@ void ClangProjectSettingsWidget::onCustomWarningConfigsChanged( connectToCppCodeModelSettingsChanged(); } +void ClangProjectSettingsWidget::onDelayedTemplateParseClicked(bool checked) +{ + // Don't save it when we reset the global config in code + if (m_projectSettings.useGlobalConfig()) + return; + + const QLatin1String extraFlag{checked ? ClangProjectSettings::DelayedTemplateParsing + : ClangProjectSettings::NoDelayedTemplateParsing}; + QStringList options = m_projectSettings.commandLineOptions(); + options.removeAll(QLatin1String{ClangProjectSettings::DelayedTemplateParsing}); + options.removeAll(QLatin1String{ClangProjectSettings::NoDelayedTemplateParsing}); + options.append(extraFlag); + m_projectSettings.setCommandLineOptions(options); + m_projectSettings.store(); +} + +void ClangProjectSettingsWidget::onClangSettingsChanged(int index) +{ + m_projectSettings.setUseGlobalConfig(index == 0 ? true : false); + m_projectSettings.store(); + syncOtherWidgetsToComboBox(); +} + +void ClangProjectSettingsWidget::syncOtherWidgetsToComboBox() +{ + const QStringList options = m_projectSettings.commandLineOptions(); + m_ui.delayedTemplateParse->setChecked( + options.contains(QLatin1String{ClangProjectSettings::DelayedTemplateParsing})); + + const bool isCustom = !m_projectSettings.useGlobalConfig(); + m_ui.generalConfigurationGroupBox->setEnabled(isCustom); + m_ui.diagnosticConfigurationGroupBox->setEnabled(isCustom); + + refreshDiagnosticConfigsWidgetFromSettings(); +} + void ClangProjectSettingsWidget::refreshDiagnosticConfigsWidgetFromSettings() { - m_diagnosticConfigWidget->refresh( - createConfigsModelWithGlobalProxyConfig(*CppTools::codeModelSettings()), - configIdForProject(m_projectSettings)); + CppTools::ClangDiagnosticConfigsModel configsModel( + CppTools::codeModelSettings()->clangCustomDiagnosticConfigs()); + m_diagnosticConfigWidget->refresh(configsModel, + configIdForProject(m_projectSettings)); } void ClangProjectSettingsWidget::connectToCppCodeModelSettingsChanged() diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.h b/src/plugins/clangcodemodel/clangprojectsettingswidget.h index 9c636edc1bbcd2ee41dcd3e2bfa2704153c9eb5c..d27be6341e80b0ad5c7956303e62220ae3568d5c 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.h +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.h @@ -49,9 +49,12 @@ public: private: void onCurrentWarningConfigChanged(const Core::Id ¤tConfigId); void onCustomWarningConfigsChanged(const CppTools::ClangDiagnosticConfigs &customConfigs); + void onDelayedTemplateParseClicked(bool); + void onClangSettingsChanged(int index); void refreshDiagnosticConfigsWidgetFromSettings(); void connectToCppCodeModelSettingsChanged(); void disconnectFromCppCodeModelSettingsChanged(); + void syncOtherWidgetsToComboBox(); private: Ui::ClangProjectSettingsWidget m_ui; diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.ui b/src/plugins/clangcodemodel/clangprojectsettingswidget.ui index 085294b84065b35956417f043a442991346dcd45..997554b38b98a74863182950457f6c6ac13ccfc5 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.ui +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.ui @@ -14,6 +14,52 @@ + + + + + 0 + 0 + + + + + Global + + + + + Custom + + + + + + + + + 0 + 0 + + + + General + + + + + + Parse templates in a MSVC-compliant way. This helps to parse headers for example from Active Template Library (ATL) or Windows Runtime Library (WRL). +However, using the relaxed and extended rules means also that no highlighting/completion can be provided within template functions. + + + Enable MSVC-compliant template parsing + + + + + + diff --git a/src/plugins/cpptools/clangdiagnosticconfig.cpp b/src/plugins/cpptools/clangdiagnosticconfig.cpp index 62d259c521d86ef11bad9df290321ad943fd5b8e..89cc76442ad1595513c448f3fbf9246c733e848b 100644 --- a/src/plugins/cpptools/clangdiagnosticconfig.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfig.cpp @@ -47,14 +47,14 @@ void ClangDiagnosticConfig::setDisplayName(const QString &displayName) m_displayName = displayName; } -QStringList ClangDiagnosticConfig::commandLineOptions() const +QStringList ClangDiagnosticConfig::commandLineWarnings() const { - return m_commandLineOptions; + return m_commandLineWarnings; } -void ClangDiagnosticConfig::setCommandLineOptions(const QStringList &options) +void ClangDiagnosticConfig::setCommandLineWarnings(const QStringList &warnings) { - m_commandLineOptions = options; + m_commandLineWarnings = warnings; } bool ClangDiagnosticConfig::isReadOnly() const @@ -71,7 +71,7 @@ bool ClangDiagnosticConfig::operator==(const ClangDiagnosticConfig &other) const { return m_id == other.m_id && m_displayName == other.m_displayName - && m_commandLineOptions == other.m_commandLineOptions + && m_commandLineWarnings == other.m_commandLineWarnings && m_isReadOnly == other.m_isReadOnly; } diff --git a/src/plugins/cpptools/clangdiagnosticconfig.h b/src/plugins/cpptools/clangdiagnosticconfig.h index 17a5a768bb4ef7556f8fabae295b897237d210ba..b9efb040b0edeaf3b622fc61fab60a27eed4d85c 100644 --- a/src/plugins/cpptools/clangdiagnosticconfig.h +++ b/src/plugins/cpptools/clangdiagnosticconfig.h @@ -43,8 +43,8 @@ public: QString displayName() const; void setDisplayName(const QString &displayName); - QStringList commandLineOptions() const; - void setCommandLineOptions(const QStringList &commandLineOptions); + QStringList commandLineWarnings() const; + void setCommandLineWarnings(const QStringList &commandLineWarnings); bool isReadOnly() const; void setIsReadOnly(bool isReadOnly); @@ -54,7 +54,7 @@ public: private: Core::Id m_id; QString m_displayName; - QStringList m_commandLineOptions; + QStringList m_commandLineWarnings; bool m_isReadOnly = false; }; diff --git a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp index dcb09998aab99b028c90fe7e0611b57d06c8fc73..972f82c2d006bb005ac8037f5d3030a9a6654aa1 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigsmodel.cpp @@ -33,7 +33,7 @@ namespace CppTools { -static QStringList commonOptions() +static QStringList commonWarnings() { return { QStringLiteral("-Wno-unknown-pragmas") }; } @@ -45,10 +45,10 @@ static void addConfigForQuestionableConstructs(ClangDiagnosticConfigsModel &mode config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Warnings for questionable constructs")); config.setIsReadOnly(true); - config.setCommandLineOptions(QStringList{ + config.setCommandLineWarnings(QStringList{ QStringLiteral("-Wall"), QStringLiteral("-Wextra"), - } + commonOptions()); + } + commonWarnings()); model.appendOrUpdate(config); } @@ -60,7 +60,7 @@ static void addConfigForPedanticWarnings(ClangDiagnosticConfigsModel &model) config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Pedantic Warnings")); config.setIsReadOnly(true); - config.setCommandLineOptions(QStringList{QStringLiteral("-Wpedantic")} + commonOptions()); + config.setCommandLineWarnings(QStringList{QStringLiteral("-Wpedantic")} + commonWarnings()); model.appendOrUpdate(config); } @@ -72,7 +72,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model) config.setDisplayName(QCoreApplication::translate("ClangDiagnosticConfigsModel", "Warnings for almost everything")); config.setIsReadOnly(true); - config.setCommandLineOptions(QStringList{ + config.setCommandLineWarnings(QStringList{ QStringLiteral("-Weverything"), QStringLiteral("-Wno-c++98-compat"), QStringLiteral("-Wno-c++98-compat-pedantic"), @@ -85,7 +85,7 @@ static void addConfigForAlmostEveryWarning(ClangDiagnosticConfigsModel &model) QStringLiteral("-Wno-shadow"), QStringLiteral("-Wno-missing-prototypes"), // Not optimal for C projects. QStringLiteral("-Wno-used-but-marked-unused"), // e.g. QTest::qWait - } + commonOptions()); + } + commonWarnings()); model.appendOrUpdate(config); } diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp index bb3d55c3cc3e750121e4dccf05a664674b6dbde2..6b8a04ac337b36d77cbffe966b8b4f51295a1ddc 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.cpp @@ -115,7 +115,7 @@ void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited() = diagnosticOptions.trimmed().split(QLatin1Char(' '), QString::SkipEmptyParts); ClangDiagnosticConfig updatedConfig = currentConfig(); - updatedConfig.setCommandLineOptions(updatedCommandLine); + updatedConfig.setCommandLineWarnings(updatedCommandLine); m_diagnosticConfigsModel.appendOrUpdate(updatedConfig); emit customConfigsChanged(customConfigs()); @@ -127,15 +127,6 @@ void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSe syncOtherWidgetsToComboBox(); } -static QString displayNameWithBuiltinIndication(const ClangDiagnosticConfig &config, - const Core::Id &exceptionalConfig) -{ - if (exceptionalConfig == config.id()) - return config.displayName(); - - return ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config); -} - void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &configToSelect) { disconnectConfigChooserCurrentIndex(); @@ -148,7 +139,7 @@ void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &conf for (int i = 0; i < size; ++i) { const ClangDiagnosticConfig &config = m_diagnosticConfigsModel.at(i); const QString displayName - = displayNameWithBuiltinIndication(config, m_configWithUndecoratedDisplayName); + = ClangDiagnosticConfigsModel::displayNameWithBuiltinIndication(config); m_ui->configChooserComboBox->addItem(displayName, config.id().toSetting()); if (configToSelect == config.id()) @@ -176,8 +167,8 @@ void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox() m_ui->removeButton->setEnabled(!config.isReadOnly()); // Update child widgets - const QString commandLineOptions = config.commandLineOptions().join(QLatin1Char(' ')); - setDiagnosticOptions(commandLineOptions); + const QString commandLineWarnings = config.commandLineWarnings().join(QLatin1Char(' ')); + setDiagnosticOptions(commandLineWarnings); m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly()); } @@ -228,11 +219,6 @@ void ClangDiagnosticConfigsWidget::disconnectDiagnosticOptionsChanged() this, &ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited); } -void ClangDiagnosticConfigsWidget::setConfigWithUndecoratedDisplayName(const Core::Id &id) -{ - m_configWithUndecoratedDisplayName = id; -} - Core::Id ClangDiagnosticConfigsWidget::currentConfigId() const { return Core::Id::fromSetting(m_ui->configChooserComboBox->currentData()); diff --git a/src/plugins/cpptools/clangdiagnosticconfigswidget.h b/src/plugins/cpptools/clangdiagnosticconfigswidget.h index 63480400b7047d1fb04e12947a69c6da3ef1a315..e22de1b97d03a80922df69dafd7546f0b86ea25e 100644 --- a/src/plugins/cpptools/clangdiagnosticconfigswidget.h +++ b/src/plugins/cpptools/clangdiagnosticconfigswidget.h @@ -50,7 +50,6 @@ public: Core::Id currentConfigId() const; ClangDiagnosticConfigs customConfigs() const; - void setConfigWithUndecoratedDisplayName(const Core::Id &id); void refresh(const ClangDiagnosticConfigsModel &diagnosticConfigsModel, const Core::Id &configToSelect); @@ -82,7 +81,6 @@ private: private: Ui::ClangDiagnosticConfigsWidget *m_ui; ClangDiagnosticConfigsModel m_diagnosticConfigsModel; - Core::Id m_configWithUndecoratedDisplayName; }; } // CppTools namespace diff --git a/src/plugins/cpptools/cppcodemodelsettings.cpp b/src/plugins/cpptools/cppcodemodelsettings.cpp index a129fa61daa44dc723c49a321e8ce57fb69cbd3e..f5bb404b612741834c751ba437e095d7f301d72a 100644 --- a/src/plugins/cpptools/cppcodemodelsettings.cpp +++ b/src/plugins/cpptools/cppcodemodelsettings.cpp @@ -52,7 +52,7 @@ static QString clangDiagnosticConfigsArrayIdKey() static QString clangDiagnosticConfigsArrayDisplayNameKey() { return QLatin1String("displayName"); } -static QString clangDiagnosticConfigsArrayOptionsKey() +static QString clangDiagnosticConfigsArrayWarningsKey() { return QLatin1String("diagnosticOptions"); } static QString pchUsageKey() @@ -78,7 +78,7 @@ void CppCodeModelSettings::fromSettings(QSettings *s) ClangDiagnosticConfig config; config.setId(Core::Id::fromSetting(s->value(clangDiagnosticConfigsArrayIdKey()))); config.setDisplayName(s->value(clangDiagnosticConfigsArrayDisplayNameKey()).toString()); - config.setCommandLineOptions(s->value(clangDiagnosticConfigsArrayOptionsKey()).toStringList()); + config.setCommandLineWarnings(s->value(clangDiagnosticConfigsArrayWarningsKey()).toStringList()); m_clangCustomDiagnosticConfigs.append(config); } s->endArray(); @@ -117,7 +117,7 @@ void CppCodeModelSettings::toSettings(QSettings *s) s->setArrayIndex(i); s->setValue(clangDiagnosticConfigsArrayIdKey(), config.id().toSetting()); s->setValue(clangDiagnosticConfigsArrayDisplayNameKey(), config.displayName()); - s->setValue(clangDiagnosticConfigsArrayOptionsKey(), config.commandLineOptions()); + s->setValue(clangDiagnosticConfigsArrayWarningsKey(), config.commandLineWarnings()); } s->endArray(); diff --git a/src/tools/clangbackend/ipcsource/projectpart.cpp b/src/tools/clangbackend/ipcsource/projectpart.cpp index 01058c2912b678eb076eb005e75ac36588c5dc3b..4ea8db66096b1b95622d83184926b378d19912e1 100644 --- a/src/tools/clangbackend/ipcsource/projectpart.cpp +++ b/src/tools/clangbackend/ipcsource/projectpart.cpp @@ -60,7 +60,7 @@ ProjectPart::ProjectPart(const Utf8String &projectPartId) } ProjectPart::ProjectPart(const Utf8String &projectPartId, - std::initializer_list arguments) + const Utf8StringVector &arguments) : d(std::make_shared(projectPartId)) { setArguments(arguments); diff --git a/src/tools/clangbackend/ipcsource/projectpart.h b/src/tools/clangbackend/ipcsource/projectpart.h index 0b616cc28239eec13190e7bdb7e1dc368878b708..b96089d283d5ba04ba155c7957c9c0211e271d5e 100644 --- a/src/tools/clangbackend/ipcsource/projectpart.h +++ b/src/tools/clangbackend/ipcsource/projectpart.h @@ -42,7 +42,7 @@ class ProjectPart { public: ProjectPart(const Utf8String &id = Utf8String()); - ProjectPart(const Utf8String &id, std::initializer_list arguments); + ProjectPart(const Utf8String &id, const Utf8StringVector &arguments); ProjectPart(const ProjectPartContainer &projectContainer); ~ProjectPart(); diff --git a/tests/unit/unittest/codecompletionsextractor-test.cpp b/tests/unit/unittest/codecompletionsextractor-test.cpp index 585e9301d2fe436b9f52f891d5cc8db30fb9c26a..7c89fe58e93651dd4c5f0546c5522b6158e1f3ab 100644 --- a/tests/unit/unittest/codecompletionsextractor-test.cpp +++ b/tests/unit/unittest/codecompletionsextractor-test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "googletest.h" +#include "testenvironment.h" #include #include @@ -148,7 +149,7 @@ protected: bool needsReparse = false); protected: - ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile")}; + ClangBackEnd::ProjectPart project{Utf8StringLiteral("/path/to/projectfile"), TestEnvironment::addPlatformArguments()}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::Documents documents{projects, unsavedFiles}; @@ -197,7 +198,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, Variable) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(NonTypeTemplateParameter)) +TEST_F(CodeCompletionsExtractorSlowTest, NonTypeTemplateParameter) { ClangCodeCompleteResults completeResults(getResults(variableDocument, 25, 19)); @@ -242,7 +243,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, Field) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Class)) +TEST_F(CodeCompletionsExtractorSlowTest, Class) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -253,7 +254,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Class)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Struct)) +TEST_F(CodeCompletionsExtractorSlowTest, Struct) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -264,7 +265,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Struct)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Union)) +TEST_F(CodeCompletionsExtractorSlowTest, Union) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -275,7 +276,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Union)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Typedef)) +TEST_F(CodeCompletionsExtractorSlowTest, Typedef) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -286,7 +287,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(Typedef)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(UsingAsTypeAlias)) +TEST_F(CodeCompletionsExtractorSlowTest, UsingAsTypeAlias) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -297,7 +298,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(UsingAsTypeAlias)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateTypeParameter)) +TEST_F(CodeCompletionsExtractorSlowTest, TemplateTypeParameter) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -308,7 +309,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateTypeParamet CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateClass)) +TEST_F(CodeCompletionsExtractorSlowTest, TemplateClass) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -319,7 +320,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateClass)) CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateTemplateParameter)) +TEST_F(CodeCompletionsExtractorSlowTest, TemplateTemplateParameter) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -330,7 +331,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(TemplateTemplatePar CodeCompletion::Available)); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(ClassTemplatePartialSpecialization)) +TEST_F(CodeCompletionsExtractorSlowTest, ClassTemplatePartialSpecialization) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); @@ -659,7 +660,7 @@ TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksEnumeration) CodeCompletionChunks({{CodeCompletionChunk::TypedText, Utf8StringLiteral("Enumeration")}}))); } -TEST_F(CodeCompletionsExtractorSlowTest, DISABLED_ON_WINDOWS(CompletionChunksClass)) +TEST_F(CodeCompletionsExtractorSlowTest, CompletionChunksClass) { ClangCodeCompleteResults completeResults(getResults(classDocument, 20)); diff --git a/tests/unit/unittest/cursor-test.cpp b/tests/unit/unittest/cursor-test.cpp index f6b87c1243993edb8d9784a4d34857ebe3fe61bf..78913d7c20dd5928f14f83fc4498315302dd0213 100644 --- a/tests/unit/unittest/cursor-test.cpp +++ b/tests/unit/unittest/cursor-test.cpp @@ -26,6 +26,7 @@ #include "googletest.h" #include "clangcompareoperators.h" +#include "testenvironment.h" #include #include @@ -66,7 +67,7 @@ struct Data { Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/cursor.cpp")}; Document document{filePath, ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++11")}), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-std=c++11")})), {}, documents}; TranslationUnit translationUnit{filePath, @@ -395,7 +396,7 @@ TEST_F(Cursor, IsLocalVariableInStaticFunction) ASSERT_TRUE(cursor.isLocalVariable()); } -TEST_F(Cursor, DISABLED_ON_WINDOWS(IsLocalVariableInTemplateFunction)) +TEST_F(Cursor, IsLocalVariableInTemplateFunction) { auto cursor = translationUnit.cursorAt(52, 7); diff --git a/tests/unit/unittest/diagnostic-test.cpp b/tests/unit/unittest/diagnostic-test.cpp index d53800f571372cd99564e15c8862c3cdaa90ab9d..24de9e41192f930df5e97905e622fd20d8e27743 100644 --- a/tests/unit/unittest/diagnostic-test.cpp +++ b/tests/unit/unittest/diagnostic-test.cpp @@ -25,6 +25,7 @@ #include "googletest.h" #include "diagnosticcontainer-matcher.h" +#include "testenvironment.h" #include #include @@ -95,7 +96,8 @@ struct Data { d.reset(new DiagnosticData(document)); } - ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-std=c++11")}}; + ProjectPart projectPart{Utf8StringLiteral("projectPartId"), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-std=c++11")})}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::Documents documents{projects, unsavedFiles}; diff --git a/tests/unit/unittest/diagnosticset-test.cpp b/tests/unit/unittest/diagnosticset-test.cpp index c7b04cb8ab04e21c6cc97aed230062113615efa9..007c8d2f5f63b82b47b7ba10c271cc08e6605b00 100644 --- a/tests/unit/unittest/diagnosticset-test.cpp +++ b/tests/unit/unittest/diagnosticset-test.cpp @@ -25,6 +25,7 @@ #include "googletest.h" #include "diagnosticcontainer-matcher.h" +#include "testenvironment.h" #include #include @@ -63,7 +64,8 @@ const Utf8String headerFilePath = Utf8StringLiteral(TESTDATA_DIR"/diagnostic_dia class DiagnosticSet : public ::testing::Test { protected: - ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; + ProjectPart projectPart{Utf8StringLiteral("projectPartId"), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-pedantic")})}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::Documents documents{projects, unsavedFiles}; diff --git a/tests/unit/unittest/highlightingmarks-test.cpp b/tests/unit/unittest/highlightingmarks-test.cpp index 4cecb620fc80222a376ea290bf9cb73459f15b86..faddd879579e2dc666ca6c3abf4118e72c67b36e 100644 --- a/tests/unit/unittest/highlightingmarks-test.cpp +++ b/tests/unit/unittest/highlightingmarks-test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "googletest.h" +#include "testenvironment.h" #include #include @@ -107,7 +108,8 @@ struct Data { Utf8String filePath{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp")}; Document document{filePath, ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++14"), Utf8StringLiteral("-I" TESTDATA_DIR)}), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-std=c++14"), + Utf8StringLiteral("-I" TESTDATA_DIR)})), {}, documents}; TranslationUnit translationUnit{filePath, @@ -676,49 +678,49 @@ TEST_F(HighlightingMarks, TemplateFunctionDeclaration) ASSERT_THAT(infos[1], HasOnlyType(HighlightingType::Function)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(TemplateTypeParameterReference)) +TEST_F(HighlightingMarks, TemplateTypeParameterReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(268, 58)); ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::Type)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(TemplateTypeParameterDeclarationReference)) +TEST_F(HighlightingMarks, TemplateTypeParameterDeclarationReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(268, 58)); ASSERT_THAT(infos[1], HasOnlyType(HighlightingType::LocalVariable)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(NonTypeTemplateParameterReference)) +TEST_F(HighlightingMarks, NonTypeTemplateParameterReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(269, 71)); ASSERT_THAT(infos[3], HasOnlyType(HighlightingType::LocalVariable)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(NonTypeTemplateParameterReferenceReference)) +TEST_F(HighlightingMarks, NonTypeTemplateParameterReferenceReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(269, 71)); ASSERT_THAT(infos[1], HasOnlyType(HighlightingType::LocalVariable)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(TemplateTemplateParameterReference)) +TEST_F(HighlightingMarks, TemplateTemplateParameterReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(270, 89)); ASSERT_THAT(infos[0], HasOnlyType(HighlightingType::Type)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(TemplateTemplateContainerParameterReference)) +TEST_F(HighlightingMarks, TemplateTemplateContainerParameterReference) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(270, 89)); ASSERT_THAT(infos[2], HasOnlyType(HighlightingType::Type)); } -TEST_F(HighlightingMarks, DISABLED_ON_WINDOWS(TemplateTemplateParameterReferenceVariable)) +TEST_F(HighlightingMarks, TemplateTemplateParameterReferenceVariable) { const auto infos = translationUnit.highlightingMarksInRange(sourceRange(270, 89)); diff --git a/tests/unit/unittest/highlightingmarksreporter-test.cpp b/tests/unit/unittest/highlightingmarksreporter-test.cpp index ec9760a10f1316e9be40d47d7f41407c0bcb0818..f153ba3472be4e3cddca2292666512de3bdf4f14 100644 --- a/tests/unit/unittest/highlightingmarksreporter-test.cpp +++ b/tests/unit/unittest/highlightingmarksreporter-test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "googletest.h" +#include "testenvironment.h" #include #include @@ -55,7 +56,7 @@ struct Data { Documents documents{projects, unsavedFiles}; Document document{Utf8StringLiteral(TESTDATA_DIR"/highlightingmarks.cpp"), ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++14")}), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-std=c++14")})), {}, documents}; }; diff --git a/tests/unit/unittest/skippedsourceranges-test.cpp b/tests/unit/unittest/skippedsourceranges-test.cpp index fdf995ab840204fdb0e76ce8674c956fa36fe7fb..c74dfa828b2cc52dda5b5d79143aca570d9fad24 100644 --- a/tests/unit/unittest/skippedsourceranges-test.cpp +++ b/tests/unit/unittest/skippedsourceranges-test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "googletest.h" +#include "testenvironment.h" #include #include @@ -94,8 +95,8 @@ struct Data { Utf8String filePath = Utf8StringLiteral(TESTDATA_DIR"/skippedsourceranges.cpp"); Document document{filePath, ProjectPart(Utf8StringLiteral("projectPartId"), - {Utf8StringLiteral("-std=c++11"), - Utf8StringLiteral("-DBLAH")}), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-std=c++11"), + Utf8StringLiteral("-DBLAH")})), {}, documents}; TranslationUnit translationUnit{filePath, diff --git a/tests/unit/unittest/sourcerange-test.cpp b/tests/unit/unittest/sourcerange-test.cpp index 2b20c4029dc5f8a6c688a4c8245478ca60566257..5665b46573e4a5cb4e91deb5366941339589bd5b 100644 --- a/tests/unit/unittest/sourcerange-test.cpp +++ b/tests/unit/unittest/sourcerange-test.cpp @@ -24,6 +24,7 @@ ****************************************************************************/ #include "googletest.h" +#include "testenvironment.h" #include #include @@ -93,7 +94,8 @@ struct Data { d.reset(new SourceRangeData(document)); } - ProjectPart projectPart{Utf8StringLiteral("projectPartId"), {Utf8StringLiteral("-pedantic")}}; + ProjectPart projectPart{Utf8StringLiteral("projectPartId"), + TestEnvironment::addPlatformArguments({Utf8StringLiteral("-pedantic")})}; ClangBackEnd::ProjectParts projects; ClangBackEnd::UnsavedFiles unsavedFiles; ClangBackEnd::Documents documents{projects, unsavedFiles}; diff --git a/tests/unit/unittest/testenvironment.h b/tests/unit/unittest/testenvironment.h index a071b45432dcf4154d9aef06969c04359d5217e9..8b6ef897100684b50679f10918a0a1d3f1c5c14b 100644 --- a/tests/unit/unittest/testenvironment.h +++ b/tests/unit/unittest/testenvironment.h @@ -27,7 +27,11 @@ #include +#include +#include + #include +#include class TestEnvironment final : public ClangBackEnd::Environment { @@ -50,6 +54,14 @@ public: return 2; } + static QVector addPlatformArguments(std::initializer_list arguments = {}) + { + QVector result{arguments}; + if (Utils::HostOsInfo::isWindowsHost()) + result.append(Utf8StringLiteral("-fno-delayed-template-parsing")); + return result; + } + private: QTemporaryDir temporaryDirectory; };