forked from qt-creator/qt-creator
		
	Clang: Introduce switching/adding of warning configurations
A warning configuration is a list of command line (warning) options for libclang. Three non-editable built-in configurations are provided by default. The user can copy a configuration to customize it. This is still a global setting and it changes take effect after re-opening a document. Both issues will be addressed in follow-up changes. Change-Id: I86667d7dc39ad31b88666454220e6da563797740 Reviewed-by: Leena Miettinen <riitta-leena.miettinen@theqtcompany.com> Reviewed-by: Marco Bubke <marco.bubke@theqtcompany.com>
This commit is contained in:
		
							
								
								
									
										196
									
								
								src/plugins/cpptools/clangdiagnosticconfigswidget.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								src/plugins/cpptools/clangdiagnosticconfigswidget.cpp
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,196 @@
 | 
			
		||||
/****************************************************************************
 | 
			
		||||
**
 | 
			
		||||
** 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.
 | 
			
		||||
**
 | 
			
		||||
****************************************************************************/
 | 
			
		||||
 | 
			
		||||
#include "clangdiagnosticconfigswidget.h"
 | 
			
		||||
#include "ui_clangdiagnosticconfigswidget.h"
 | 
			
		||||
 | 
			
		||||
#include <utils/algorithm.h>
 | 
			
		||||
#include <utils/qtcassert.h>
 | 
			
		||||
 | 
			
		||||
#include <QDebug>
 | 
			
		||||
#include <QInputDialog>
 | 
			
		||||
#include <QUuid>
 | 
			
		||||
 | 
			
		||||
namespace CppTools {
 | 
			
		||||
namespace Internal {
 | 
			
		||||
 | 
			
		||||
ClangDiagnosticConfigsWidget::ClangDiagnosticConfigsWidget(
 | 
			
		||||
        const ClangDiagnosticConfigs &customConfigs,
 | 
			
		||||
        const Core::Id &configToSelect,
 | 
			
		||||
        QWidget *parent)
 | 
			
		||||
    : QWidget(parent)
 | 
			
		||||
    , m_ui(new Ui::ClangDiagnosticConfigsWidget)
 | 
			
		||||
    , m_diagnosticConfigsModel(customConfigs)
 | 
			
		||||
{
 | 
			
		||||
    m_ui->setupUi(this);
 | 
			
		||||
 | 
			
		||||
    connect(m_ui->configChooserComboBox,
 | 
			
		||||
            static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
 | 
			
		||||
            this,
 | 
			
		||||
            &ClangDiagnosticConfigsWidget::onCurrentConfigChanged);
 | 
			
		||||
    connect(m_ui->copyButton, &QPushButton::clicked,
 | 
			
		||||
            this, &ClangDiagnosticConfigsWidget::onCopyButtonClicked);
 | 
			
		||||
    connect(m_ui->removeButton, &QPushButton::clicked,
 | 
			
		||||
            this, &ClangDiagnosticConfigsWidget::onRemoveButtonClicked);
 | 
			
		||||
    connect(m_ui->diagnosticOptionsTextEdit->document(), &QTextDocument::contentsChanged,
 | 
			
		||||
            this, &ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited);
 | 
			
		||||
 | 
			
		||||
    syncWidgetsToModel(configToSelect);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClangDiagnosticConfigsWidget::~ClangDiagnosticConfigsWidget()
 | 
			
		||||
{
 | 
			
		||||
    delete m_ui;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::onCurrentConfigChanged(int)
 | 
			
		||||
{
 | 
			
		||||
    syncOtherWidgetsToComboBox();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static ClangDiagnosticConfig createCustomConfig(const ClangDiagnosticConfig &config,
 | 
			
		||||
                                                const QString &displayName)
 | 
			
		||||
{
 | 
			
		||||
    ClangDiagnosticConfig copied = config;
 | 
			
		||||
    copied.setId(Core::Id::fromString(QUuid::createUuid().toString()));
 | 
			
		||||
    copied.setDisplayName(displayName);
 | 
			
		||||
    copied.setIsReadOnly(false);
 | 
			
		||||
 | 
			
		||||
    return copied;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::onCopyButtonClicked()
 | 
			
		||||
{
 | 
			
		||||
    const ClangDiagnosticConfig &config = currentConfig();
 | 
			
		||||
 | 
			
		||||
    bool diaglogAccepted = false;
 | 
			
		||||
    const QString newName = QInputDialog::getText(this,
 | 
			
		||||
                                                  tr("Copy Diagnostic Configuration"),
 | 
			
		||||
                                                  tr("Diagnostic configuration name:"),
 | 
			
		||||
                                                  QLineEdit::Normal,
 | 
			
		||||
                                                  tr("%1 (Copy)").arg(config.displayName()),
 | 
			
		||||
                                                  &diaglogAccepted);
 | 
			
		||||
    if (diaglogAccepted) {
 | 
			
		||||
        const ClangDiagnosticConfig customConfig = createCustomConfig(config, newName);
 | 
			
		||||
        m_diagnosticConfigsModel.appendOrUpdate(customConfig);
 | 
			
		||||
 | 
			
		||||
        syncConfigChooserToModel(customConfig.id());
 | 
			
		||||
        m_ui->diagnosticOptionsTextEdit->setFocus();
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
 | 
			
		||||
{
 | 
			
		||||
    m_diagnosticConfigsModel.removeConfigWithId(currentConfigId());
 | 
			
		||||
 | 
			
		||||
    syncConfigChooserToModel();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::onDiagnosticOptionsEdited()
 | 
			
		||||
{
 | 
			
		||||
    const QString diagnosticOptions
 | 
			
		||||
            = m_ui->diagnosticOptionsTextEdit->document()->toPlainText().trimmed();
 | 
			
		||||
    const QStringList updatedCommandLine
 | 
			
		||||
            = diagnosticOptions.trimmed().split(QLatin1Char(' '), QString::SkipEmptyParts);
 | 
			
		||||
 | 
			
		||||
    ClangDiagnosticConfig updatedConfig = currentConfig();
 | 
			
		||||
    updatedConfig.setCommandLineOptions(updatedCommandLine);
 | 
			
		||||
 | 
			
		||||
    m_diagnosticConfigsModel.appendOrUpdate(updatedConfig);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::syncWidgetsToModel(const Core::Id &configToSelect)
 | 
			
		||||
{
 | 
			
		||||
    syncConfigChooserToModel(configToSelect);
 | 
			
		||||
    syncOtherWidgetsToComboBox();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static QString adaptedDisplayName(const ClangDiagnosticConfig &config)
 | 
			
		||||
{
 | 
			
		||||
    return config.isReadOnly()
 | 
			
		||||
        ? QObject::tr("%1 [built-in]").arg(config.displayName())
 | 
			
		||||
        : config.displayName();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::syncConfigChooserToModel(const Core::Id &configToSelect)
 | 
			
		||||
{
 | 
			
		||||
    m_ui->configChooserComboBox->clear();
 | 
			
		||||
    int currentIndex = -1;
 | 
			
		||||
 | 
			
		||||
    const int size = m_diagnosticConfigsModel.size();
 | 
			
		||||
    for (int i = 0; i < size; ++i) {
 | 
			
		||||
        const ClangDiagnosticConfig &config = m_diagnosticConfigsModel.at(i);
 | 
			
		||||
        m_ui->configChooserComboBox->addItem(adaptedDisplayName(config), config.id().toSetting());
 | 
			
		||||
 | 
			
		||||
        if (configToSelect == config.id())
 | 
			
		||||
            currentIndex = i;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (currentIndex != -1)
 | 
			
		||||
        m_ui->configChooserComboBox->setCurrentIndex(currentIndex);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ClangDiagnosticConfigsWidget::syncOtherWidgetsToComboBox()
 | 
			
		||||
{
 | 
			
		||||
    if (isConfigChooserEmpty())
 | 
			
		||||
        return;
 | 
			
		||||
 | 
			
		||||
    const ClangDiagnosticConfig &config = currentConfig();
 | 
			
		||||
 | 
			
		||||
    // Update main button row
 | 
			
		||||
    m_ui->removeButton->setEnabled(!config.isReadOnly());
 | 
			
		||||
 | 
			
		||||
    // Update child widgets
 | 
			
		||||
    const QString commandLineOptions = config.commandLineOptions().join(QLatin1Char(' '));
 | 
			
		||||
    m_ui->diagnosticOptionsTextEdit->document()->setPlainText(commandLineOptions);
 | 
			
		||||
    m_ui->diagnosticOptionsTextEdit->setReadOnly(config.isReadOnly());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool ClangDiagnosticConfigsWidget::isConfigChooserEmpty() const
 | 
			
		||||
{
 | 
			
		||||
    return m_ui->configChooserComboBox->count() == 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const ClangDiagnosticConfig &ClangDiagnosticConfigsWidget::currentConfig() const
 | 
			
		||||
{
 | 
			
		||||
    return m_diagnosticConfigsModel.configWithId(currentConfigId());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Core::Id ClangDiagnosticConfigsWidget::currentConfigId() const
 | 
			
		||||
{
 | 
			
		||||
    return Core::Id::fromSetting(m_ui->configChooserComboBox->currentData());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ClangDiagnosticConfigs ClangDiagnosticConfigsWidget::customConfigs() const
 | 
			
		||||
{
 | 
			
		||||
    const ClangDiagnosticConfigs allConfigs = m_diagnosticConfigsModel.configs();
 | 
			
		||||
 | 
			
		||||
    return Utils::filtered(allConfigs, [](const ClangDiagnosticConfig &config){
 | 
			
		||||
        return !config.isReadOnly();
 | 
			
		||||
    });
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // Internal namespace
 | 
			
		||||
} // CppTools namespace
 | 
			
		||||
		Reference in New Issue
	
	Block a user