aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangformat
diff options
context:
space:
mode:
authorArtem Sokolovskii <artem.sokolovskii@qt.io>2022-05-06 12:18:28 +0200
committerArtem Sokolovskii <artem.sokolovskii@qt.io>2022-05-16 07:00:07 +0000
commitb634ec77fc25705fb85c1531fa7fc09615697742 (patch)
tree9d52eb564869cdb6804040d6a6705db36931d4ce /src/plugins/clangformat
parentab66f81a6150b8548984e6dd50caf0d89f8c8a87 (diff)
ClangFormat: Fix override checkbox doesn't affect behavior
Override checkbox allows use clangFormat settings from widget even if there is .clang-format file in file's folder or parent folder. It works for global settings and for project settings. Change-Id: I03152f4b0e1b62b3ac038024e76cc9082fa37ec3 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Diffstat (limited to 'src/plugins/clangformat')
-rw-r--r--src/plugins/clangformat/clangformatbaseindenter.cpp59
-rw-r--r--src/plugins/clangformat/clangformatconfigwidget.cpp76
-rw-r--r--src/plugins/clangformat/clangformatconfigwidget.h5
3 files changed, 82 insertions, 58 deletions
diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp
index ff990044a0..b9ee78b50e 100644
--- a/src/plugins/clangformat/clangformatbaseindenter.cpp
+++ b/src/plugins/clangformat/clangformatbaseindenter.cpp
@@ -25,10 +25,15 @@
#include "clangformatbaseindenter.h"
#include "clangformatconstants.h"
+#include "clangformatsettings.h"
#include "clangformatutils.h"
+
#include <coreplugin/icore.h>
-#include <texteditor/texteditorsettings.h>
+#include <projectexplorer/editorconfiguration.h>
+#include <projectexplorer/project.h>
+#include <projectexplorer/session.h>
#include <texteditor/icodestylepreferences.h>
+#include <texteditor/texteditorsettings.h>
#include <clang/Tooling/Core/Replacement.h>
@@ -731,31 +736,43 @@ void ClangFormatBaseIndenter::autoIndent(const QTextCursor &cursor,
clang::format::FormatStyle ClangFormatBaseIndenter::styleForFile() const
{
- llvm::Expected<clang::format::FormatStyle> style
+ llvm::Expected<clang::format::FormatStyle> styleFromProjectFolder
= clang::format::getStyle("file", m_fileName.path().toStdString(), "none");
- if (style) {
- if (*style == clang::format::getNoStyle()) {
- Utils::FilePath filePath = filePathToCurrentSettings(
- TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences());
-
- if (!filePath.exists())
- return qtcStyle();
-
- clang::format::FormatStyle style;
- style.Language = clang::format::FormatStyle::LK_Cpp;
- const std::error_code error
- = clang::format::parseConfiguration(filePath.fileContents().toStdString(), &style);
- QTC_ASSERT(error.value() == static_cast<int>(clang::format::ParseError::Success),
- return qtcStyle());
+ const ProjectExplorer::Project *projectForFile
+ = ProjectExplorer::SessionManager::projectForFile(m_fileName);
+ const bool overrideStyleFile
+ = projectForFile ? projectForFile->namedSettings(Constants::OVERRIDE_FILE_ID).toBool()
+ : ClangFormatSettings::instance().overrideDefaultFile();
+ const TextEditor::ICodeStylePreferences *preferences
+ = projectForFile
+ ? projectForFile->editorConfiguration()->codeStyle("Cpp")->currentPreferences()
+ : TextEditor::TextEditorSettings::codeStyle("Cpp")->currentPreferences();
+
+ if (overrideStyleFile || !styleFromProjectFolder
+ || *styleFromProjectFolder == clang::format::getNoStyle()) {
+ Utils::FilePath filePath = filePathToCurrentSettings(preferences);
+
+ if (!filePath.exists())
+ return qtcStyle();
+
+ clang::format::FormatStyle currentSettingsStyle;
+ currentSettingsStyle.Language = clang::format::FormatStyle::LK_Cpp;
+ const std::error_code error
+ = clang::format::parseConfiguration(filePath.fileContents().toStdString(),
+ &currentSettingsStyle);
+ QTC_ASSERT(error.value() == static_cast<int>(clang::format::ParseError::Success),
+ return qtcStyle());
+
+ return currentSettingsStyle;
+ }
- return style;
- }
- addQtcStatementMacros(*style);
- return *style;
+ if (styleFromProjectFolder) {
+ addQtcStatementMacros(*styleFromProjectFolder);
+ return *styleFromProjectFolder;
}
- handleAllErrors(style.takeError(), [](const llvm::ErrorInfoBase &) {
+ handleAllErrors(styleFromProjectFolder.takeError(), [](const llvm::ErrorInfoBase &) {
// do nothing
});
diff --git a/src/plugins/clangformat/clangformatconfigwidget.cpp b/src/plugins/clangformat/clangformatconfigwidget.cpp
index 1e1719e608..b58d346981 100644
--- a/src/plugins/clangformat/clangformatconfigwidget.cpp
+++ b/src/plugins/clangformat/clangformatconfigwidget.cpp
@@ -92,7 +92,6 @@ static bool isBeautifierOnSaveActivated()
static int indentIndex() { return 0; }
static int formatIndex() { return 1; }
-
bool ClangFormatConfigWidget::eventFilter(QObject *object, QEvent *event)
{
if (event->type() == QEvent::Wheel && qobject_cast<QComboBox *>(object)) {
@@ -111,27 +110,14 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
, m_ui(std::make_unique<Ui::ClangFormatConfigWidget>())
{
m_ui->setupUi(this);
- setEnabled(!codeStyle->isReadOnly());
-
m_config = std::make_unique<ClangFormatFile>(filePathToCurrentSettings(codeStyle),
codeStyle->isReadOnly());
- initChecksAndPreview();
- showCombobox();
+ initChecksAndPreview(!codeStyle->isReadOnly());
+ initOverrideCheckBox();
+ initIndentationOrFormattingCombobox();
- if (m_project) {
- m_ui->overrideDefault->setChecked(
- m_project->namedSettings(Constants::OVERRIDE_FILE_ID).toBool());
- } else {
- m_ui->overrideDefault->setChecked(ClangFormatSettings::instance().overrideDefaultFile());
- m_ui->overrideDefault->setToolTip(
- tr("Override Clang Format configuration file with the fallback configuration."));
- }
-
- connect(m_ui->overrideDefault, &QCheckBox::toggled,
- this, &ClangFormatConfigWidget::showOrHideWidgets);
showOrHideWidgets();
-
fillTable();
updatePreview();
@@ -140,13 +126,14 @@ ClangFormatConfigWidget::ClangFormatConfigWidget(TextEditor::ICodeStylePreferenc
ClangFormatConfigWidget::~ClangFormatConfigWidget() = default;
-void ClangFormatConfigWidget::initChecksAndPreview()
+void ClangFormatConfigWidget::initChecksAndPreview(bool enabled)
{
m_checksScrollArea = new QScrollArea();
m_checksWidget = new QWidget;
m_checks->setupUi(m_checksWidget);
m_checksScrollArea->setWidget(m_checksWidget);
m_checksScrollArea->setMaximumWidth(500);
+ m_checksWidget->setEnabled(enabled);
m_ui->horizontalLayout_2->addWidget(m_checksScrollArea);
@@ -171,6 +158,29 @@ void ClangFormatConfigWidget::initChecksAndPreview()
m_preview->textDocument()->indenter()->setFileName(fileName);
}
+void ClangFormatConfigWidget::initOverrideCheckBox()
+{
+ if (m_project) {
+ m_ui->overrideDefault->setChecked(
+ m_project->namedSettings(Constants::OVERRIDE_FILE_ID).toBool());
+ } else {
+ m_ui->overrideDefault->setChecked(ClangFormatSettings::instance().overrideDefaultFile());
+ m_ui->overrideDefault->setToolTip(
+ tr("Override Clang Format configuration file with the fallback configuration."));
+ }
+
+ connect(m_ui->overrideDefault, &QCheckBox::toggled,
+ this, &ClangFormatConfigWidget::showOrHideWidgets);
+ connect(m_ui->overrideDefault, &QCheckBox::toggled, this, [this](bool checked) {
+ if (m_project)
+ m_project->setNamedSettings(Constants::OVERRIDE_FILE_ID, checked);
+ else {
+ ClangFormatSettings::instance().setOverrideDefaultFile(checked);
+ ClangFormatSettings::instance().write();
+ }
+ });
+}
+
void ClangFormatConfigWidget::connectChecks()
{
for (QObject *child : m_checksWidget->children()) {
@@ -198,7 +208,7 @@ void ClangFormatConfigWidget::onTableChanged()
saveChanges(sender());
}
-void ClangFormatConfigWidget::showCombobox()
+void ClangFormatConfigWidget::initIndentationOrFormattingCombobox()
{
m_ui->indentingOrFormatting->insertItem(indentIndex(), tr("Indenting only"));
m_ui->indentingOrFormatting->insertItem(formatIndex(), tr("Full formatting"));
@@ -209,6 +219,17 @@ void ClangFormatConfigWidget::showCombobox()
m_ui->indentingOrFormatting->setCurrentIndex(indentIndex());
m_ui->indentingOrFormatting->show();
+
+ connect(m_ui->indentingOrFormatting, &QComboBox::currentIndexChanged, this, [](int index) {
+ ClangFormatSettings &settings = ClangFormatSettings::instance();
+ const bool isFormatting = index == formatIndex();
+ settings.setFormatCodeInsteadOfIndent(isFormatting);
+
+ if (!isBeautifierOnSaveActivated())
+ settings.setFormatOnSave(isFormatting);
+
+ settings.write();
+ });
}
static bool projectConfigExists()
@@ -435,22 +456,7 @@ void ClangFormatConfigWidget::synchronize()
void ClangFormatConfigWidget::apply()
{
- ClangFormatSettings &settings = ClangFormatSettings::instance();
- const bool isFormatting = m_ui->indentingOrFormatting->currentIndex()
- == formatIndex();
- settings.setFormatCodeInsteadOfIndent(isFormatting);
- settings.setOverrideDefaultFile(m_ui->overrideDefault->isChecked());
-
- if (!isBeautifierOnSaveActivated()) {
- settings.setFormatOnSave(isFormatting);
- }
-
- if (m_project) {
- m_project->setNamedSettings(Constants::OVERRIDE_FILE_ID, m_ui->overrideDefault->isChecked());
- }
- settings.write();
-
- if (!m_checksWidget->isVisible())
+ if (!m_checksWidget->isVisible() && !m_checksWidget->isEnabled())
return;
saveChanges(this);
diff --git a/src/plugins/clangformat/clangformatconfigwidget.h b/src/plugins/clangformat/clangformatconfigwidget.h
index 9a46089250..52a5a94bc1 100644
--- a/src/plugins/clangformat/clangformatconfigwidget.h
+++ b/src/plugins/clangformat/clangformatconfigwidget.h
@@ -63,13 +63,14 @@ private:
bool eventFilter(QObject *object, QEvent *event) override;
void showOrHideWidgets();
- void initChecksAndPreview();
+ void initChecksAndPreview(bool enabled);
+ void initOverrideCheckBox();
void connectChecks();
void fillTable();
void saveChanges(QObject *sender);
- void showCombobox();
+ void initIndentationOrFormattingCombobox();
void updatePreview();
ProjectExplorer::Project *m_project;