LCOV - code coverage report
Current view: top level - clang/Rewrite/Core - RewriteBuffer.h (source / functions) Hit Total Coverage
Test: clang.info Lines: 1 1 100.0 %
Date: 2016-01-31 12:01:00 Functions: 1 1 100.0 %

          Line data    Source code
       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          12 : 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             :   iterator begin() const { return Buffer.begin(); }
      36             :   iterator end() const { return Buffer.end(); }
      37             :   unsigned size() const { return Buffer.size(); }
      38             : 
      39             :   /// Initialize - Start this rewrite buffer out with a copy of the unmodified
      40             :   /// input buffer.
      41             :   void Initialize(const char *BufStart, const char *BufEnd) {
      42             :     Buffer.assign(BufStart, BufEnd);
      43             :   }
      44             :   void Initialize(StringRef Input) {
      45             :     Initialize(Input.begin(), Input.end());
      46             :   }
      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             :   void InsertTextBefore(unsigned OrigOffset, StringRef Str) {
      74             :     InsertText(OrigOffset, Str, false);
      75             :   }
      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             :   void InsertTextAfter(unsigned OrigOffset, StringRef Str) {
      81             :     InsertText(OrigOffset, Str);
      82             :   }
      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             :                            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             : } // end namespace clang
     116             : 
     117             : #endif

Generated by: LCOV version 1.11