aboutsummaryrefslogtreecommitdiff
path: root/include/clang/Rewrite/Rewriter.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/clang/Rewrite/Rewriter.h')
-rw-r--r--include/clang/Rewrite/Rewriter.h88
1 files changed, 88 insertions, 0 deletions
diff --git a/include/clang/Rewrite/Rewriter.h b/include/clang/Rewrite/Rewriter.h
new file mode 100644
index 0000000000..09a99808ed
--- /dev/null
+++ b/include/clang/Rewrite/Rewriter.h
@@ -0,0 +1,88 @@
+//===--- Rewriter.h - Code rewriting interface ------------------*- C++ -*-===//
+//
+// The LLVM Compiler Infrastructure
+//
+// This file was developed by Chris Lattner and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the Rewriter class, which is used for code
+// transformations.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_CLANG_REWRITER_H
+#define LLVM_CLANG_REWRITER_H
+
+#include <vector>
+
+namespace clang {
+ class SourceManager;
+ class SourceLocation;
+
+/// SourceDelta - As code in the original input buffer is added and deleted,
+/// SourceDelta records are used to keep track of how the input SourceLocation
+/// object is mapped into the output buffer.
+struct SourceDelta {
+ unsigned FileLoc;
+ int Delta;
+};
+
+
+/// RewriteBuffer - As code is rewritten, SourceBuffer's from the original
+/// input with modifications get a new RewriteBuffer associated with them. The
+/// RewriteBuffer captures the modified text itself as well as information used
+/// to map between SourceLocation's in the original input and offsets in the
+/// RewriteBuffer. For example, if text is inserted into the buffer, any
+/// locations after the insertion point have to be mapped.
+class RewriteBuffer {
+ /// Deltas - Keep track of all the deltas in the source code due to insertions
+ /// and deletions. These are kept in sorted order based on the FileLoc.
+ std::vector<SourceDelta> Deltas;
+
+ /// Buffer - This is the actual buffer itself. Note that using a vector or
+ /// string is a horribly inefficient way to do this, we should use a rope
+ /// instead.
+ std::vector<char> Buffer;
+public:
+
+ /// RemoveText - Remove the specified text.
+ void RemoveText(unsigned OrigOffset, unsigned Size);
+
+
+ /// InsertText - Insert some text at the specified point, where the offset in
+ /// the buffer is specified relative to the original SourceBuffer.
+ ///
+ /// TODO: Consider a bool to indicate whether the text is inserted 'before' or
+ /// after the atomic point: i.e. whether the atomic point is moved to after
+ /// the inserted text or not.
+ void InsertText(unsigned OrigOffset, const char *StrData, unsigned StrLen);
+
+};
+
+class Rewriter {
+ SourceManager &SourceMgr;
+
+ // FIXME: list of buffers.
+public:
+ explicit Rewriter(SourceManager &SM) : SourceMgr(SM) {}
+
+ /// InsertText - Insert the specified string at the specified location in the
+ /// original buffer.
+ bool InsertText(SourceLocation Loc, const char *StrData, unsigned StrLen);
+
+ /// RemoveText - Remove the specified text region.
+ bool RemoveText(SourceLocation Start, SourceLocation End);
+
+
+ // TODO: Replace Stmt/Expr with another.
+
+
+ // Write out output buffer.
+
+};
+
+} // end namespace clang
+
+#endif