summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/cpp11-migrate/Core/FileOverrides.h')
-rw-r--r--clang-tools-extra/cpp11-migrate/Core/FileOverrides.h50
1 files changed, 48 insertions, 2 deletions
diff --git a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h
index 7f8c8d20011..2bb3daea7b0 100644
--- a/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h
+++ b/clang-tools-extra/cpp11-migrate/Core/FileOverrides.h
@@ -29,6 +29,34 @@ class SourceManager;
class Rewriter;
} // namespace clang
+/// \brief Class encapsulating a list of \c tooling::Range with some
+/// convenience methods.
+///
+/// The ranges stored are used to keep track of the overriden parts of a file.
+class ChangedRanges {
+ typedef std::vector<clang::tooling::Range> RangeVec;
+
+public:
+ typedef RangeVec::const_iterator const_iterator;
+
+ /// \brief Create new ranges from the replacements and adjust existing one
+ /// to remove replaced parts.
+ ///
+ /// Note that all replacements should come from the same file.
+ void adjustChangedRanges(const clang::tooling::Replacements &Replaces);
+
+ /// \brief Iterators.
+ /// @{
+ const_iterator begin() const { return Ranges.begin(); }
+ const_iterator end() const { return Ranges.end(); }
+ /// @}
+
+private:
+ void coalesceRanges();
+
+ RangeVec Ranges;
+};
+
/// \brief Container for storing override information for a single headers.
struct HeaderOverride {
HeaderOverride() {}
@@ -36,6 +64,7 @@ struct HeaderOverride {
std::string FileName;
std::string FileOverride;
+ ChangedRanges Changes;
};
/// \brief Container mapping header file names to override information.
@@ -46,12 +75,18 @@ typedef llvm::StringMap<HeaderOverride> HeaderOverrides;
/// which changes have been made.
class SourceOverrides {
public:
- SourceOverrides(llvm::StringRef MainFileName);
+ SourceOverrides(llvm::StringRef MainFileName, bool TrackChanges);
/// \brief Accessors.
/// @{
llvm::StringRef getMainFileName() const { return MainFileName; }
llvm::StringRef getMainFileContent() const { return MainFileOverride; }
+ const ChangedRanges &getChangedRanges() const { return MainFileChanges; }
+
+ /// \brief Is file change tracking enabled?
+ ///
+ /// Tracking file changes can be useful to reformat the code for example.
+ bool isTrackingFileChanges() const { return TrackChanges; }
/// @}
/// \brief Indicates if the source file has been overridden.
@@ -87,8 +122,14 @@ private:
/// file content overrides.
void applyRewrites(clang::Rewriter &Rewrite);
+ /// \brief Adjust the changed ranges to reflect the parts of the files that
+ /// have been replaced.
+ void adjustChangedRanges(const clang::tooling::Replacements &Replaces);
+
const std::string MainFileName;
std::string MainFileOverride;
+ const bool TrackChanges;
+ ChangedRanges MainFileChanges;
HeaderOverrides Headers;
};
@@ -98,7 +139,11 @@ public:
typedef llvm::StringMap<SourceOverrides *> SourceOverridesMap;
typedef SourceOverridesMap::const_iterator const_iterator;
- FileOverrides() {}
+ /// \brief Construct the SourceOverrides manager.
+ ///
+ /// \param TrackChanges Wether or not the \c SourceOverrides should keep track
+ /// of changes. See \c SourceOverrides::isTrackingFileChanges().
+ FileOverrides(bool TrackChanges) : TrackChanges(TrackChanges) {}
~FileOverrides();
const_iterator find(llvm::StringRef Filename) const {
@@ -120,6 +165,7 @@ private:
FileOverrides &operator=(const FileOverrides &) LLVM_DELETED_FUNCTION;
SourceOverridesMap Overrides;
+ const bool TrackChanges;
};
/// \brief Generate a unique filename to store the replacements.
OpenPOWER on IntegriCloud