ClangFormat: Regenerate clangformatchecks

- Regenerated clangformatchecks for clang-format-16
- Updated clangformatconfigwidget for using new clangformatchecks

Fixes: QTCREATORBUG-29434
Change-Id: If308942b6fbe4cc2568acda6d421139175ac081a
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
Artem Sokolovskii
2023-08-02 16:00:49 +02:00
parent f63c4857b8
commit 0d3e66a5b8
3 changed files with 565 additions and 418 deletions

View File

@@ -3,6 +3,7 @@
#include "clangformatconfigwidget.h"
// the file below was generated by scripts/generateClangFormatChecksLayout.py
#include "clangformatchecks.h"
#include "clangformatconstants.h"
#include "clangformatfile.h"
@@ -10,8 +11,6 @@
#include "clangformattr.h"
#include "clangformatutils.h"
// the file was generated by scripts/generateClangFormatChecksLayout.py
#include <coreplugin/icore.h>
#include <cppeditor/cppcodestylepreferences.h>
@@ -245,77 +244,6 @@ void ClangFormatConfigWidget::updatePreview()
d->preview->textDocument()->autoIndent(cursor);
}
static inline void ltrim(std::string &s)
{
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](int ch) { return !std::isspace(ch); }));
}
static inline void rtrim(std::string &s)
{
s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return !std::isspace(ch); }).base(),
s.end());
}
static inline void trim(std::string &s)
{
ltrim(s);
rtrim(s);
}
static void fillPlainText(QPlainTextEdit *plainText, const std::string &text, size_t index)
{
if (index == std::string::npos) {
plainText->setPlainText("");
return;
}
size_t valueStart = text.find('\n', index + 1);
size_t valueEnd;
std::string value;
QTC_ASSERT(valueStart != std::string::npos, return;);
do {
valueEnd = text.find('\n', valueStart + 1);
if (valueEnd == std::string::npos)
break;
// Skip also 2 spaces - start with valueStart + 1 + 2.
std::string line = text.substr(valueStart + 3, valueEnd - valueStart - 3);
rtrim(line);
value += value.empty() ? line : '\n' + line;
valueStart = valueEnd;
} while (valueEnd < text.size() - 1 && text.at(valueEnd + 1) == ' ');
plainText->setPlainText(QString::fromStdString(value));
}
static void fillComboBoxOrLineEdit(QObject *object, const std::string &text, size_t index)
{
auto *comboBox = qobject_cast<QComboBox *>(object);
auto *lineEdit = qobject_cast<QLineEdit *>(object);
if (index == std::string::npos) {
if (comboBox)
comboBox->setCurrentIndex(0);
else
lineEdit->setText("");
return;
}
const size_t valueStart = text.find(':', index + 1);
QTC_ASSERT(valueStart != std::string::npos, return;);
const size_t valueEnd = text.find('\n', valueStart + 1);
QTC_ASSERT(valueEnd != std::string::npos, return;);
std::string value = text.substr(valueStart + 1, valueEnd - valueStart - 1);
trim(value);
if (comboBox) {
if (comboBox->findText(QString::fromStdString(value)) == -1) {
comboBox->setCurrentIndex(0);
return;
}
comboBox->setCurrentText(QString::fromStdString(value));
return;
}
lineEdit->setText(QString::fromStdString(value));
}
std::string ClangFormatConfigWidget::readFile(const QString &path)
{
const std::string defaultStyle = clang::format::configurationAsText(qtcStyle());
@@ -348,11 +276,55 @@ std::string ClangFormatConfigWidget::readFile(const QString &path)
return settings;
}
static std::map<QString, QString> getMapFromString(const QString &text)
{
std::map<QString, QString> objectNameMap;
QString parentName;
for (QString line : text.split('\n')) {
if (line.isEmpty())
continue;
QStringList list = line.split(':');
QString key = !list.isEmpty() ? list[0] : "";
QString value = line.mid(key.size() + 1).trimmed();
if (line.contains(':') && value.isEmpty()) {
parentName = key;
continue;
}
if (!value.isEmpty() && !line.startsWith(" "))
parentName = "";
if (line.startsWith(" - ") || line.startsWith(" ")) {
line.remove(0, 2);
if (objectNameMap.find(parentName) == objectNameMap.end())
objectNameMap[parentName] = line + "\n";
else
objectNameMap[parentName] += line + "\n";
continue;
}
if (line.startsWith(" ")) {
key.remove(0, 2);
key = parentName + key;
objectNameMap.insert(std::make_pair(key, value));
continue;
}
objectNameMap.insert(std::make_pair(key, value));
}
return objectNameMap;
}
void ClangFormatConfigWidget::fillTable()
{
Utils::GuardLocker locker(d->ignoreChanges);
const std::string configText = readFile(d->config->filePath().path());
const QString configText = QString::fromStdString(readFile(d->config->filePath().path()));
std::map<QString, QString> objectNameMap = getMapFromString(configText);
for (QObject *child : d->checksWidget->children()) {
if (!qobject_cast<QComboBox *>(child) && !qobject_cast<QLineEdit *>(child)
@@ -360,14 +332,27 @@ void ClangFormatConfigWidget::fillTable()
continue;
}
size_t index = configText.find('\n' + child->objectName().toStdString());
if (index == std::string::npos)
index = configText.find("\n " + child->objectName().toStdString());
if (objectNameMap.find(child->objectName()) == objectNameMap.end())
continue;
if (qobject_cast<QPlainTextEdit *>(child))
fillPlainText(qobject_cast<QPlainTextEdit *>(child), configText, index);
else
fillComboBoxOrLineEdit(child, configText, index);
if (QPlainTextEdit *plainText = qobject_cast<QPlainTextEdit *>(child)) {
plainText->setPlainText(objectNameMap[child->objectName()]);
continue;
}
if (QComboBox *comboBox = qobject_cast<QComboBox *>(child)) {
if (comboBox->findText(objectNameMap[child->objectName()]) == -1) {
comboBox->setCurrentIndex(0);
} else {
comboBox->setCurrentText(objectNameMap[child->objectName()]);
}
continue;
}
if (QLineEdit *lineEdit = qobject_cast<QLineEdit *>(child)) {
lineEdit->setText(objectNameMap[child->objectName()]);
continue;
}
}
}
@@ -378,6 +363,7 @@ void ClangFormatConfigWidget::saveChanges(QObject *sender)
d->config->setBasedOnStyle(basedOnStyle->currentText());
} else {
QList<ClangFormatFile::Field> fields;
QString parentName;
for (QObject *child : d->checksWidget->children()) {
if (child->objectName() == "BasedOnStyle")
@@ -386,13 +372,31 @@ void ClangFormatConfigWidget::saveChanges(QObject *sender)
if (!label)
continue;
QWidget *valueWidget = d->checksWidget->findChild<QWidget *>(label->text().trimmed());
if (!valueWidget) {
// reset parent name if label starts without " "
if (!label->text().startsWith(" "))
parentName = "";
QList<QWidget *> valueWidgets = d->checksWidget->findChildren<QWidget *>(
parentName + label->text().trimmed());
if (valueWidgets.empty()) {
// Currently BraceWrapping only.
fields.append({label->text(), ""});
// save parent name
parentName = label->text().trimmed();
continue;
}
QWidget *valueWidget = valueWidgets.first();
if (valueWidgets.size() > 1) {
for (QWidget *w : valueWidgets) {
if (w->objectName() == parentName + label->text().trimmed()) {
valueWidget = w;
break;
}
}
}
if (!qobject_cast<QComboBox *>(valueWidget) && !qobject_cast<QLineEdit *>(valueWidget)
&& !qobject_cast<QPlainTextEdit *>(valueWidget)) {
continue;
@@ -403,7 +407,6 @@ void ClangFormatConfigWidget::saveChanges(QObject *sender)
if (plainText->toPlainText().trimmed().isEmpty())
continue;
std::stringstream content;
QStringList list = plainText->toPlainText().split('\n');
for (const QString &line : list)