[clang] [clang-format] Do not update cursor pos if no includes replacement (PR #77456)

via cfe-commits cfe-commits at lists.llvm.org
Fri Jan 19 10:41:19 PST 2024


https://github.com/NorthBlue333 updated https://github.com/llvm/llvm-project/pull/77456

>From 490343ec3461a8a3a5703198f6b9af57a853ef24 Mon Sep 17 00:00:00 2001
From: NorthBlue333 <north333 at free.fr>
Date: Tue, 9 Jan 2024 14:01:14 +0100
Subject: [PATCH] [clang-format] Do not update cursor pos if no includes
 replacement

---
 clang/lib/Format/Format.cpp                 | 15 ++++++----
 clang/unittests/Format/SortIncludesTest.cpp | 32 +++++++++++++++++++--
 2 files changed, 39 insertions(+), 8 deletions(-)

diff --git a/clang/lib/Format/Format.cpp b/clang/lib/Format/Format.cpp
index 7c2f4dcf3d2308..81ec3b245e0d95 100644
--- a/clang/lib/Format/Format.cpp
+++ b/clang/lib/Format/Format.cpp
@@ -3121,6 +3121,7 @@ static void sortCppIncludes(const FormatStyle &Style,
   }
 
   std::string result;
+  unsigned NewCursor = UINT_MAX;
   for (unsigned Index : Indices) {
     if (!result.empty()) {
       result += "\n";
@@ -3132,20 +3133,24 @@ 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(
-                                 IncludesBeginOffset, IncludesBlockSize)))) {
+                    IncludesBeginOffset, IncludesBlockSize)))) {
     return;
   }
 
+  if (Cursor) {
+    if (UINT_MAX != NewCursor)
+      *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 ec142e03b12854..e73770a21e87b5 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,32 @@ 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, DeduplicateIncludes) {
   EXPECT_EQ("#include <a>\n"
             "#include <b>\n"



More information about the cfe-commits mailing list