diff --git a/kdevplatform/util/formattinghelpers.h b/kdevplatform/util/formattinghelpers.h index fe1efa4558..a79360b03e 100644 --- a/kdevplatform/util/formattinghelpers.h +++ b/kdevplatform/util/formattinghelpers.h @@ -1,47 +1,47 @@ /* This file is part of KDevelop * Copyright 2011 David Nolden This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; see the file COPYING. If not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ #ifndef KDEVPLATFORM_FORMATTINGHELPERS_H #define KDEVPLATFORM_FORMATTINGHELPERS_H #include "utilexport.h" #include namespace KDevelop { /** * Helps extracting a re-formatted version of a text fragment, within a specific left and right context. * The re-formatting must be an operation which only changes whitespace, and keeps whitespace boundaries * between identifiers intact. If this is not the case, the original text is returned. * * @param formattedMergedText The re-formatted merged text: format(leftContext + text + rightContext) * @param text The text fragment of which the re-formatted version will be returned * @param leftContext The left context of the text fragment * @param rightContext The right context of the text fragment * @param tabWidth The width of one tab, required while matching tabs vs. spaces * @param fuzzyCharacters Characters which are ignored in case of mismatches * * @return The re-formatted version of @p text * */ KDEVPLATFORMUTIL_EXPORT QString extractFormattedTextFromContext(const QString& formattedMergedText, const QString& text, const QString& leftContext, const QString& rightContext, int tabWidth = 4, - const QString& fuzzyCharacters = QStringLiteral( "{}()/*\\" )); + const QString& fuzzyCharacters = QStringLiteral( "{}()/*\\\"" )); } #endif // KDEVPLATFORM_FORMATTINGHELPERS_H diff --git a/kdevplatform/util/tests/test_formattinghelpers.cpp b/kdevplatform/util/tests/test_formattinghelpers.cpp index 4876e25067..59881e9651 100644 --- a/kdevplatform/util/tests/test_formattinghelpers.cpp +++ b/kdevplatform/util/tests/test_formattinghelpers.cpp @@ -1,129 +1,145 @@ /* * Copyright 2019 Bernd Buschinski * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License or (at your option) version 3 or any later version * accepted by the membership of KDE e.V. (or its successor approved * by the membership of KDE e.V.), which shall act as a proxy * defined in Section 14 of version 3 of the license. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include "test_formattinghelpers.h" #include "formattinghelpers.h" #include #include QTEST_MAIN(TestFormattingHelpers) using namespace KDevelop; void TestFormattingHelpers::testFuzzyMatching() { QFETCH(QString, formattedMergedText); QFETCH(QString, selectedText); QFETCH(QString, leftContext); QFETCH(QString, rightContext); QFETCH(QString, expectedOutput); QString output = extractFormattedTextFromContext(formattedMergedText, selectedText, leftContext, rightContext); QCOMPARE(output, expectedOutput); } void TestFormattingHelpers::testFuzzyMatching_data() { QTest::addColumn("formattedMergedText"); QTest::addColumn("selectedText"); QTest::addColumn("leftContext"); QTest::addColumn("rightContext"); QTest::addColumn("expectedOutput"); QString selectedText = QStringLiteral("void bar() {\nint x;\n}"); QString expectedOutput = QStringLiteral("void bar() {\n int x;\n}"); QTest::newRow("left-indentation-fixed") << QStringLiteral("void foo() {\n int i;\n int j;\n}\n\nvoid bar() {\n int x;\n}") << selectedText << QStringLiteral("void foo() {\nint i;\n\n\nint j;\n}\n\n") << QStringLiteral("") << expectedOutput; QTest::newRow("right-indentation-fixed") << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n int i;\n int j;\n}") << selectedText << QStringLiteral("") << QStringLiteral("\n\nvoid foo() {\nint i;\n\n\nint j;\n}") << expectedOutput; // clang-format can break long comments into multiple lines, adding new "//". - // For the same of readability, the comments in the test are actually not very long. + // For the sake of readability, the comments in the test are actually not very long. QTest::newRow("left-comment-break-fixed") << QStringLiteral("void foo() {\n // very\n // long\n}\n\nvoid bar() {\n int x;\n}") << selectedText << QStringLiteral("void foo() {\n// very long\n}\n\n") << QStringLiteral("") << expectedOutput; QTest::newRow("right-comment-break-fixed") << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n // very\n // long\n}") << selectedText << QStringLiteral("") << QStringLiteral("\n\nvoid foo() {\n// very long\n}") << expectedOutput; QTest::newRow("left-multilinecomment-break-fixed") << QStringLiteral("void foo() {\n /* very\n * long */\n}\n\nvoid bar() {\n int x;\n}") << selectedText << QStringLiteral("void foo() {\n/* very long */\n}\n\n") << QStringLiteral("") << expectedOutput; QTest::newRow("right-multilinecomment-break-fixed") << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n /* very\n * long */\n}") << selectedText << QStringLiteral("") << QStringLiteral("\n\nvoid foo() {\n/* very long */\n}") << expectedOutput; // clang-format can break long macros and add (or remove) "\" QTest::newRow("left-macro-break-removed") << QStringLiteral("#define foo(a,b) a = b\n\nvoid bar() {\n int x;\n}") << selectedText << QStringLiteral("#define foo(a,b) \\ a = b\n\n") << QStringLiteral("") << expectedOutput; QTest::newRow("right-macro-break-removed") << QStringLiteral("void bar() {\n int x;\n}\n\n#define foo(a,b) a = b") << selectedText << QStringLiteral("") << QStringLiteral("\n\n#define foo(a,b) \\ a = b") << expectedOutput; QTest::newRow("left-macro-break-added") << QStringLiteral("#define foo(a,b) \\ a = b\n\nvoid bar() {\n int x;\n}") << selectedText << QStringLiteral("#define foo(a,b) a = b\n\n") << QStringLiteral("") << expectedOutput; QTest::newRow("right-macro-break-added") << QStringLiteral("void bar() {\n int x;\n}\n\n#define foo(a,b) \\ a = b") << selectedText << QStringLiteral("") << QStringLiteral("\n\n#define foo(a,b) a = b") << expectedOutput; + + // clang-format can break long strings into multiple small strings, adding new quotation mark. + // For the sake of readability, the strings in the test are actually not very long. + QTest::newRow("left-string-break-fixed") + << QStringLiteral("void foo() {\n string a = \"very \"\n \"long\";\n}\n\nvoid bar() {\n int x;\n}") + << selectedText + << QStringLiteral("void foo() {\nstring a = \"very long\";\n}\n\n") + << QStringLiteral("") + << expectedOutput; + + QTest::newRow("right-string-break-fixed") + << QStringLiteral("void bar() {\n int x;\n}\n\nvoid foo() {\n string a = \"very \"\n \"long\";\n}") + << selectedText + << QStringLiteral("") + << QStringLiteral("\n\nvoid foo() {\nstring a = \"very long\";\n}") + << expectedOutput; }