diff options
author | Ivan Donchevskii <[email protected]> | 2017-05-23 09:49:22 +0200 |
---|---|---|
committer | Ivan Donchevskii <[email protected]> | 2017-06-08 10:53:31 +0000 |
commit | 78db7d7ed24625cee373fb80b689bd3a7208d6e4 (patch) | |
tree | 4467a3873a0170cc728a4c8e0c45f0af35b14667 /src/plugins/clangcodemodel/clangprojectsettingswidget.cpp | |
parent | 0784dd20fe3d4d31b89d8f1a7d4ad81ce09b6b67 (diff) |
Clang: turn off delayed template parsing
Fix templates highlight and completion on Windows
Add UI to turn on/off delayed parsing (off by default)
Task-number: QTCREATORBUG-17222
Change-Id: I0cd5e0bcfff2789cd938e4096829f777ff15957a
Reviewed-by: Nikolai Kosjar <[email protected]>
Diffstat (limited to 'src/plugins/clangcodemodel/clangprojectsettingswidget.cpp')
-rw-r--r-- | src/plugins/clangcodemodel/clangprojectsettingswidget.cpp | 121 |
1 files changed, 64 insertions, 57 deletions
diff --git a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp index b44408f26f1..d8148a158da 100644 --- a/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp +++ b/src/plugins/clangcodemodel/clangprojectsettingswidget.cpp @@ -34,60 +34,21 @@ #include <cpptools/cppcodemodelsettings.h> #include <cpptools/cpptoolsreuse.h> -static const char GLOBAL_PROXY_CONFIG_ID[] = "globalProxyConfig"; +#include <utils/hostosinfo.h> 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<void (QComboBox::*)(int)>(&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() |