summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/clang-apply-replacements/lib/Tooling/ApplyReplacements.cpp
diff options
context:
space:
mode:
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.cpp28
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(),
OpenPOWER on IntegriCloud