Clang Project

clang_source_code/include/clang/Rewrite/Core/RewriteBuffer.h
1//===- RewriteBuffer.h - Buffer rewriting interface -------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H
10#define LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H
11
12#include "clang/Basic/LLVM.h"
13#include "clang/Rewrite/Core/DeltaTree.h"
14#include "clang/Rewrite/Core/RewriteRope.h"
15#include "llvm/ADT/StringRef.h"
16
17namespace clang {
18
19/// RewriteBuffer - As code is rewritten, SourceBuffer's from the original
20/// input with modifications get a new RewriteBuffer associated with them.  The
21/// RewriteBuffer captures the modified text itself as well as information used
22/// to map between SourceLocation's in the original input and offsets in the
23/// RewriteBuffer.  For example, if text is inserted into the buffer, any
24/// locations after the insertion point have to be mapped.
25class RewriteBuffer {
26  friend class Rewriter;
27
28  /// Deltas - Keep track of all the deltas in the source code due to insertions
29  /// and deletions.
30  DeltaTree Deltas;
31
32  RewriteRope Buffer;
33
34public:
35  using iterator = RewriteRope::const_iterator;
36
37  iterator begin() const { return Buffer.begin(); }
38  iterator end() const { return Buffer.end(); }
39  unsigned size() const { return Buffer.size(); }
40
41  /// Initialize - Start this rewrite buffer out with a copy of the unmodified
42  /// input buffer.
43  void Initialize(const char *BufStartconst char *BufEnd) {
44    Buffer.assign(BufStart, BufEnd);
45  }
46  void Initialize(StringRef Input) {
47    Initialize(Input.begin(), Input.end());
48  }
49
50  /// Write to \p Stream the result of applying all changes to the
51  /// original buffer.
52  /// Note that it isn't safe to use this function to overwrite memory mapped
53  /// files in-place (PR17960). Consider using a higher-level utility such as
54  /// Rewriter::overwriteChangedFiles() instead.
55  ///
56  /// The original buffer is not actually changed.
57  raw_ostream &write(raw_ostream &Streamconst;
58
59  /// RemoveText - Remove the specified text.
60  void RemoveText(unsigned OrigOffsetunsigned Size,
61                  bool removeLineIfEmpty = false);
62
63  /// InsertText - Insert some text at the specified point, where the offset in
64  /// the buffer is specified relative to the original SourceBuffer.  The
65  /// text is inserted after the specified location.
66  void InsertText(unsigned OrigOffsetStringRef Str,
67                  bool InsertAfter = true);
68
69
70  /// InsertTextBefore - Insert some text before the specified point, where the
71  /// offset in the buffer is specified relative to the original
72  /// SourceBuffer. The text is inserted before the specified location.  This is
73  /// method is the same as InsertText with "InsertAfter == false".
74  void InsertTextBefore(unsigned OrigOffsetStringRef Str) {
75    InsertText(OrigOffset, Str, false);
76  }
77
78  /// InsertTextAfter - Insert some text at the specified point, where the
79  /// offset in the buffer is specified relative to the original SourceBuffer.
80  /// The text is inserted after the specified location.
81  void InsertTextAfter(unsigned OrigOffsetStringRef Str) {
82    InsertText(OrigOffset, Str);
83  }
84
85  /// ReplaceText - This method replaces a range of characters in the input
86  /// buffer with a new string.  This is effectively a combined "remove/insert"
87  /// operation.
88  void ReplaceText(unsigned OrigOffsetunsigned OrigLength,
89                   StringRef NewStr);
90
91private:
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                           bool AfterInserts = falseconst{
99    return Deltas.getDeltaAt(2*OrigOffset+AfterInserts)+OrigOffset;
100  }
101
102  /// AddInsertDelta - When an insertion is made at a position, this
103  /// method is used to record that information.
104  void AddInsertDelta(unsigned OrigOffsetint Change) {
105    return Deltas.AddDelta(2*OrigOffsetChange);
106  }
107
108  /// AddReplaceDelta - When a replacement/deletion is made at a position, this
109  /// method is used to record that information.
110  void AddReplaceDelta(unsigned OrigOffsetint Change) {
111    return Deltas.AddDelta(2*OrigOffset+1Change);
112  }
113};
114
115// namespace clang
116
117#endif // LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H
118
clang::RewriteBuffer::Deltas
clang::RewriteBuffer::Buffer
clang::RewriteBuffer::begin
clang::RewriteBuffer::end
clang::RewriteBuffer::size
clang::RewriteBuffer::Initialize
clang::RewriteBuffer::Initialize
clang::RewriteBuffer::write
clang::RewriteBuffer::RemoveText
clang::RewriteBuffer::InsertText
clang::RewriteBuffer::InsertTextBefore
clang::RewriteBuffer::InsertTextAfter
clang::RewriteBuffer::ReplaceText
clang::RewriteBuffer::getMappedOffset
clang::RewriteBuffer::AddInsertDelta
clang::RewriteBuffer::AddReplaceDelta