diff options
Diffstat (limited to 'clang/lib')
-rw-r--r-- | clang/lib/Tooling/Core/Replacement.cpp | 40 |
1 files changed, 38 insertions, 2 deletions
diff --git a/clang/lib/Tooling/Core/Replacement.cpp b/clang/lib/Tooling/Core/Replacement.cpp index 647f2fcc3d3..d36c4fca51c 100644 --- a/clang/lib/Tooling/Core/Replacement.cpp +++ b/clang/lib/Tooling/Core/Replacement.cpp @@ -278,6 +278,30 @@ std::string applyAllReplacements(StringRef Code, const Replacements &Replaces) { return Result; } +// Merge and sort overlapping ranges in \p Ranges. +static std::vector<Range> mergeAndSortRanges(std::vector<Range> Ranges) { + std::sort(Ranges.begin(), Ranges.end(), + [](const Range &LHS, const Range &RHS) { + if (LHS.getOffset() != RHS.getOffset()) + return LHS.getOffset() < RHS.getOffset(); + return LHS.getLength() < RHS.getLength(); + }); + std::vector<Range> Result; + for (const auto &R : Ranges) { + if (Result.empty() || + Result.back().getOffset() + Result.back().getLength() < R.getOffset()) { + Result.push_back(R); + } else { + unsigned NewEnd = + std::max(Result.back().getOffset() + Result.back().getLength(), + R.getOffset() + R.getLength()); + Result[Result.size() - 1] = + Range(Result.back().getOffset(), NewEnd - Result.back().getOffset()); + } + } + return Result; +} + std::vector<Range> calculateChangedRanges(const Replacements &Replaces) { std::vector<Range> ChangedRanges; int Shift = 0; @@ -287,7 +311,20 @@ std::vector<Range> calculateChangedRanges(const Replacements &Replaces) { Shift += Length - R.getLength(); ChangedRanges.push_back(Range(Offset, Length)); } - return ChangedRanges; + return mergeAndSortRanges(ChangedRanges); +} + +std::vector<Range> +calculateRangesAfterReplacements(const Replacements &Replaces, + const std::vector<Range> &Ranges) { + auto MergedRanges = mergeAndSortRanges(Ranges); + tooling::Replacements FakeReplaces; + for (const auto &R : MergedRanges) + FakeReplaces.insert(Replacement(Replaces.begin()->getFilePath(), + R.getOffset(), R.getLength(), + std::string(" ", R.getLength()))); + tooling::Replacements NewReplaces = mergeReplacements(FakeReplaces, Replaces); + return calculateChangedRanges(NewReplaces); } namespace { @@ -434,4 +471,3 @@ Replacements mergeReplacements(const Replacements &First, } // end namespace tooling } // end namespace clang - |