[clangd] Get rid of lexer usage in ObjCLocalizeStringLiteral tweak
authorKadir Cetinkaya <kadircet@google.com>
Thu, 27 Feb 2020 09:35:14 +0000 (10:35 +0100)
committerKadir Cetinkaya <kadircet@google.com>
Fri, 28 Feb 2020 08:38:26 +0000 (09:38 +0100)
Reviewers: hokein

Subscribers: ilya-biryukov, MaskRay, jkorous, arphaman, usaxena95, cfe-commits

Tags: #clang

Differential Revision: https://reviews.llvm.org/D75230

clang-tools-extra/clangd/refactor/tweaks/ObjCLocalizeStringLiteral.cpp

index 4e25219..62a306c 100644 (file)
@@ -63,15 +63,19 @@ bool ObjCLocalizeStringLiteral::prepare(const Selection &Inputs) {
 
 Expected<Tweak::Effect>
 ObjCLocalizeStringLiteral::apply(const Selection &Inputs) {
-  auto &SM = Inputs.AST->getSourceManager();
-  auto &LangOpts = Inputs.AST->getASTContext().getLangOpts();
+  auto *AST = Inputs.AST;
+  auto &SM = AST->getSourceManager();
+  const auto &TB = AST->getTokens();
+  auto Toks = TB.spelledForExpanded(TB.expandedTokens(Str->getSourceRange()));
+  if (!Toks || Toks->empty())
+    return llvm::createStringError(llvm::inconvertibleErrorCode(),
+                                   "Failed to find tokens to replace.");
+  // Insert `NSLocalizedString(` before the literal.
   auto Reps = tooling::Replacements(tooling::Replacement(
-      SM, CharSourceRange::getCharRange(Str->getBeginLoc()),
-      "NSLocalizedString(", LangOpts));
-  SourceLocation EndLoc = Lexer::getLocForEndOfToken(
-      Str->getEndLoc(), 0, Inputs.AST->getSourceManager(), LangOpts);
-  if (auto Err = Reps.add(tooling::Replacement(
-          SM, CharSourceRange::getCharRange(EndLoc), ", @\"\")", LangOpts)))
+      SM, Toks->front().location(), 0, "NSLocalizedString("));
+  // Insert `, @"")` after the literal.
+  if (auto Err = Reps.add(
+          tooling::Replacement(SM, Toks->back().endLocation(), 0, ", @\"\")")))
     return std::move(Err);
   return Effect::mainFileEdit(SM, std::move(Reps));
 }