RewriterTest.cpp 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. //===- unittests/Rewrite/RewriterTest.cpp - Rewriter tests ----------------===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "clang/Rewrite/Core/Rewriter.h"
  9. #include "clang/Tooling/Tooling.h"
  10. #include "gtest/gtest.h"
  11. using namespace clang;
  12. namespace {
  13. struct RangeTypeTest {
  14. std::unique_ptr<ASTUnit> AST;
  15. Rewriter Rewrite;
  16. SourceLocation FileStart;
  17. CharSourceRange CRange; // covers exact char range
  18. CharSourceRange TRange; // extends CRange to whole tokens
  19. SourceRange SRange; // different type but behaves like TRange
  20. SourceLocation makeLoc(int Off) { return FileStart.getLocWithOffset(Off); }
  21. CharSourceRange makeCharRange(int StartOff, int EndOff) {
  22. return CharSourceRange::getCharRange(makeLoc(StartOff), makeLoc(EndOff));
  23. }
  24. RangeTypeTest(StringRef Code, int StartOff, int EndOff) {
  25. AST = tooling::buildASTFromCode(Code);
  26. ASTContext &C = AST->getASTContext();
  27. Rewrite = Rewriter(C.getSourceManager(), C.getLangOpts());
  28. FileStart = AST->getStartOfMainFileID();
  29. CRange = makeCharRange(StartOff, EndOff);
  30. SRange = CRange.getAsRange();
  31. TRange = CharSourceRange::getTokenRange(SRange);
  32. }
  33. };
  34. TEST(Rewriter, GetRewrittenTextRangeTypes) {
  35. // Check that correct text is retrieved for each range type. Check again
  36. // after a modification. Ranges remain in terms of the original text but
  37. // include the new text.
  38. StringRef Code = "int main() { return 0; }";
  39. // get char range ^~~ = "ret"
  40. // get token range ^~~+++ = "return"
  41. // get source range ^~~+++ = "return"
  42. // insert "x" ^
  43. // get char range ^~~ = "xret"
  44. // get token range ^~~+++ = "xreturn"
  45. // get source range ^~~+++ = "xreturn"
  46. RangeTypeTest T(Code, 13, 16);
  47. EXPECT_EQ(T.Rewrite.getRewrittenText(T.CRange), "ret");
  48. EXPECT_EQ(T.Rewrite.getRewrittenText(T.TRange), "return");
  49. EXPECT_EQ(T.Rewrite.getRewrittenText(T.SRange), "return");
  50. T.Rewrite.InsertText(T.makeLoc(13), "x");
  51. EXPECT_EQ(T.Rewrite.getRewrittenText(T.CRange), "xret");
  52. EXPECT_EQ(T.Rewrite.getRewrittenText(T.TRange), "xreturn");
  53. EXPECT_EQ(T.Rewrite.getRewrittenText(T.SRange), "xreturn");
  54. }
  55. TEST(Rewriter, ReplaceTextRangeTypes) {
  56. // Check that correct text is replaced for each range type. Ranges remain in
  57. // terms of the original text but include the new text.
  58. StringRef Code = "int main(int argc, char *argv[]) { return argc; }";
  59. // replace char range with "foo" ^~
  60. // get ^~~~~ = "foogc;"
  61. // replace token range with "bar" ^~++
  62. // get ^~~~~ = "bar;"
  63. // replace source range with "0" ^~++
  64. // get ^~~~~ = "0;"
  65. RangeTypeTest T(Code, 42, 44);
  66. T.Rewrite.ReplaceText(T.CRange, "foo");
  67. EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "foogc;");
  68. T.Rewrite.ReplaceText(T.TRange, "bar");
  69. EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "bar;");
  70. T.Rewrite.ReplaceText(T.SRange, "0");
  71. EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "0;");
  72. }
  73. } // anonymous namespace