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 <shak...@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 <shak...@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}; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits