Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.  
  17. namespace 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.
  25. class 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.  
  34. public:
  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 *BufStart, const 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 &Stream) const;
  58.  
  59.   /// RemoveText - Remove the specified text.
  60.   void RemoveText(unsigned OrigOffset, unsigned 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 OrigOffset, StringRef 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 OrigOffset, StringRef 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 OrigOffset, StringRef 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 OrigOffset, unsigned OrigLength,
  89.                    StringRef NewStr);
  90.  
  91. private:
  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 = false) const{
  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 OrigOffset, int Change) {
  105.     return Deltas.AddDelta(2*OrigOffset, Change);
  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 OrigOffset, int Change) {
  111.     return Deltas.AddDelta(2*OrigOffset+1, Change);
  112.   }
  113. };
  114.  
  115. } // namespace clang
  116.  
  117. #endif // LLVM_CLANG_REWRITE_CORE_REWRITEBUFFER_H
  118.