//===--- RewriteBufferEditsReceiver.h ---------------------------*- C++ -*-===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//

#ifndef SWIFT_MIGRATOR_REWRITEBUFFEREDITSRECEIVER_H
#define SWIFT_MIGRATOR_REWRITEBUFFEREDITSRECEIVER_H

#include "clang/Basic/SourceManager.h"
#include "clang/Basic/SourceLocation.h"
#include "clang/Edit/EditsReceiver.h"
#include "llvm/ADT/RewriteBuffer.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/raw_ostream.h"

using llvm::StringRef;

namespace swift {
namespace migrator {

/// An EditsReceiver that collects edits from an EditedSource and directly
/// applies it to a llvm::RewriteBuffer.
class RewriteBufferEditsReceiver final : public clang::edit::EditsReceiver {
  const clang::SourceManager &ClangSourceManager;
  const clang::FileID InputFileID;
  const StringRef InputText;
  llvm::RewriteBuffer RewriteBuf;

public:
  RewriteBufferEditsReceiver(const clang::SourceManager &ClangSourceManager,
                             const clang::FileID InputFileID,
                             const StringRef InputText)
    : ClangSourceManager(ClangSourceManager),
      InputFileID(InputFileID),
      InputText(InputText) {
    RewriteBuf.Initialize(InputText);
  }

  virtual void insert(clang::SourceLocation Loc, StringRef Text) override;
  virtual void replace(clang::CharSourceRange Range, StringRef Text) override;

  /// Print the result of all of the edits to the given output stream.
  void printResult(llvm::raw_ostream &OS) const;
};

} // end namespace migrator
} // end namespace swift

#endif // SWIFT_MIGRATOR_REWRITEBUFFEREDITSRECEIVER_H
