Skip to content

Commit 4dc0383

Browse files
committed
43831 added off on feature to clang
1 parent dd42651 commit 4dc0383

File tree

1 file changed

+155
-0
lines changed

1 file changed

+155
-0
lines changed

clang/tools/clang-format/ClangFormat.cpp

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,12 @@
2626
#include "llvm/Support/InitLLVM.h"
2727
#include "llvm/Support/Process.h"
2828
#include <fstream>
29+
#include <iostream>
30+
#include <llvm/ADT/STLExtras.h>
31+
#include <llvm/ADT/StringRef.h>
32+
#include <llvm/Frontend/OpenMP/OMPConstants.h>
33+
#include <llvm/MC/MCAsmMacro.h>
34+
#include <sys/stat.h>
2935

3036
using namespace llvm;
3137
using clang::tooling::Replacements;
@@ -214,6 +220,9 @@ static cl::opt<bool> ListIgnored("list-ignored",
214220
cl::desc("List ignored files."),
215221
cl::cat(ClangFormatCategory), cl::Hidden);
216222

223+
static SmallVector<std::string> OnWords;
224+
static SmallVector<std::string> OffWords;
225+
217226
namespace clang {
218227
namespace format {
219228

@@ -277,6 +286,8 @@ static bool fillRanges(MemoryBuffer *Code,
277286
return false;
278287
}
279288

289+
290+
280291
if (Offsets.empty())
281292
Offsets.push_back(0);
282293
if (Offsets.size() != Lengths.size() &&
@@ -307,6 +318,139 @@ static bool fillRanges(MemoryBuffer *Code,
307318
unsigned Length = Sources.getFileOffset(End) - Offset;
308319
Ranges.push_back(tooling::Range(Offset, Length));
309320
}
321+
322+
std::cout << "Printing ranges " << "\n";
323+
for (const auto& i : Ranges)
324+
{
325+
std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
326+
}
327+
328+
if (!OnWords.empty() && !OffWords.empty())
329+
{
330+
StringRef CodeRef = Code->getBuffer();
331+
std::set<size_t> OnSet;
332+
if (Ranges.empty())
333+
{
334+
OnSet.insert(0);
335+
} else {
336+
OnSet.insert(Ranges[0].getOffset());
337+
}
338+
std::set<size_t> OffSet;
339+
std::cout << "OFF" << "\n";
340+
if (Ranges.size() == 1 && Ranges[0].getOffset() == 0 && Ranges[0].getLength() == CodeRef.size())
341+
{
342+
Ranges.pop_back();
343+
}
344+
for (const auto& Word : OffWords)
345+
{
346+
std::cout << Word << "\n";
347+
size_t TempOffset = CodeRef.find(Word);
348+
while (TempOffset != StringRef::npos)
349+
{
350+
std::cout << "found offword at " << TempOffset << "\n";
351+
if (TempOffset > *OnSet.begin())
352+
{
353+
OffSet.insert(TempOffset);
354+
}
355+
TempOffset = CodeRef.find(Word, TempOffset + 1);
356+
}
357+
}
358+
359+
std::cout << "ON" << "\n";
360+
for (const auto& Word : OnWords)
361+
{
362+
std::cout << Word << "\n";
363+
size_t TempOffset = CodeRef.find(Word);
364+
while (TempOffset != StringRef::npos)
365+
{
366+
std::cout << "found onword at " << TempOffset << "\n";
367+
OnSet.insert(TempOffset);
368+
TempOffset = CodeRef.find(Word, TempOffset + 1);
369+
}
370+
}
371+
372+
std::cout << "Printing ranges " << "\n";
373+
for (const auto& i : Ranges)
374+
{
375+
std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << "\n";
376+
}
377+
378+
std::cout << "Entering while" << "\n";
379+
while (!OnSet.empty())
380+
{
381+
size_t Offset = OnSet.extract(OnSet.begin()).value();
382+
size_t Length;
383+
if (!OffSet.empty())
384+
{
385+
Length = OffSet.extract(OffSet.begin()).value() - Offset;
386+
}
387+
else
388+
{
389+
Length = CodeRef.size() - Offset;
390+
}
391+
392+
std::cout << Offset << " " << Offset + Length << std::endl;
393+
// Could result in loss of data
394+
tooling::Range NewRange = {static_cast<unsigned>(Offset), static_cast<unsigned>(Length)};
395+
396+
/*bool inserted = false;
397+
for (auto i = Ranges.begin(); i != Ranges.end(); ++i)
398+
{
399+
if (i->overlapsWith(NewRange))
400+
{
401+
std::cout << "Overlap erasure" << std::endl;
402+
tooling::Range Temp(std::min(NewRange.getOffset(), i->getOffset()), std::max(NewRange.getLength(), i->getLength()));
403+
std::cout << "Old range" << "\n";
404+
std::cout << i->getOffset() << " " << i->getOffset() + i->getLength() << "\n";
405+
std::cout << "New range before insert " << "\n";
406+
std::cout << NewRange.getOffset() << " " << NewRange.getOffset() + NewRange.getLength() << "\n";
407+
Ranges.erase(i);
408+
Ranges.insert(i, Temp);
409+
inserted = true;
410+
std::cout << "After" << "\n";
411+
std::cout << Temp.getOffset() << " " << Temp.getOffset() + Temp.getLength() << "\n";
412+
}
413+
}
414+
if (!inserted)
415+
{*/
416+
Ranges.push_back(NewRange);
417+
//}
418+
}
419+
}
420+
421+
std::sort(Ranges.begin(), Ranges.end(), [](const tooling::Range& a, const tooling::Range& b) {
422+
return a.getOffset() + a.getLength() < b.getOffset() + b.getLength();
423+
});
424+
425+
std::cout << "Printing ranges " << "\n";
426+
for (const auto& i : Ranges)
427+
{
428+
std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
429+
}
430+
431+
auto start = Ranges.begin();
432+
for (auto i = Ranges.begin()+1; i != Ranges.end(); ++i)
433+
{
434+
std::cout << "Loop" << "\n";
435+
std::cout << &(*start) << "\n" << &(*i) << "\n";
436+
if (start->getOffset() + start->getLength() >= i->getOffset())
437+
{
438+
std::cout << "Element erased\n";
439+
tooling::Range Temp(std::min(start->getOffset(), i->getOffset()), std::max(start->getLength(), i->getLength()));
440+
Ranges.erase(start, i+1);
441+
start = Ranges.insert(start, Temp);
442+
i = start;
443+
} else {
444+
++start;
445+
}
446+
}
447+
448+
std::cout << "Printing ranges " << Ranges.size() << "\n";
449+
for (const auto& i : Ranges)
450+
{
451+
std::cout << i.getOffset() << " " << i.getOffset() + i.getLength() << std::endl;;
452+
}
453+
310454
return false;
311455
}
312456

@@ -646,6 +790,17 @@ static bool isIgnored(StringRef FilePath) {
646790

647791
const auto Pathname{convert_to_slash(AbsPath)};
648792
for (const auto &Pat : Patterns) {
793+
794+
if (Pat.slice(0, 3).equals_insensitive("on:"))
795+
{
796+
OnWords.push_back(Pat.slice(3, Pat.size()).trim().str());
797+
continue;
798+
}
799+
if (Pat.slice(0, 4).equals_insensitive("off:"))
800+
{
801+
OffWords.push_back(Pat.slice(4, Pat.size()).trim().str());
802+
continue;
803+
}
649804
const bool IsNegated = Pat[0] == '!';
650805
StringRef Pattern{Pat};
651806
if (IsNegated)

0 commit comments

Comments
 (0)