/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/tools/clang/include/clang/Rewrite/Core/RewriteBuffer.h
Line | Count | Source (jump to first uncovered line) |
1 | | //===--- RewriteBuffer.h - Buffer rewriting interface -----------*- C++ -*-===// |
2 | | // |
3 | | // The LLVM Compiler Infrastructure |
4 | | // |
5 | | // This file is distributed under the University of Illinois Open Source |
6 | | // License. See LICENSE.TXT for details. |
7 | | // |
8 | | //===----------------------------------------------------------------------===// |
9 | | |
10 | | #ifndef LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H |
11 | | #define LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H |
12 | | |
13 | | #include "clang/Basic/LLVM.h" |
14 | | #include "clang/Rewrite/Core/DeltaTree.h" |
15 | | #include "clang/Rewrite/Core/RewriteRope.h" |
16 | | #include "llvm/ADT/StringRef.h" |
17 | | |
18 | | namespace clang { |
19 | | class Rewriter; |
20 | | |
21 | | /// RewriteBuffer - As code is rewritten, SourceBuffer's from the original |
22 | | /// input with modifications get a new RewriteBuffer associated with them. The |
23 | | /// RewriteBuffer captures the modified text itself as well as information used |
24 | | /// to map between SourceLocation's in the original input and offsets in the |
25 | | /// RewriteBuffer. For example, if text is inserted into the buffer, any |
26 | | /// locations after the insertion point have to be mapped. |
27 | | class RewriteBuffer { |
28 | | friend class Rewriter; |
29 | | /// Deltas - Keep track of all the deltas in the source code due to insertions |
30 | | /// and deletions. |
31 | | DeltaTree Deltas; |
32 | | RewriteRope Buffer; |
33 | | public: |
34 | | typedef RewriteRope::const_iterator iterator; |
35 | 10.5k | iterator begin() const { return Buffer.begin(); } |
36 | 11.3k | iterator end() const { return Buffer.end(); } |
37 | 6 | unsigned size() const { return Buffer.size(); } |
38 | | |
39 | | /// Initialize - Start this rewrite buffer out with a copy of the unmodified |
40 | | /// input buffer. |
41 | 9.69k | void Initialize(const char *BufStart, const char *BufEnd) { |
42 | 9.69k | Buffer.assign(BufStart, BufEnd); |
43 | 9.69k | } |
44 | 0 | void Initialize(StringRef Input) { |
45 | 0 | Initialize(Input.begin(), Input.end()); |
46 | 0 | } |
47 | | |
48 | | /// \brief Write to \p Stream the result of applying all changes to the |
49 | | /// original buffer. |
50 | | /// Note that it isn't safe to use this function to overwrite memory mapped |
51 | | /// files in-place (PR17960). Consider using a higher-level utility such as |
52 | | /// Rewriter::overwriteChangedFiles() instead. |
53 | | /// |
54 | | /// The original buffer is not actually changed. |
55 | | raw_ostream &write(raw_ostream &Stream) const; |
56 | | |
57 | | /// RemoveText - Remove the specified text. |
58 | | void RemoveText(unsigned OrigOffset, unsigned Size, |
59 | | bool removeLineIfEmpty = false); |
60 | | |
61 | | /// InsertText - Insert some text at the specified point, where the offset in |
62 | | /// the buffer is specified relative to the original SourceBuffer. The |
63 | | /// text is inserted after the specified location. |
64 | | /// |
65 | | void InsertText(unsigned OrigOffset, StringRef Str, |
66 | | bool InsertAfter = true); |
67 | | |
68 | | |
69 | | /// InsertTextBefore - Insert some text before the specified point, where the |
70 | | /// offset in the buffer is specified relative to the original |
71 | | /// SourceBuffer. The text is inserted before the specified location. This is |
72 | | /// method is the same as InsertText with "InsertAfter == false". |
73 | 110k | void InsertTextBefore(unsigned OrigOffset, StringRef Str) { |
74 | 110k | InsertText(OrigOffset, Str, false); |
75 | 110k | } |
76 | | |
77 | | /// InsertTextAfter - Insert some text at the specified point, where the |
78 | | /// offset in the buffer is specified relative to the original SourceBuffer. |
79 | | /// The text is inserted after the specified location. |
80 | 36.9k | void InsertTextAfter(unsigned OrigOffset, StringRef Str) { |
81 | 36.9k | InsertText(OrigOffset, Str); |
82 | 36.9k | } |
83 | | |
84 | | /// ReplaceText - This method replaces a range of characters in the input |
85 | | /// buffer with a new string. This is effectively a combined "remove/insert" |
86 | | /// operation. |
87 | | void ReplaceText(unsigned OrigOffset, unsigned OrigLength, |
88 | | StringRef NewStr); |
89 | | |
90 | | private: // Methods only usable by Rewriter. |
91 | | |
92 | | /// getMappedOffset - Given an offset into the original SourceBuffer that this |
93 | | /// RewriteBuffer is based on, map it into the offset space of the |
94 | | /// RewriteBuffer. If AfterInserts is true and if the OrigOffset indicates a |
95 | | /// position where text is inserted, the location returned will be after any |
96 | | /// inserted text at the position. |
97 | | unsigned getMappedOffset(unsigned OrigOffset, |
98 | 346k | bool AfterInserts = false) const{ |
99 | 346k | return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset; |
100 | 346k | } |
101 | | |
102 | | /// AddInsertDelta - When an insertion is made at a position, this |
103 | | /// method is used to record that information. |
104 | 150k | void AddInsertDelta(unsigned OrigOffset, int Change) { |
105 | 150k | return Deltas.AddDelta(2*OrigOffset, Change); |
106 | 150k | } |
107 | | |
108 | | /// AddReplaceDelta - When a replacement/deletion is made at a position, this |
109 | | /// method is used to record that information. |
110 | 184k | void AddReplaceDelta(unsigned OrigOffset, int Change) { |
111 | 184k | return Deltas.AddDelta(2*OrigOffset+1, Change); |
112 | 184k | } |
113 | | }; |
114 | | |
115 | | } // end namespace clang |
116 | | |
117 | | #endif |