diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2018-07-28 11:06:01 +0000 |
commit | 486754660bb926339aefcf012a3f848592babb8b (patch) | |
tree | ecdbc446c9876f4f120f701c243373cd3cb43db3 /lib/Tooling/Core/Replacement.cpp | |
parent | 55e6d896ad333f07bb3b1ba487df214fc268a4ab (diff) |
Notes
Diffstat (limited to 'lib/Tooling/Core/Replacement.cpp')
-rw-r--r-- | lib/Tooling/Core/Replacement.cpp | 69 |
1 files changed, 49 insertions, 20 deletions
diff --git a/lib/Tooling/Core/Replacement.cpp b/lib/Tooling/Core/Replacement.cpp index 6d4f3a3401425..67e2dcfd73c11 100644 --- a/lib/Tooling/Core/Replacement.cpp +++ b/lib/Tooling/Core/Replacement.cpp @@ -1,4 +1,4 @@ -//===--- Replacement.cpp - Framework for clang refactoring tools ----------===// +//===- Replacement.cpp - Framework for clang refactoring tools ------------===// // // The LLVM Compiler Infrastructure // @@ -12,21 +12,34 @@ //===----------------------------------------------------------------------===// #include "clang/Tooling/Core/Replacement.h" - #include "clang/Basic/Diagnostic.h" #include "clang/Basic/DiagnosticIDs.h" #include "clang/Basic/DiagnosticOptions.h" #include "clang/Basic/FileManager.h" +#include "clang/Basic/FileSystemOptions.h" +#include "clang/Basic/SourceLocation.h" #include "clang/Basic/SourceManager.h" +#include "clang/Basic/VirtualFileSystem.h" #include "clang/Lex/Lexer.h" +#include "clang/Rewrite/Core/RewriteBuffer.h" #include "clang/Rewrite/Core/Rewriter.h" +#include "llvm/ADT/IntrusiveRefCntPtr.h" #include "llvm/ADT/SmallPtrSet.h" -#include "llvm/Support/FileSystem.h" -#include "llvm/Support/Path.h" -#include "llvm/Support/raw_os_ostream.h" - -namespace clang { -namespace tooling { +#include "llvm/ADT/StringRef.h" +#include "llvm/Support/Error.h" +#include "llvm/Support/ErrorHandling.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/raw_ostream.h" +#include <algorithm> +#include <cassert> +#include <limits> +#include <map> +#include <string> +#include <utility> +#include <vector> + +using namespace clang; +using namespace tooling; static const char * const InvalidLocation = ""; @@ -80,6 +93,9 @@ std::string Replacement::toString() const { return Stream.str(); } +namespace clang { +namespace tooling { + bool operator<(const Replacement &LHS, const Replacement &RHS) { if (LHS.getOffset() != RHS.getOffset()) return LHS.getOffset() < RHS.getOffset(); @@ -99,6 +115,9 @@ bool operator==(const Replacement &LHS, const Replacement &RHS) { LHS.getReplacementText() == RHS.getReplacementText(); } +} // namespace tooling +} // namespace clang + void Replacement::setFromSourceLocation(const SourceManager &Sources, SourceLocation Start, unsigned Length, StringRef ReplacementText) { @@ -201,7 +220,7 @@ Replacements Replacements::getCanonicalReplacements() const { llvm::Expected<Replacements> Replacements::mergeIfOrderIndependent(const Replacement &R) const { Replacements Rs(R); - // A Replacements set containg a single replacement that is `R` referring to + // A Replacements set containing a single replacement that is `R` referring to // the code after the existing replacements `Replaces` are applied. Replacements RsShiftedByReplaces(getReplacementInChangedCode(R)); // A Replacements set that is `Replaces` referring to the code after `R` is @@ -231,7 +250,7 @@ llvm::Error Replacements::add(const Replacement &R) { replacement_error::wrong_file_path, R, *Replaces.begin()); // Special-case header insertions. - if (R.getOffset() == UINT_MAX) { + if (R.getOffset() == std::numeric_limits<unsigned>::max()) { Replaces.insert(R); return llvm::Error::success(); } @@ -396,6 +415,7 @@ public: // Returns 'true' if an element from the second set should be merged next. bool mergeSecond() const { return MergeSecond; } + int deltaFirst() const { return DeltaFirst; } Replacement asReplacement() const { return {FilePath, Offset, Length, Text}; } @@ -463,11 +483,11 @@ Replacements Replacements::merge(const Replacements &ReplacesToMerge) const { // Returns a set of non-overlapping and sorted ranges that is equivalent to // \p Ranges. static std::vector<Range> combineAndSortRanges(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(); + llvm::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) { @@ -485,6 +505,9 @@ static std::vector<Range> combineAndSortRanges(std::vector<Range> Ranges) { return Result; } +namespace clang { +namespace tooling { + std::vector<Range> calculateRangesAfterReplacements(const Replacements &Replaces, const std::vector<Range> &Ranges) { @@ -508,10 +531,13 @@ calculateRangesAfterReplacements(const Replacements &Replaces, return FakeReplaces.merge(Replaces).getAffectedRanges(); } +} // namespace tooling +} // namespace clang + std::vector<Range> Replacements::getAffectedRanges() const { std::vector<Range> ChangedRanges; int Shift = 0; - for (const Replacement &R : Replaces) { + for (const auto &R : Replaces) { unsigned Offset = R.getOffset() + Shift; unsigned Length = R.getReplacementText().size(); Shift += Length - R.getLength(); @@ -522,7 +548,7 @@ std::vector<Range> Replacements::getAffectedRanges() const { unsigned Replacements::getShiftedCodePosition(unsigned Position) const { unsigned Offset = 0; - for (const auto& R : Replaces) { + for (const auto &R : Replaces) { if (R.getOffset() + R.getLength() <= Position) { Offset += R.getReplacementText().size() - R.getLength(); continue; @@ -530,7 +556,7 @@ unsigned Replacements::getShiftedCodePosition(unsigned Position) const { if (R.getOffset() < Position && R.getOffset() + R.getReplacementText().size() <= Position) { Position = R.getOffset() + R.getReplacementText().size(); - if (R.getReplacementText().size() > 0) + if (!R.getReplacementText().empty()) Position--; } break; @@ -538,6 +564,9 @@ unsigned Replacements::getShiftedCodePosition(unsigned Position) const { return Position + Offset; } +namespace clang { +namespace tooling { + bool applyAllReplacements(const Replacements &Replaces, Rewriter &Rewrite) { bool Result = true; for (auto I = Replaces.rbegin(), E = Replaces.rend(); I != E; ++I) { @@ -596,5 +625,5 @@ std::map<std::string, Replacements> groupReplacementsByFile( return Result; } -} // end namespace tooling -} // end namespace clang +} // namespace tooling +} // namespace clang |