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();