|
26 | 26 | #include "llvm/Support/InitLLVM.h" |
27 | 27 | #include "llvm/Support/Process.h" |
28 | 28 | #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> |
29 | 35 |
|
30 | 36 | using namespace llvm; |
31 | 37 | using clang::tooling::Replacements; |
@@ -214,6 +220,9 @@ static cl::opt<bool> ListIgnored("list-ignored", |
214 | 220 | cl::desc("List ignored files."), |
215 | 221 | cl::cat(ClangFormatCategory), cl::Hidden); |
216 | 222 |
|
| 223 | +static SmallVector<std::string> OnWords; |
| 224 | +static SmallVector<std::string> OffWords; |
| 225 | + |
217 | 226 | namespace clang { |
218 | 227 | namespace format { |
219 | 228 |
|
@@ -277,6 +286,8 @@ static bool fillRanges(MemoryBuffer *Code, |
277 | 286 | return false; |
278 | 287 | } |
279 | 288 |
|
| 289 | + |
| 290 | + |
280 | 291 | if (Offsets.empty()) |
281 | 292 | Offsets.push_back(0); |
282 | 293 | if (Offsets.size() != Lengths.size() && |
@@ -307,6 +318,139 @@ static bool fillRanges(MemoryBuffer *Code, |
307 | 318 | unsigned Length = Sources.getFileOffset(End) - Offset; |
308 | 319 | Ranges.push_back(tooling::Range(Offset, Length)); |
309 | 320 | } |
| 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 | + |
310 | 454 | return false; |
311 | 455 | } |
312 | 456 |
|
@@ -646,6 +790,17 @@ static bool isIgnored(StringRef FilePath) { |
646 | 790 |
|
647 | 791 | const auto Pathname{convert_to_slash(AbsPath)}; |
648 | 792 | 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 | + } |
649 | 804 | const bool IsNegated = Pat[0] == '!'; |
650 | 805 | StringRef Pattern{Pat}; |
651 | 806 | if (IsNegated) |
|
0 commit comments