From a39119669c3c040c612416fb88a0366e0852f2f3 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 30 Jun 2023 15:16:28 +0200 Subject: [PATCH] CppEditor: Format quickfix code only if formatting is enabled ... in the ClangFormat settings (rather than the default of just indenting). As opposed to files generated by the wizard, quickfixes are often touching existing code, and since ClangFormat works on line granularity, users will experience unexpected re-formattings when ClangFormat is in indent- only mode. Therefore, do the formatting only if the user has enabled it in the ClangFormat settings. Change-Id: Icb30f166f2b6fb94113a8f25c4a5f92ff8bca9b0 Reviewed-by: David Schulz Reviewed-by: Qt CI Bot --- src/plugins/clangformat/clangformatbaseindenter.cpp | 11 ++++++++++- src/plugins/clangformat/clangformatbaseindenter.h | 3 ++- src/plugins/clangformat/clangformatindenter.cpp | 4 ++-- src/plugins/clangformat/clangformatindenter.h | 3 ++- src/plugins/cppeditor/cppcodestylesettings.cpp | 3 +++ src/plugins/cppeditor/cppcodestylesettings.h | 4 ++++ src/plugins/cppeditor/cppeditordocument.cpp | 2 +- src/plugins/cppeditor/cppquickfix_test.cpp | 6 ++++++ src/plugins/texteditor/indenter.h | 4 +++- src/plugins/texteditor/refactoringchanges.cpp | 8 +++++++- 10 files changed, 40 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 92dd9aea4d5..76979bda123 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -8,6 +8,7 @@ #include #include +#include #include #include @@ -538,8 +539,16 @@ Utils::Text::Replacements ClangFormatBaseIndenter::replacements(QByteArray buffe } Utils::Text::Replacements ClangFormatBaseIndenter::format( - const TextEditor::RangesInLines &rangesInLines) + const TextEditor::RangesInLines &rangesInLines, FormattingMode mode) { + bool doFormatting = mode == FormattingMode::Forced || formatCodeInsteadOfIndent(); +#ifdef WITH_TESTS + doFormatting = doFormatting || CppEditor::CppToolsSettings::instance()->cppCodeStyle() + ->codeStyleSettings().forceFormatting; +#endif + if (!doFormatting) + return {}; + QTC_ASSERT(!m_fileName.isEmpty(), return {}); if (rangesInLines.empty()) return Utils::Text::Replacements(); diff --git a/src/plugins/clangformat/clangformatbaseindenter.h b/src/plugins/clangformat/clangformatbaseindenter.h index 1f0674dec57..6330d757290 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.h +++ b/src/plugins/clangformat/clangformatbaseindenter.h @@ -31,7 +31,8 @@ public: void autoIndent(const QTextCursor &cursor, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; - Utils::Text::Replacements format(const TextEditor::RangesInLines &rangesInLines) override; + Utils::Text::Replacements format(const TextEditor::RangesInLines &rangesInLines, + FormattingMode mode = FormattingMode::Forced) override; void indentBlock(const QTextBlock &block, const QChar &typedChar, diff --git a/src/plugins/clangformat/clangformatindenter.cpp b/src/plugins/clangformat/clangformatindenter.cpp index f9cb80cd26d..2da8a95ad36 100644 --- a/src/plugins/clangformat/clangformatindenter.cpp +++ b/src/plugins/clangformat/clangformatindenter.cpp @@ -174,9 +174,9 @@ void ClangFormatForwardingIndenter::autoIndent(const QTextCursor &cursor, } Utils::Text::Replacements ClangFormatForwardingIndenter::format( - const TextEditor::RangesInLines &rangesInLines) + const TextEditor::RangesInLines &rangesInLines, FormattingMode mode) { - return currentIndenter()->format(rangesInLines); + return currentIndenter()->format(rangesInLines, mode); } diff --git a/src/plugins/clangformat/clangformatindenter.h b/src/plugins/clangformat/clangformatindenter.h index d0f460aec0d..5e6aca135ef 100644 --- a/src/plugins/clangformat/clangformatindenter.h +++ b/src/plugins/clangformat/clangformatindenter.h @@ -40,7 +40,8 @@ public: void autoIndent(const QTextCursor &cursor, const TextEditor::TabSettings &tabSettings, int cursorPositionInEditor = -1) override; - Utils::Text::Replacements format(const TextEditor::RangesInLines &rangesInLines) override; + Utils::Text::Replacements format(const TextEditor::RangesInLines &rangesInLines, + FormattingMode mode) override; bool formatOnSave() const override; TextEditor::IndentationForBlock indentationForBlocks(const QVector &blocks, const TextEditor::TabSettings &tabSettings, diff --git a/src/plugins/cppeditor/cppcodestylesettings.cpp b/src/plugins/cppeditor/cppcodestylesettings.cpp index 3a705091411..0fafad5a071 100644 --- a/src/plugins/cppeditor/cppcodestylesettings.cpp +++ b/src/plugins/cppeditor/cppcodestylesettings.cpp @@ -128,6 +128,9 @@ bool CppCodeStyleSettings::equals(const CppCodeStyleSettings &rhs) const && extraPaddingForConditionsIfConfusingAlign == rhs.extraPaddingForConditionsIfConfusingAlign && alignAssignments == rhs.alignAssignments && preferGetterNameWithoutGetPrefix == rhs.preferGetterNameWithoutGetPrefix +#ifdef WITH_TESTS + && forceFormatting == rhs.forceFormatting +#endif ; } diff --git a/src/plugins/cppeditor/cppcodestylesettings.h b/src/plugins/cppeditor/cppcodestylesettings.h index 08f1dc1ff26..74de7df83af 100644 --- a/src/plugins/cppeditor/cppcodestylesettings.h +++ b/src/plugins/cppeditor/cppcodestylesettings.h @@ -62,6 +62,10 @@ public: // CppEditor/QuickFixSetting. Remove in 4.16 bool preferGetterNameWithoutGetPrefix = true; +#ifdef WITH_TESTS + bool forceFormatting = false; +#endif + QVariantMap toMap() const; void fromMap(const QVariantMap &map); diff --git a/src/plugins/cppeditor/cppeditordocument.cpp b/src/plugins/cppeditor/cppeditordocument.cpp index 0398674941c..9e7856b74b2 100644 --- a/src/plugins/cppeditor/cppeditordocument.cpp +++ b/src/plugins/cppeditor/cppeditordocument.cpp @@ -467,7 +467,7 @@ bool CppEditorDocument::saveImpl(QString *errorString, const FilePath &filePath, if (!editedRanges.empty()) { QTextCursor cursor(document()); cursor.joinPreviousEditBlock(); - indenter()->format(editedRanges); + indenter()->format(editedRanges, Indenter::FormattingMode::Forced); cursor.endEditBlock(); } diff --git a/src/plugins/cppeditor/cppquickfix_test.cpp b/src/plugins/cppeditor/cppquickfix_test.cpp index 9651ddb214f..369e07a1348 100644 --- a/src/plugins/cppeditor/cppquickfix_test.cpp +++ b/src/plugins/cppeditor/cppquickfix_test.cpp @@ -5392,7 +5392,13 @@ SpaceBeforeParens: Always CppTestDocument::create("file.cpp", origSource, expectedSource)}); InsertDefsFromDecls factory; factory.setMode(InsertDefsFromDecls::Mode::Impl); + CppCodeStylePreferences * const prefs = CppToolsSettings::instance()->cppCodeStyle(); + const CppCodeStyleSettings settings = prefs->codeStyleSettings(); + CppCodeStyleSettings tempSettings = settings; + tempSettings.forceFormatting = true; + prefs->setCodeStyleSettings(tempSettings); QuickFixOperationTest(testDocuments, &factory, {}, {}, {}, clangFormatSettings); + prefs->setCodeStyleSettings(settings); } // Function for one of InsertDeclDef section cases diff --git a/src/plugins/texteditor/indenter.h b/src/plugins/texteditor/indenter.h index 80c2aa5d16f..11c6aa87d8b 100644 --- a/src/plugins/texteditor/indenter.h +++ b/src/plugins/texteditor/indenter.h @@ -70,7 +70,9 @@ public: indent(cursor, QChar::Null, tabSettings, cursorPositionInEditor); } - virtual Utils::Text::Replacements format(const RangesInLines & /*rangesInLines*/) + enum class FormattingMode { Forced, Settings }; + virtual Utils::Text::Replacements format(const RangesInLines &, + FormattingMode = FormattingMode::Forced) { return Utils::Text::Replacements(); } diff --git a/src/plugins/texteditor/refactoringchanges.cpp b/src/plugins/texteditor/refactoringchanges.cpp index 1b03a07e01f..c432e224302 100644 --- a/src/plugins/texteditor/refactoringchanges.cpp +++ b/src/plugins/texteditor/refactoringchanges.cpp @@ -473,7 +473,13 @@ void RefactoringFile::doFormatting() b = b.next(); } } - m_editor->textDocument()->indenter()->format(formattingRanges); + + // TODO: The proper solution seems to be to call formatOrIndent() here (and not + // use hardcoded indent regions anymore), but that would require intrusive changes + // to the C++ quickfixes and tests, where we rely on the built-in indenter behavior. + m_editor->textDocument()->indenter()->format(formattingRanges, + Indenter::FormattingMode::Settings); + for (QTextBlock b = m_editor->document()->findBlockByNumber( formattingRanges.front().startLine - 1); b.isValid(); b = b.next()) { QString blockText = b.text();