[clang] [clang-format] Do not update cursor pos if no includes replacement (PR #77456)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Mar 26 03:51:36 PDT 2024
https://github.com/NorthBlue333 updated https://github.com/llvm/llvm-project/pull/77456
>From d4fd95374a82361e3dbfcd7a5d87c37da4542d2b Mon Sep 17 00:00:00 2001
From: NorthBlue333 <north333 at free.fr>
Date: Tue, 9 Jan 2024 14:01:14 +0100
Subject: [PATCH 1/2] [clang-format] Do not update cursor pos if no includes
replacement
---
clang/lib/Format/Format.cpp | 13 +++--
clang/unittests/Format/SortIncludesTest.cpp | 61 ++++++++++++++++++++-
2 files changed, 67 insertions(+), 7 deletions(-)
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 46ed5baaeacead..17a3e0c9cfd733 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -3115,6 +3115,7 @@ static void sortCppIncludes(const FormatStyle &Style,
}
std::string result;
+ unsigned NewCursor = UINT_MAX;
for (unsigned Index : Indices) {
if (!result.empty()) {
result += "\n";
@@ -3126,13 +3127,10 @@ static void sortCppIncludes(const FormatStyle &Style,
}
result += Includes[Index].Text;
if (Cursor && CursorIndex == Index)
- *Cursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
+ NewCursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
CurrentCategory = Includes[Index].Category;
}
- if (Cursor && *Cursor >= IncludesEndOffset)
- *Cursor += result.size() - IncludesBlockSize;
-
// If the #includes are out of order, we generate a single replacement fixing
// the entire range of blocks. Otherwise, no replacement is generated.
if (replaceCRLF(result) == replaceCRLF(std::string(Code.substr(
@@ -3140,6 +3138,13 @@ static void sortCppIncludes(const FormatStyle &Style,
return;
}
+ if (Cursor) {
+ if (NewCursor != UINT_MAX)
+ *Cursor = NewCursor;
+ else if (*Cursor >= IncludesEndOffset)
+ *Cursor += result.size() - IncludesBlockSize;
+ }
+
auto Err = Replaces.add(tooling::Replacement(
FileName, Includes.front().Offset, IncludesBlockSize, result));
// FIXME: better error handling. For now, just skip the replacement for the
diff --git a/clang/unittests/Format/SortIncludesTest.cpp b/clang/unittests/Format/SortIncludesTest.cpp
index 772eb53806b4b1..939ad181a9d707 100644
--- a/clang/unittests/Format/SortIncludesTest.cpp
+++ b/clang/unittests/Format/SortIncludesTest.cpp
@@ -6,19 +6,19 @@
//
//===----------------------------------------------------------------------===//
-#include "FormatTestUtils.h"
+#include "FormatTestBase.h"
#include "clang/Format/Format.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/Debug.h"
#include "gtest/gtest.h"
-#define DEBUG_TYPE "format-test"
+#define DEBUG_TYPE "sort-includes-test"
namespace clang {
namespace format {
namespace {
-class SortIncludesTest : public ::testing::Test {
+class SortIncludesTest : public test::FormatTestBase {
protected:
std::vector<tooling::Range> GetCodeRange(StringRef Code) {
return std::vector<tooling::Range>(1, tooling::Range(0, Code.size()));
@@ -821,6 +821,61 @@ TEST_F(SortIncludesTest, CalculatesCorrectCursorPositionWithRegrouping) {
EXPECT_EQ(27u, newCursor(Code, 28)); // Start of last line
}
+TEST_F(SortIncludesTest,
+ CalculatesCorrectCursorPositionWhenNoReplacementsWithRegroupingAndCRLF) {
+ Style.IncludeBlocks = Style.IBS_Regroup;
+ FmtStyle.LineEnding = FormatStyle::LE_CRLF;
+ Style.IncludeCategories = {
+ {"^\"a\"", 0, 0, false}, {"^\"b\"", 1, 1, false}, {".*", 2, 2, false}};
+ std::string Code = "#include \"a\"\r\n" // Start of line: 0
+ "\r\n" // Start of line: 14
+ "#include \"b\"\r\n" // Start of line: 16
+ "\r\n" // Start of line: 30
+ "#include \"c\"\r\n" // Start of line: 32
+ "\r\n" // Start of line: 46
+ "int i;"; // Start of line: 48
+ verifyNoChange(Code);
+ EXPECT_EQ(0u, newCursor(Code, 0));
+ EXPECT_EQ(14u, newCursor(Code, 14));
+ EXPECT_EQ(16u, newCursor(Code, 16));
+ EXPECT_EQ(30u, newCursor(Code, 30));
+ EXPECT_EQ(32u, newCursor(Code, 32));
+ EXPECT_EQ(46u, newCursor(Code, 46));
+ EXPECT_EQ(48u, newCursor(Code, 48));
+}
+
+TEST_F(
+ SortIncludesTest,
+ CalculatesCorrectCursorPositionWhenRemoveLinesReplacementsWithRegroupingAndCRLF) {
+ Style.IncludeBlocks = Style.IBS_Regroup;
+ FmtStyle.LineEnding = FormatStyle::LE_CRLF;
+ Style.IncludeCategories = {{".*", 0, 0, false}};
+ std::string Code = "#include \"a\"\r\n" // Start of line: 0
+ "\r\n" // Start of line: 14
+ "#include \"b\"\r\n" // Start of line: 16
+ "\r\n" // Start of line: 30
+ "#include \"c\"\r\n" // Start of line: 32
+ "\r\n" // Start of line: 46
+ "int i;"; // Start of line: 48
+ std::string Expected = "#include \"a\"\r\n" // Start of line: 0
+ "#include \"b\"\r\n" // Start of line: 14
+ "#include \"c\"\r\n" // Start of line: 28
+ "\r\n" // Start of line: 42
+ "int i;"; // Start of line: 44
+ EXPECT_EQ(Expected, sort(Code));
+ EXPECT_EQ(0u, newCursor(Code, 0));
+ EXPECT_EQ(
+ 14u,
+ newCursor(Code, 14)); // cursor on empty line in include block is ignored
+ EXPECT_EQ(14u, newCursor(Code, 16));
+ EXPECT_EQ(
+ 30u,
+ newCursor(Code, 30)); // cursor on empty line in include block is ignored
+ EXPECT_EQ(28u, newCursor(Code, 32));
+ EXPECT_EQ(42u, newCursor(Code, 46));
+ EXPECT_EQ(44u, newCursor(Code, 48));
+}
+
TEST_F(SortIncludesTest, DeduplicateIncludes) {
EXPECT_EQ("#include <a>\n"
"#include <b>\n"
>From e3e725bc0559bfb9e7ea67086fff6fc169942504 Mon Sep 17 00:00:00 2001
From: NorthBlue333 <north333 at free.fr>
Date: Tue, 26 Mar 2024 11:44:37 +0100
Subject: [PATCH 2/2] [clang-format] Do not update cursor pos if no includes
replacement
---
clang/lib/Format/Format.cpp | 16 +++---
clang/unittests/Format/SortIncludesTest.cpp | 58 +++++++++++++++++++++
2 files changed, 65 insertions(+), 9 deletions(-)
diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 17a3e0c9cfd733..9a331270ebf83e 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -3114,8 +3114,8 @@ static void sortCppIncludes(const FormatStyle &Style,
return;
}
+ const auto OldCursor = Cursor ? *Cursor : 0;
std::string result;
- unsigned NewCursor = UINT_MAX;
for (unsigned Index : Indices) {
if (!result.empty()) {
result += "\n";
@@ -3127,24 +3127,22 @@ static void sortCppIncludes(const FormatStyle &Style,
}
result += Includes[Index].Text;
if (Cursor && CursorIndex == Index)
- NewCursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
+ *Cursor = IncludesBeginOffset + result.size() - CursorToEOLOffset;
CurrentCategory = Includes[Index].Category;
}
+ if (Cursor && *Cursor >= IncludesEndOffset)
+ *Cursor += result.size() - IncludesBlockSize;
+
// If the #includes are out of order, we generate a single replacement fixing
// the entire range of blocks. Otherwise, no replacement is generated.
if (replaceCRLF(result) == replaceCRLF(std::string(Code.substr(
IncludesBeginOffset, IncludesBlockSize)))) {
+ if (Cursor)
+ Cursor = OldCursor;
return;
}
- if (Cursor) {
- if (NewCursor != UINT_MAX)
- *Cursor = NewCursor;
- else if (*Cursor >= IncludesEndOffset)
- *Cursor += result.size() - IncludesBlockSize;
- }
-
auto Err = Replaces.add(tooling::Replacement(
FileName, Includes.front().Offset, IncludesBlockSize, result));
// FIXME: better error handling. For now, just skip the replacement for the
diff --git a/clang/unittests/Format/SortIncludesTest.cpp b/clang/unittests/Format/SortIncludesTest.cpp
index 939ad181a9d707..791ab7bb185ed9 100644
--- a/clang/unittests/Format/SortIncludesTest.cpp
+++ b/clang/unittests/Format/SortIncludesTest.cpp
@@ -876,6 +876,64 @@ TEST_F(
EXPECT_EQ(44u, newCursor(Code, 48));
}
+TEST_F(
+ SortIncludesTest,
+ CalculatesCorrectCursorPositionWhenNewLineReplacementsWithRegroupingAndCRLF) {
+ Style.IncludeBlocks = Style.IBS_Regroup;
+ FmtStyle.LineEnding = FormatStyle::LE_CRLF;
+ Style.IncludeCategories = {
+ {"^\"a\"", 0, 0, false}, {"^\"b\"", 1, 1, false}, {".*", 2, 2, false}};
+ std::string Code = "#include \"a\"\r\n" // Start of line: 0
+ "#include \"b\"\r\n" // Start of line: 14
+ "#include \"c\"\r\n" // Start of line: 28
+ "\r\n" // Start of line: 42
+ "int i;"; // Start of line: 44
+ std::string Expected = "#include \"a\"\r\n" // Start of line: 0
+ "\r\n" // Start of line: 14
+ "#include \"b\"\r\n" // Start of line: 16
+ "\r\n" // Start of line: 30
+ "#include \"c\"\r\n" // Start of line: 32
+ "\r\n" // Start of line: 46
+ "int i;"; // Start of line: 48
+ EXPECT_EQ(Expected, sort(Code));
+ EXPECT_EQ(0u, newCursor(Code, 0));
+ EXPECT_EQ(15u, newCursor(Code, 16));
+ EXPECT_EQ(30u, newCursor(Code, 32));
+ EXPECT_EQ(44u, newCursor(Code, 46));
+ EXPECT_EQ(46u, newCursor(Code, 48));
+}
+
+TEST_F(
+ SortIncludesTest,
+ CalculatesCorrectCursorPositionWhenNoNewLineReplacementsWithRegroupingAndCRLF) {
+ Style.IncludeBlocks = Style.IBS_Regroup;
+ FmtStyle.LineEnding = FormatStyle::LE_CRLF;
+ Style.IncludeCategories = {
+ {"^\"a\"", 0, 0, false}, {"^\"b\"", 1, 1, false}, {".*", 2, 2, false}};
+ std::string Code = "#include \"a\"\r\n" // Start of line: 0
+ "\r\n" // Start of line: 14
+ "#include \"c\"\r\n" // Start of line: 16
+ "\r\n" // Start of line: 30
+ "#include \"b\"\r\n" // Start of line: 32
+ "\r\n" // Start of line: 46
+ "int i;"; // Start of line: 48
+ std::string Expected = "#include \"a\"\r\n" // Start of line: 0
+ "\r\n" // Start of line: 14
+ "#include \"b\"\r\n" // Start of line: 16
+ "\r\n" // Start of line: 30
+ "#include \"c\"\r\n" // Start of line: 32
+ "\r\n" // Start of line: 46
+ "int i;"; // Start of line: 48
+ EXPECT_EQ(Expected, sort(Code));
+ EXPECT_EQ(0u, newCursor(Code, 0));
+ EXPECT_EQ(14u, newCursor(Code, 14));
+ EXPECT_EQ(30u, newCursor(Code, 32));
+ EXPECT_EQ(30u, newCursor(Code, 30));
+ EXPECT_EQ(15u, newCursor(Code, 15));
+ EXPECT_EQ(44u, newCursor(Code, 46));
+ EXPECT_EQ(46u, newCursor(Code, 48));
+}
+
TEST_F(SortIncludesTest, DeduplicateIncludes) {
EXPECT_EQ("#include <a>\n"
"#include <b>\n"
More information about the cfe-commits
mailing list