From 8f1a9ea6d72bdf390552ce62d09e691103dca6a4 Mon Sep 17 00:00:00 2001 From: Artem Sokolovskii Date: Wed, 29 Jun 2022 09:59:58 +0000 Subject: [PATCH] Revert "ClangFormat: Remove format while typing feature" This reverts commit 323ba720db49d76e135f509a0782ff7486a5b52e. Reason for revert: The feature is needed Change-Id: Iaf09ef91c49ff0c85c1b5906a1c1464bd8e4cae6 Reviewed-by: Christian Kandeler --- src/plugins/clangformat/clangformatbaseindenter.cpp | 12 ++++++++++++ src/plugins/clangformat/tests/clangformat-test.cpp | 12 ++++++------ src/plugins/clangformat/tests/clangformat-test.h | 4 ++-- 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/plugins/clangformat/clangformatbaseindenter.cpp b/src/plugins/clangformat/clangformatbaseindenter.cpp index 900d910dc39..b9ee78b50ef 100644 --- a/src/plugins/clangformat/clangformatbaseindenter.cpp +++ b/src/plugins/clangformat/clangformatbaseindenter.cpp @@ -594,6 +594,18 @@ Utils::Text::Replacements ClangFormatBaseIndenter::indentsFor(QTextBlock startBl const QByteArray buffer = m_doc->toPlainText().toUtf8(); ReplacementsToKeep replacementsToKeep = ReplacementsToKeep::OnlyIndent; + if (formatCodeInsteadOfIndent() + && (cursorPositionInEditor == -1 || cursorPositionInEditor >= startBlockPosition) + && (typedChar == ';' || typedChar == '}')) { + // Format before current position only in case the cursor is inside the indented block. + // So if cursor position is less then the block position then the current line is before + // the indented block - don't trigger extra formatting in this case. + // cursorPositionInEditor == -1 means the condition matches automatically. + + // Format only before complete statement not to break code. + replacementsToKeep = ReplacementsToKeep::IndentAndBefore; + } + return replacements(buffer, startBlock, endBlock, diff --git a/src/plugins/clangformat/tests/clangformat-test.cpp b/src/plugins/clangformat/tests/clangformat-test.cpp index af066963c79..174a3d11705 100644 --- a/src/plugins/clangformat/tests/clangformat-test.cpp +++ b/src/plugins/clangformat/tests/clangformat-test.cpp @@ -471,7 +471,7 @@ void ClangFormatTest::testIndentAfterFunctionBodyAndNotFormatBefore() void ClangFormatTest::testReformatToEmptyFunction() { insertLines({"int foo(int a, int b, int c, int d)", "{", " ", "}"}); - m_extendedIndenter->format({{1, 4}}); + m_extendedIndenter->indentBlock(m_doc->findBlockByNumber(3), '}', TextEditor::TabSettings()); QCOMPARE(documentLines(), (std::vector{"int foo(int a, int b, int c, int d) {}"})); } @@ -483,10 +483,10 @@ void ClangFormatTest::testReformatToNonEmptyFunction() QCOMPARE(documentLines(), (std::vector{"int foo(int a, int b) {", " ", "}"})); } -void ClangFormatTest::testFormatClosingScope() +void ClangFormatTest::testIndentClosingScopeAndFormatBeforeIt() { insertLines({"if(a && b", " &&c && d", " ) {", "", "}"}); - m_extendedIndenter->format({{1, 5}}); + m_extendedIndenter->indentBlock(m_doc->findBlockByNumber(4), '}', TextEditor::TabSettings()); QCOMPARE(documentLines(), (std::vector{"if (a && b && c && d) {", "}"})); } @@ -504,17 +504,17 @@ void ClangFormatTest::testOnlyIndentIncompleteStatementOnElectricalCharacter() QCOMPARE(documentLines(), (std::vector{"{bar();", " foo()", "}"})); } -void ClangFormatTest::testFormatCompleteStatementOnSemicolon() +void ClangFormatTest::testIndentAndFormatCompleteStatementOnSemicolon() { insertLines({"{bar();", "foo();", "}"}); - m_extendedIndenter->format({{1, 3}}); + m_extendedIndenter->indentBlock(m_doc->findBlockByNumber(1), ';', TextEditor::TabSettings(), 14); QCOMPARE(documentLines(), (std::vector{"{", " bar();", " foo();", "}"})); } void ClangFormatTest::testIndentAndFormatCompleteStatementOnClosingScope() { insertLines({"{bar();", "foo();", "}"}); - m_extendedIndenter->format({{1, 3}}); + m_extendedIndenter->indentBlock(m_doc->findBlockByNumber(1), '}', TextEditor::TabSettings(), 16); QCOMPARE(documentLines(), (std::vector{"{", " bar();", " foo();", "}"})); } diff --git a/src/plugins/clangformat/tests/clangformat-test.h b/src/plugins/clangformat/tests/clangformat-test.h index ed7c3b16a1f..094657d1b01 100644 --- a/src/plugins/clangformat/tests/clangformat-test.h +++ b/src/plugins/clangformat/tests/clangformat-test.h @@ -90,10 +90,10 @@ private slots: void testIndentAfterFunctionBodyAndNotFormatBefore(); void testReformatToEmptyFunction(); void testReformatToNonEmptyFunction(); - void testFormatClosingScope(); + void testIndentClosingScopeAndFormatBeforeIt(); void testDoNotFormatAfterTheFirstColon(); void testOnlyIndentIncompleteStatementOnElectricalCharacter(); - void testFormatCompleteStatementOnSemicolon(); + void testIndentAndFormatCompleteStatementOnSemicolon(); void testIndentAndFormatCompleteStatementOnClosingScope(); void testOnlyIndentClosingParenthesis(); void testEquallyIndentInsideParenthesis();