//===--- FixitApplyDiagnosticConsumer.cpp ---------------------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "swift/Basic/SourceManager.h"
#include "swift/Frontend/Frontend.h"
#include "swift/Migrator/FixitApplyDiagnosticConsumer.h"
#include "swift/Migrator/Migrator.h"
#include "swift/Migrator/MigratorOptions.h"
#include "swift/AST/DiagnosticsSema.h"

using namespace swift;
using namespace swift::migrator;

FixitApplyDiagnosticConsumer::
FixitApplyDiagnosticConsumer(const StringRef Text,
                             const StringRef BufferName)
  : Text(Text), BufferName(BufferName), NumFixitsApplied(0) {
  RewriteBuf.Initialize(Text);
}

void FixitApplyDiagnosticConsumer::printResult(llvm::raw_ostream &OS) const {
  RewriteBuf.write(OS);
}

void FixitApplyDiagnosticConsumer::handleDiagnostic(
    SourceManager &SM, SourceLoc Loc, DiagnosticKind Kind,
    StringRef FormatString, ArrayRef<DiagnosticArgument> FormatArgs,
    const DiagnosticInfo &Info,
    const SourceLoc bufferIndirectlyCausingDiagnostic) {
  if (Loc.isInvalid()) {
    return;
  }
  auto ThisBufferID = SM.findBufferContainingLoc(Loc);
  auto ThisBufferName = SM.getIdentifierForBuffer(ThisBufferID);
  if (ThisBufferName != BufferName) {
    return;
  }

  if (!shouldTakeFixit(Kind, Info)) {
    return;
  }

  for (const auto &Fixit : Info.FixIts) {

    auto Offset = SM.getLocOffsetInBuffer(Fixit.getRange().getStart(),
                                          ThisBufferID);
    auto Length = Fixit.getRange().getByteLength();
    auto Text = Fixit.getText();

    // Ignore meaningless Fix-its.
    if (Length == 0 && Text.size() == 0)
      continue;

    // Ignore pre-applied equivalents.
    Replacement R { Offset, Length, Text };
    if (Replacements.count(R)) {
      continue;
    } else {
      Replacements.insert(R);
    }

    if (Length == 0) {
      RewriteBuf.InsertText(Offset, Text);
    } else if (Text.size() == 0) {
      RewriteBuf.RemoveText(Offset, Length);
    } else {
      RewriteBuf.ReplaceText(Offset, Length, Text);
    }
    ++NumFixitsApplied;
  }
}
