[clang] First PR to llvm, adding feature for issue (PR #123543)
via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 19 19:06:25 PST 2025
https://github.com/Shakil582 created https://github.com/llvm/llvm-project/pull/123543
resolves #43831
I'll test it a bit more tomorrow. I think I saw something weird with the --offset functionality when testing, but my additions worked for the test cases I gave it.
>From 4dc0383b366b3105aa879732332062eb2902b213 Mon Sep 17 00:00:00 2001
From: Shakil Usman <shak582 at gmail.com>
Date: Sun, 19 Jan 2025 21:41:50 -0500
Subject: [PATCH 1/2] 43831 added off on feature to clang
---
clang/tools/clang-format/ClangFormat.cpp | 155 +++++++++++++++++++++++
1 file changed, 155 insertions(+)
diff --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp
index 28610052b9b74a..e5c70979483e24 100644
--- a/clang/tools/clang-format/ClangFormat.cpp
+++ b/clang/tools/clang-format/ClangFormat.cpp
@@ -26,6 +26,12 @@
#include "llvm/Support/InitLLVM.h"
#include "llvm/Support/Process.h"
#include <fstream>
+#include <iostream>
+#include <llvm/ADT/STLExtras.h>
+#include <llvm/ADT/StringRef.h>
+#include <llvm/Frontend/OpenMP/OMPConstants.h>
+#include <llvm/MC/MCAsmMacro.h>
+#include <sys/stat.h>
using namespace llvm;
using clang::tooling::Replacements;
@@ -214,6 +220,9 @@ static cl::opt<bool> ListIgnored("list-ignored",
cl::desc("List ignored files."),
cl::cat(ClangFormatCategory), cl::Hidden);
+static SmallVector<std::string> OnWords;
+static SmallVector<std::string> OffWords;
+
namespace clang {
namespace format {
@@ -277,6 +286,8 @@ static bool fillRanges(MemoryBuffer *Code,
return false;
}
+
+
if (Offsets.empty())
Offsets.push_back(0);
if (Offsets.size() != Lengths.size() &&
@@ -307,6 +318,139 @@ static bool fillRanges(MemoryBuffer *Code,
unsigned Length = Sources.getFileOffset(End) - Offset;
Ranges.push_back(tooling::Range(Offset, Length));
}
+
+ std::cout << "Printing ranges " << "\n";
+ for (const auto& i : Ranges)
+ {
+ std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
+ }
+
+ if (!OnWords.empty() && !OffWords.empty())
+ {
+ StringRef CodeRef = Code->getBuffer();
+ std::set<size_t> OnSet;
+ if (Ranges.empty())
+ {
+ OnSet.insert(0);
+ } else {
+ OnSet.insert(Ranges[0].getOffset());
+ }
+ std::set<size_t> OffSet;
+ std::cout << "OFF" << "\n";
+ if (Ranges.size() == 1 && Ranges[0].getOffset() == 0 && Ranges[0].getLength() == CodeRef.size())
+ {
+ Ranges.pop_back();
+ }
+ for (const auto& Word : OffWords)
+ {
+ std::cout << Word << "\n";
+ size_t TempOffset = CodeRef.find(Word);
+ while (TempOffset != StringRef::npos)
+ {
+ std::cout << "found offword at " << TempOffset << "\n";
+ if (TempOffset > *OnSet.begin())
+ {
+ OffSet.insert(TempOffset);
+ }
+ TempOffset = CodeRef.find(Word, TempOffset + 1);
+ }
+ }
+
+ std::cout << "ON" << "\n";
+ for (const auto& Word : OnWords)
+ {
+ std::cout << Word << "\n";
+ size_t TempOffset = CodeRef.find(Word);
+ while (TempOffset != StringRef::npos)
+ {
+ std::cout << "found onword at " << TempOffset << "\n";
+ OnSet.insert(TempOffset);
+ TempOffset = CodeRef.find(Word, TempOffset + 1);
+ }
+ }
+
+ std::cout << "Printing ranges " << "\n";
+ for (const auto& i : Ranges)
+ {
+ std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
+ }
+
+ std::cout << "Entering while" << "\n";
+ while (!OnSet.empty())
+ {
+ size_t Offset = OnSet.extract(OnSet.begin()).value();
+ size_t Length;
+ if (!OffSet.empty())
+ {
+ Length = OffSet.extract(OffSet.begin()).value() - Offset;
+ }
+ else
+ {
+ Length = CodeRef.size() - Offset;
+ }
+
+ std::cout << Offset << " " << Offset + Length << std::endl;
+ // Could result in loss of data
+ tooling::Range NewRange = {static_cast<unsigned>(Offset), static_cast<unsigned>(Length)};
+
+ /*bool inserted = false;
+ for (auto i = Ranges.begin(); i != Ranges.end(); ++i)
+ {
+ if (i->overlapsWith(NewRange))
+ {
+ std::cout << "Overlap erasure" << std::endl;
+ tooling::Range Temp(std::min(NewRange.getOffset(), i->getOffset()), std::max(NewRange.getLength(), i->getLength()));
+ std::cout << "Old range" << "\n";
+ std::cout << i->getOffset() << " " << i->getOffset() + i->getLength() << "\n";
+ std::cout << "New range before insert " << "\n";
+ std::cout << NewRange.getOffset() << " " << NewRange.getOffset() + NewRange.getLength() << "\n";
+ Ranges.erase(i);
+ Ranges.insert(i, Temp);
+ inserted = true;
+ std::cout << "After" << "\n";
+ std::cout << Temp.getOffset() << " " << Temp.getOffset() + Temp.getLength() << "\n";
+ }
+ }
+ if (!inserted)
+ {*/
+ Ranges.push_back(NewRange);
+ //}
+ }
+ }
+
+ std::sort(Ranges.begin(), Ranges.end(), [](const tooling::Range& a, const tooling::Range& b) {
+ return a.getOffset() + a.getLength() < b.getOffset() + b.getLength();
+ });
+
+ std::cout << "Printing ranges " << "\n";
+ for (const auto& i : Ranges)
+ {
+ std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
+ }
+
+ auto start = Ranges.begin();
+ for (auto i = Ranges.begin()+1; i != Ranges.end(); ++i)
+ {
+ std::cout << "Loop" << "\n";
+ std::cout << &(*start) << "\n" << &(*i) << "\n";
+ if (start->getOffset() + start->getLength() >= i->getOffset())
+ {
+ std::cout << "Element erased\n";
+ tooling::Range Temp(std::min(start->getOffset(), i->getOffset()), std::max(start->getLength(), i->getLength()));
+ Ranges.erase(start, i+1);
+ start = Ranges.insert(start, Temp);
+ i = start;
+ } else {
+ ++start;
+ }
+ }
+
+ std::cout << "Printing ranges " << Ranges.size() << "\n";
+ for (const auto& i : Ranges)
+ {
+ std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
+ }
+
return false;
}
@@ -646,6 +790,17 @@ static bool isIgnored(StringRef FilePath) {
const auto Pathname{convert_to_slash(AbsPath)};
for (const auto &Pat : Patterns) {
+
+ if (Pat.slice(0, 3).equals_insensitive("on:"))
+ {
+ OnWords.push_back(Pat.slice(3, Pat.size()).trim().str());
+ continue;
+ }
+ if (Pat.slice(0, 4).equals_insensitive("off:"))
+ {
+ OffWords.push_back(Pat.slice(4, Pat.size()).trim().str());
+ continue;
+ }
const bool IsNegated = Pat[0] == '!';
StringRef Pattern{Pat};
if (IsNegated)
>From 4f2cb81ec29e5d6abc787c5b8ba409929c85b547 Mon Sep 17 00:00:00 2001
From: Shakil Usman <shak582 at gmail.com>
Date: Sun, 19 Jan 2025 21:59:05 -0500
Subject: [PATCH 2/2] 43831 clang-formatted clang-format
---
clang/tools/clang-format/ClangFormat.cpp | 137 ++++++-----------------
1 file changed, 33 insertions(+), 104 deletions(-)
diff --git a/clang/tools/clang-format/ClangFormat.cpp b/clang/tools/clang-format/ClangFormat.cpp
index e5c70979483e24..64af04ef4c007c 100644
--- a/clang/tools/clang-format/ClangFormat.cpp
+++ b/clang/tools/clang-format/ClangFormat.cpp
@@ -286,8 +286,6 @@ static bool fillRanges(MemoryBuffer *Code,
return false;
}
-
-
if (Offsets.empty())
Offsets.push_back(0);
if (Offsets.size() != Lengths.size() &&
@@ -319,125 +317,64 @@ static bool fillRanges(MemoryBuffer *Code,
Ranges.push_back(tooling::Range(Offset, Length));
}
- std::cout << "Printing ranges " << "\n";
- for (const auto& i : Ranges)
- {
- std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
- }
-
- if (!OnWords.empty() && !OffWords.empty())
- {
+ if (!OnWords.empty() && !OffWords.empty()) {
StringRef CodeRef = Code->getBuffer();
std::set<size_t> OnSet;
- if (Ranges.empty())
- {
- OnSet.insert(0);
- } else {
- OnSet.insert(Ranges[0].getOffset());
- }
+ if (Ranges.empty())
+ OnSet.insert(0);
+ else
+ OnSet.insert(Ranges[0].getOffset());
std::set<size_t> OffSet;
- std::cout << "OFF" << "\n";
- if (Ranges.size() == 1 && Ranges[0].getOffset() == 0 && Ranges[0].getLength() == CodeRef.size())
- {
+ if (Ranges.size() == 1 && Ranges[0].getOffset() == 0 &&
+ Ranges[0].getLength() == CodeRef.size()) {
Ranges.pop_back();
}
- for (const auto& Word : OffWords)
- {
- std::cout << Word << "\n";
+
+ for (const auto &Word : OffWords) {
size_t TempOffset = CodeRef.find(Word);
- while (TempOffset != StringRef::npos)
- {
- std::cout << "found offword at " << TempOffset << "\n";
+ while (TempOffset != StringRef::npos) {
if (TempOffset > *OnSet.begin())
- {
- OffSet.insert(TempOffset);
- }
+ OffSet.insert(TempOffset);
TempOffset = CodeRef.find(Word, TempOffset + 1);
}
}
- std::cout << "ON" << "\n";
- for (const auto& Word : OnWords)
- {
- std::cout << Word << "\n";
+ for (const auto &Word : OnWords) {
size_t TempOffset = CodeRef.find(Word);
- while (TempOffset != StringRef::npos)
- {
- std::cout << "found onword at " << TempOffset << "\n";
+ while (TempOffset != StringRef::npos) {
OnSet.insert(TempOffset);
TempOffset = CodeRef.find(Word, TempOffset + 1);
}
}
- std::cout << "Printing ranges " << "\n";
- for (const auto& i : Ranges)
- {
- std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
- }
-
- std::cout << "Entering while" << "\n";
- while (!OnSet.empty())
- {
+ while (!OnSet.empty()) {
size_t Offset = OnSet.extract(OnSet.begin()).value();
size_t Length;
if (!OffSet.empty())
- {
Length = OffSet.extract(OffSet.begin()).value() - Offset;
- }
else
- {
Length = CodeRef.size() - Offset;
- }
- std::cout << Offset << " " << Offset + Length << std::endl;
// Could result in loss of data
- tooling::Range NewRange = {static_cast<unsigned>(Offset), static_cast<unsigned>(Length)};
-
- /*bool inserted = false;
- for (auto i = Ranges.begin(); i != Ranges.end(); ++i)
- {
- if (i->overlapsWith(NewRange))
- {
- std::cout << "Overlap erasure" << std::endl;
- tooling::Range Temp(std::min(NewRange.getOffset(), i->getOffset()), std::max(NewRange.getLength(), i->getLength()));
- std::cout << "Old range" << "\n";
- std::cout << i->getOffset() << " " << i->getOffset() + i->getLength() << "\n";
- std::cout << "New range before insert " << "\n";
- std::cout << NewRange.getOffset() << " " << NewRange.getOffset() + NewRange.getLength() << "\n";
- Ranges.erase(i);
- Ranges.insert(i, Temp);
- inserted = true;
- std::cout << "After" << "\n";
- std::cout << Temp.getOffset() << " " << Temp.getOffset() + Temp.getLength() << "\n";
- }
- }
- if (!inserted)
- {*/
+ tooling::Range NewRange = {static_cast<unsigned>(Offset),
+ static_cast<unsigned>(Length)};
+
Ranges.push_back(NewRange);
- //}
}
}
- std::sort(Ranges.begin(), Ranges.end(), [](const tooling::Range& a, const tooling::Range& b) {
- return a.getOffset() + a.getLength() < b.getOffset() + b.getLength();
- });
-
- std::cout << "Printing ranges " << "\n";
- for (const auto& i : Ranges)
- {
- std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
- }
+ std::sort(Ranges.begin(), Ranges.end(),
+ [](const tooling::Range &a, const tooling::Range &b) {
+ return a.getOffset() + a.getLength() <
+ b.getOffset() + b.getLength();
+ });
auto start = Ranges.begin();
- for (auto i = Ranges.begin()+1; i != Ranges.end(); ++i)
- {
- std::cout << "Loop" << "\n";
- std::cout << &(*start) << "\n" << &(*i) << "\n";
- if (start->getOffset() + start->getLength() >= i->getOffset())
- {
- std::cout << "Element erased\n";
- tooling::Range Temp(std::min(start->getOffset(), i->getOffset()), std::max(start->getLength(), i->getLength()));
- Ranges.erase(start, i+1);
+ for (auto i = Ranges.begin() + 1; i != Ranges.end(); ++i) {
+ if (start->getOffset() + start->getLength() >= i->getOffset()) {
+ tooling::Range Temp(std::min(start->getOffset(), i->getOffset()),
+ std::max(start->getLength(), i->getLength()));
+ Ranges.erase(start, i + 1);
start = Ranges.insert(start, Temp);
i = start;
} else {
@@ -445,12 +382,6 @@ static bool fillRanges(MemoryBuffer *Code,
}
}
- std::cout << "Printing ranges " << Ranges.size() << "\n";
- for (const auto& i : Ranges)
- {
- std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
- }
-
return false;
}
@@ -791,15 +722,13 @@ static bool isIgnored(StringRef FilePath) {
const auto Pathname{convert_to_slash(AbsPath)};
for (const auto &Pat : Patterns) {
- if (Pat.slice(0, 3).equals_insensitive("on:"))
- {
- OnWords.push_back(Pat.slice(3, Pat.size()).trim().str());
- continue;
+ if (Pat.slice(0, 3).equals_insensitive("on:")) {
+ OnWords.push_back(Pat.slice(3, Pat.size()).trim().str());
+ continue;
}
- if (Pat.slice(0, 4).equals_insensitive("off:"))
- {
- OffWords.push_back(Pat.slice(4, Pat.size()).trim().str());
- continue;
+ if (Pat.slice(0, 4).equals_insensitive("off:")) {
+ OffWords.push_back(Pat.slice(4, Pat.size()).trim().str());
+ continue;
}
const bool IsNegated = Pat[0] == '!';
StringRef Pattern{Pat};
More information about the cfe-commits
mailing list