Clang: Add combobox with tidy configuration options

The old way was not flexible enough.
With these options it's possible to just use your
config file or set tidy command line yourself.

Change-Id: I1bace40986668dee5e1b30c9d03090a3fd22e253
Reviewed-by: Marco Bubke <marco.bubke@qt.io>
This commit is contained in:
Ivan Donchevskii
2018-02-23 11:36:18 +01:00
parent 1e033d8a08
commit 4d153b4f67
7 changed files with 319 additions and 105 deletions

View File

@@ -72,7 +72,9 @@ bool ClangDiagnosticConfig::operator==(const ClangDiagnosticConfig &other) const
return m_id == other.m_id
&& m_displayName == other.m_displayName
&& m_clangOptions == other.m_clangOptions
&& m_clangTidyChecks == other.m_clangTidyChecks
&& m_clangTidyMode == other.m_clangTidyMode
&& m_clangTidyChecksPrefixes == other.m_clangTidyChecksPrefixes
&& m_clangTidyChecksString == other.m_clangTidyChecksString
&& m_clazyChecks == other.m_clazyChecks
&& m_isReadOnly == other.m_isReadOnly;
}
@@ -82,14 +84,34 @@ bool ClangDiagnosticConfig::operator!=(const ClangDiagnosticConfig &other) const
return !(*this == other);
}
QString ClangDiagnosticConfig::clangTidyChecks() const
ClangDiagnosticConfig::TidyMode ClangDiagnosticConfig::clangTidyMode() const
{
return m_clangTidyChecks;
return m_clangTidyMode;
}
void ClangDiagnosticConfig::setClangTidyChecks(const QString &checks)
void ClangDiagnosticConfig::setClangTidyMode(TidyMode mode)
{
m_clangTidyChecks = checks;
m_clangTidyMode = mode;
}
QString ClangDiagnosticConfig::clangTidyChecksPrefixes() const
{
return m_clangTidyChecksPrefixes;
}
void ClangDiagnosticConfig::setClangTidyChecksPrefixes(const QString &checks)
{
m_clangTidyChecksPrefixes = checks;
}
QString ClangDiagnosticConfig::clangTidyChecksString() const
{
return m_clangTidyChecksString;
}
void ClangDiagnosticConfig::setClangTidyChecksString(const QString &checks)
{
m_clangTidyChecksString = checks;
}
QString ClangDiagnosticConfig::clazyChecks() const

View File

@@ -37,6 +37,14 @@ namespace CppTools {
class CPPTOOLS_EXPORT ClangDiagnosticConfig
{
public:
enum class TidyMode
{
Disabled = 0,
ChecksPrefixList,
ChecksString,
File
};
Core::Id id() const;
void setId(const Core::Id &id);
@@ -46,8 +54,14 @@ public:
QStringList clangOptions() const;
void setClangOptions(const QStringList &options);
QString clangTidyChecks() const;
void setClangTidyChecks(const QString &checks);
QString clangTidyChecksPrefixes() const;
void setClangTidyChecksPrefixes(const QString &checks);
QString clangTidyChecksString() const;
void setClangTidyChecksString(const QString &checks);
TidyMode clangTidyMode() const;
void setClangTidyMode(TidyMode mode);
QString clazyChecks() const;
void setClazyChecks(const QString &checks);
@@ -62,7 +76,9 @@ private:
Core::Id m_id;
QString m_displayName;
QStringList m_clangOptions;
QString m_clangTidyChecks;
TidyMode m_clangTidyMode;
QString m_clangTidyChecksPrefixes;
QString m_clangTidyChecksString;
QString m_clazyChecks;
bool m_isReadOnly = false;
};

View File

@@ -112,15 +112,30 @@ void ClangDiagnosticConfigsWidget::onRemoveButtonClicked()
syncConfigChooserToModel();
}
void ClangDiagnosticConfigsWidget::onClangTidyModeChanged(int index)
{
ClangDiagnosticConfig config = currentConfig();
config.setClangTidyMode(static_cast<ClangDiagnosticConfig::TidyMode>(index));
updateConfig(config);
syncClangTidyWidgets(config);
}
void ClangDiagnosticConfigsWidget::onClangTidyItemChanged(QListWidgetItem *item)
{
const QString prefix = item->text();
ClangDiagnosticConfig config = currentConfig();
QString checks = config.clangTidyChecks();
QString checks = config.clangTidyChecksPrefixes();
item->checkState() == Qt::Checked
? checks.append(',' + prefix)
: checks.remove(',' + prefix);
config.setClangTidyChecks(checks);
config.setClangTidyChecksPrefixes(checks);
updateConfig(config);
}
void ClangDiagnosticConfigsWidget::onClangTidyLineEdited(const QString &text)
{
ClangDiagnosticConfig config = currentConfig();
config.setClangTidyChecksString(text);
updateConfig(config);
}
@@ -271,9 +286,35 @@ void ClangDiagnosticConfigsWidget::syncClangTidyWidgets(const ClangDiagnosticCon
{
disconnectClangTidyItemChanged();
const QString tidyChecks = config.clangTidyChecks();
for (int row = 0; row < m_tidyChecks->checksList->count(); ++row) {
QListWidgetItem *item = m_tidyChecks->checksList->item(row);
ClangDiagnosticConfig::TidyMode tidyMode = config.clangTidyMode();
m_tidyChecks->tidyMode->setCurrentIndex(static_cast<int>(tidyMode));
switch (tidyMode) {
case ClangDiagnosticConfig::TidyMode::Disabled:
case ClangDiagnosticConfig::TidyMode::File:
m_tidyChecks->checksString->setVisible(false);
m_tidyChecks->checksListWrapper->setCurrentIndex(1);
break;
case ClangDiagnosticConfig::TidyMode::ChecksString:
m_tidyChecks->checksString->setVisible(true);
m_tidyChecks->checksListWrapper->setCurrentIndex(1);
m_tidyChecks->checksString->setText(config.clangTidyChecksString());
break;
case ClangDiagnosticConfig::TidyMode::ChecksPrefixList:
m_tidyChecks->checksString->setVisible(false);
m_tidyChecks->checksListWrapper->setCurrentIndex(0);
syncTidyChecksList(config);
break;
}
connectClangTidyItemChanged();
}
void ClangDiagnosticConfigsWidget::syncTidyChecksList(const ClangDiagnosticConfig &config)
{
const QString tidyChecks = config.clangTidyChecksPrefixes();
for (int row = 0; row < m_tidyChecks->checksPrefixesList->count(); ++row) {
QListWidgetItem *item = m_tidyChecks->checksPrefixesList->item(row);
Qt::ItemFlags flags = item->flags();
flags |= Qt::ItemIsUserCheckable;
@@ -288,8 +329,6 @@ void ClangDiagnosticConfigsWidget::syncClangTidyWidgets(const ClangDiagnosticCon
else
item->setCheckState(Qt::Unchecked);
}
connectClangTidyItemChanged();
}
void ClangDiagnosticConfigsWidget::syncClazyWidgets(const ClangDiagnosticConfig &config)
@@ -362,14 +401,26 @@ void ClangDiagnosticConfigsWidget::updateValidityWidgets(const QString &errorMes
void ClangDiagnosticConfigsWidget::connectClangTidyItemChanged()
{
connect(m_tidyChecks->checksList, &QListWidget::itemChanged,
connect(m_tidyChecks->tidyMode,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&ClangDiagnosticConfigsWidget::onClangTidyModeChanged);
connect(m_tidyChecks->checksPrefixesList, &QListWidget::itemChanged,
this, &ClangDiagnosticConfigsWidget::onClangTidyItemChanged);
connect(m_tidyChecks->checksString, &QLineEdit::textEdited,
this, &ClangDiagnosticConfigsWidget::onClangTidyLineEdited);
}
void ClangDiagnosticConfigsWidget::disconnectClangTidyItemChanged()
{
disconnect(m_tidyChecks->checksList, &QListWidget::itemChanged,
disconnect(m_tidyChecks->tidyMode,
static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged),
this,
&ClangDiagnosticConfigsWidget::onClangTidyModeChanged);
disconnect(m_tidyChecks->checksPrefixesList, &QListWidget::itemChanged,
this, &ClangDiagnosticConfigsWidget::onClangTidyItemChanged);
disconnect(m_tidyChecks->checksString, &QLineEdit::textEdited,
this, &ClangDiagnosticConfigsWidget::onClangTidyLineEdited);
}
void ClangDiagnosticConfigsWidget::connectClazyRadioButtonClicked(QRadioButton *button)

View File

@@ -76,7 +76,9 @@ private:
void onCurrentConfigChanged(int);
void onCopyButtonClicked();
void onRemoveButtonClicked();
void onClangTidyModeChanged(int index);
void onClangTidyItemChanged(QListWidgetItem *item);
void onClangTidyLineEdited(const QString &text);
void onClazyRadioButtonChanged(bool checked);
void onDiagnosticOptionsEdited();
@@ -86,6 +88,7 @@ private:
void syncOtherWidgetsToComboBox();
void syncClangTidyWidgets(const ClangDiagnosticConfig &config);
void syncClazyWidgets(const ClangDiagnosticConfig &config);
void syncTidyChecksList(const ClangDiagnosticConfig &config);
void updateConfig(const CppTools::ClangDiagnosticConfig &config);

View File

@@ -55,9 +55,15 @@ static QString clangDiagnosticConfigsArrayDisplayNameKey()
static QString clangDiagnosticConfigsArrayWarningsKey()
{ return QLatin1String("diagnosticOptions"); }
static QString clangDiagnosticConfigsArrayClangTidyChecksKey()
static QString clangDiagnosticConfigsArrayClangTidyChecksPrefixesKey()
{ return QLatin1String("clangTidyChecks"); }
static QString clangDiagnosticConfigsArrayClangTidyChecksStringKey()
{ return QLatin1String("clangTidyChecksString"); }
static QString clangDiagnosticConfigsArrayClangTidyModeKey()
{ return QLatin1String("clangTidyMode"); }
static QString clangDiagnosticConfigsArrayClazyChecksKey()
{ return QLatin1String("clazyChecks"); }
@@ -88,7 +94,12 @@ static ClangDiagnosticConfigs customDiagnosticConfigsFromSettings(QSettings *s)
config.setId(Core::Id::fromSetting(s->value(clangDiagnosticConfigsArrayIdKey())));
config.setDisplayName(s->value(clangDiagnosticConfigsArrayDisplayNameKey()).toString());
config.setClangOptions(s->value(clangDiagnosticConfigsArrayWarningsKey()).toStringList());
config.setClangTidyChecks(s->value(clangDiagnosticConfigsArrayClangTidyChecksKey()).toString());
config.setClangTidyMode(static_cast<ClangDiagnosticConfig::TidyMode>(
s->value(clangDiagnosticConfigsArrayClangTidyModeKey()).toInt()));
config.setClangTidyChecksPrefixes(
s->value(clangDiagnosticConfigsArrayClangTidyChecksPrefixesKey()).toString());
config.setClangTidyChecksString(
s->value(clangDiagnosticConfigsArrayClangTidyChecksStringKey()).toString());
config.setClazyChecks(s->value(clangDiagnosticConfigsArrayClazyChecksKey()).toString());
configs.append(config);
}
@@ -144,7 +155,12 @@ void CppCodeModelSettings::toSettings(QSettings *s)
s->setValue(clangDiagnosticConfigsArrayIdKey(), config.id().toSetting());
s->setValue(clangDiagnosticConfigsArrayDisplayNameKey(), config.displayName());
s->setValue(clangDiagnosticConfigsArrayWarningsKey(), config.clangOptions());
s->setValue(clangDiagnosticConfigsArrayClangTidyChecksKey(), config.clangTidyChecks());
s->setValue(clangDiagnosticConfigsArrayClangTidyModeKey(),
static_cast<int>(config.clangTidyMode()));
s->setValue(clangDiagnosticConfigsArrayClangTidyChecksPrefixesKey(),
config.clangTidyChecksPrefixes());
s->setValue(clangDiagnosticConfigsArrayClangTidyChecksStringKey(),
config.clangTidyChecksString());
s->setValue(clangDiagnosticConfigsArrayClazyChecksKey(), config.clazyChecks());
}
s->endArray();

View File

@@ -15,99 +15,192 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_2">
<property name="leftMargin">
<number>0</number>
<number>9</number>
</property>
<property name="topMargin">
<number>0</number>
<number>9</number>
</property>
<property name="rightMargin">
<number>0</number>
<number>9</number>
</property>
<property name="bottomMargin">
<number>0</number>
<number>9</number>
</property>
<item>
<widget class="QListWidget" name="checksList">
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<property name="text">
<string notr="true">android-*</string>
</property>
<widget class="QComboBox" name="tidyMode">
<item>
<property name="text">
<string>Disable</string>
</property>
</item>
<item>
<property name="text">
<string>Select Clang-Tidy prefixes</string>
</property>
</item>
<item>
<property name="text">
<string>Provide Clang-Tidy checks string</string>
</property>
</item>
<item>
<property name="text">
<string>Use .clang-tidy config file</string>
</property>
</item>
</widget>
</item>
<item>
<property name="text">
<string notr="true">boost-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">bugprone-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">cert-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">cppcoreguidelines-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">clang-analyzer-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">clang-diagnostic-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">google-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">hicpp-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">llvm-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">misc-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">modernize-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">mpi-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">objc-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">performance-*</string>
</property>
</item>
<item>
<property name="text">
<string notr="true">readability-*</string>
</property>
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
</item>
</layout>
</item>
<item>
<widget class="QLineEdit" name="checksString"/>
</item>
<item>
<widget class="QStackedWidget" name="checksListWrapper">
<widget class="QWidget" name="checksPage">
<layout class="QVBoxLayout" name="verticalLayout">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<widget class="QListWidget" name="checksPrefixesList">
<item>
<property name="text">
<string>android-*</string>
</property>
</item>
<item>
<property name="text">
<string>boost-*</string>
</property>
</item>
<item>
<property name="text">
<string>bugprone-*</string>
</property>
</item>
<item>
<property name="text">
<string>cert-*</string>
</property>
</item>
<item>
<property name="text">
<string>cppcoreguidelines-*</string>
</property>
</item>
<item>
<property name="text">
<string>clang-analyzer-*</string>
</property>
</item>
<item>
<property name="text">
<string>clang-diagnostic-*</string>
</property>
</item>
<item>
<property name="text">
<string>google-*</string>
</property>
</item>
<item>
<property name="text">
<string>hicpp-*</string>
</property>
</item>
<item>
<property name="text">
<string>llvm-*</string>
</property>
</item>
<item>
<property name="text">
<string>misc-*</string>
</property>
</item>
<item>
<property name="text">
<string>modernize-*</string>
</property>
</item>
<item>
<property name="text">
<string>mpi-*</string>
</property>
</item>
<item>
<property name="text">
<string>objc-*</string>
</property>
</item>
<item>
<property name="text">
<string>performance-*</string>
</property>
</item>
<item>
<property name="text">
<string>readability-*</string>
</property>
</item>
</widget>
</item>
</layout>
</widget>
<widget class="QWidget" name="empltyPage">
<layout class="QVBoxLayout" name="verticalLayout_3">
<property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number>
</property>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>237</height>
</size>
</property>
</spacer>
</item>
</layout>
</widget>
</widget>
</item>
</layout>