diff options
Diffstat (limited to 'clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp')
-rw-r--r-- | clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp b/clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp index 660c58bdbe1..037caf36254 100644 --- a/clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp +++ b/clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp @@ -17,6 +17,8 @@ #include "clang-apply-replacements/Tooling/ApplyReplacements.h" #include "clang/Basic/LangOptions.h" #include "clang/Basic/SourceManager.h" +#include "clang/Format/Format.h" +#include "clang/Lex/Lexer.h" #include "clang/Rewrite/Core/Rewriter.h" #include "clang/Tooling/ReplacementsYaml.h" #include "llvm/ADT/ArrayRef.h" @@ -34,7 +36,6 @@ static void eatDiagnostics(const SMDiagnostic &, void *) {} namespace clang { namespace replace { - llvm::error_code collectReplacementsFromDirectory(const llvm::StringRef Directory, TUReplacements &TUs, @@ -128,6 +129,8 @@ static void reportConflict( /// \brief Deduplicates and tests for conflicts among the replacements for each /// file in \c Replacements. Any conflicts found are reported. /// +/// \post Replacements[i].getOffset() <= Replacements[i+1].getOffset(). +/// /// \param[in,out] Replacements Container of all replacements grouped by file /// to be deduplicated and checked for conflicts. /// \param[in] SM SourceManager required for conflict reporting. @@ -212,6 +215,29 @@ bool applyReplacements(const FileToReplacementsMap &GroupedReplacements, return true; } +RangeVector calculateChangedRanges( + const std::vector<clang::tooling::Replacement> &Replaces) { + RangeVector ChangedRanges; + + // Generate the new ranges from the replacements. + // + // NOTE: This is O(n^2) in the number of replacements. If this starts to + // become a problem inline shiftedCodePosition() here and do shifts in a + // single run through this loop. + for (std::vector<clang::tooling::Replacement>::const_iterator + I = Replaces.begin(), + E = Replaces.end(); + I != E; ++I) { + const tooling::Replacement &R = *I; + unsigned Offset = tooling::shiftedCodePosition(Replaces, R.getOffset()); + unsigned Length = R.getReplacementText().size(); + + ChangedRanges.push_back(tooling::Range(Offset, Length)); + } + + return ChangedRanges; +} + bool writeFiles(const clang::Rewriter &Rewrites) { for (Rewriter::const_buffer_iterator BufferI = Rewrites.buffer_begin(), |