//===--- LocalizeObjCString.cpp -  ----------------------------------------===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
// Implements the "Wrap in NSLocalizedString" refactoring operation.
//
//===----------------------------------------------------------------------===//

#include "RefactoringOperations.h"
#include "SourceLocationUtilities.h"
#include "clang/AST/AST.h"
#include "clang/AST/ASTContext.h"
#include "clang/AST/Expr.h"

using namespace clang;
using namespace clang::tooling;

namespace {

class LocalizeObjCStringLiteralOperation : public RefactoringOperation {
public:
  LocalizeObjCStringLiteralOperation(const ObjCStringLiteral *E) : E(E) {}

  const Stmt *getTransformedStmt() const override { return E; }

  llvm::Expected<RefactoringResult> perform(ASTContext &Context, const Preprocessor &ThePreprocessor,
          const RefactoringOptionSet &Options,
          unsigned SelectedCandidateIndex) override;

  const ObjCStringLiteral *E;
};

} // end anonymous namespace

RefactoringOperationResult
clang::tooling::initiateLocalizeObjCStringLiteralOperation(
    ASTSlice &Slice, ASTContext &Context, SourceLocation Location,
    SourceRange SelectionRange, bool CreateOperation) {
  const ObjCStringLiteral *E;
  if (SelectionRange.isValid()) {
    auto SelectedSet = Slice.getSelectedStmtSet();
    if (!SelectedSet)
      return None;
    E = dyn_cast_or_null<ObjCStringLiteral>(
        SelectedSet->containsSelectionRange);
  } else
    E = cast_or_null<ObjCStringLiteral>(
        Slice.nearestStmt(Stmt::ObjCStringLiteralClass));
  if (!E)
    return None;

  RefactoringOperationResult Result;
  Result.Initiated = true;
  if (!CreateOperation)
    return Result;
  auto Operation = llvm::make_unique<LocalizeObjCStringLiteralOperation>(E);
  Result.RefactoringOp = std::move(Operation);
  return Result;
}

llvm::Expected<RefactoringResult>
LocalizeObjCStringLiteralOperation::perform(ASTContext &Context,
                                            const Preprocessor &ThePreprocessor,
                                            const RefactoringOptionSet &Options,
                                            unsigned SelectedCandidateIndex) {
  std::vector<RefactoringReplacement> Replacements;
  // TODO: New API: Replace by something like Node.wrap("NSLocalizedString(", ",
  // @""")
  SourceLocation LocStart =
      Context.getSourceManager().getSpellingLoc(E->getLocStart());
  Replacements.emplace_back(SourceRange(LocStart, LocStart),
                            StringRef("NSLocalizedString("));
  SourceLocation LocEnd = getPreciseTokenLocEnd(
      Context.getSourceManager().getSpellingLoc(E->getLocEnd()),
      Context.getSourceManager(), Context.getLangOpts());
  Replacements.emplace_back(SourceRange(LocEnd, LocEnd), StringRef(", @\"\")"));
  return std::move(Replacements);
}
