| //===- unittests/Rewrite/RewriterTest.cpp - Rewriter tests ----------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #include "clang/Rewrite/Core/Rewriter.h" |
| #include "clang/Tooling/Tooling.h" |
| #include "gtest/gtest.h" |
| |
| using namespace clang; |
| |
| namespace { |
| |
| struct RangeTypeTest { |
| std::unique_ptr<ASTUnit> AST; |
| Rewriter Rewrite; |
| SourceLocation FileStart; |
| CharSourceRange CRange; // covers exact char range |
| CharSourceRange TRange; // extends CRange to whole tokens |
| SourceRange SRange; // different type but behaves like TRange |
| SourceLocation makeLoc(int Off) { return FileStart.getLocWithOffset(Off); } |
| CharSourceRange makeCharRange(int StartOff, int EndOff) { |
| return CharSourceRange::getCharRange(makeLoc(StartOff), makeLoc(EndOff)); |
| } |
| RangeTypeTest(StringRef Code, int StartOff, int EndOff) { |
| AST = tooling::buildASTFromCode(Code); |
| ASTContext &C = AST->getASTContext(); |
| Rewrite = Rewriter(C.getSourceManager(), C.getLangOpts()); |
| FileStart = AST->getStartOfMainFileID(); |
| CRange = makeCharRange(StartOff, EndOff); |
| SRange = CRange.getAsRange(); |
| TRange = CharSourceRange::getTokenRange(SRange); |
| } |
| }; |
| |
| TEST(Rewriter, GetRewrittenTextRangeTypes) { |
| // Check that correct text is retrieved for each range type. Check again |
| // after a modification. Ranges remain in terms of the original text but |
| // include the new text. |
| StringRef Code = "int main() { return 0; }"; |
| // get char range ^~~ = "ret" |
| // get token range ^~~+++ = "return" |
| // get source range ^~~+++ = "return" |
| // insert "x" ^ |
| // get char range ^~~ = "xret" |
| // get token range ^~~+++ = "xreturn" |
| // get source range ^~~+++ = "xreturn" |
| RangeTypeTest T(Code, 13, 16); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.CRange), "ret"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.TRange), "return"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.SRange), "return"); |
| T.Rewrite.InsertText(T.makeLoc(13), "x"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.CRange), "xret"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.TRange), "xreturn"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.SRange), "xreturn"); |
| } |
| |
| TEST(Rewriter, ReplaceTextRangeTypes) { |
| // Check that correct text is replaced for each range type. Ranges remain in |
| // terms of the original text but include the new text. |
| StringRef Code = "int main(int argc, char *argv[]) { return argc; }"; |
| // replace char range with "foo" ^~ |
| // get ^~~~~ = "foogc;" |
| // replace token range with "bar" ^~++ |
| // get ^~~~~ = "bar;" |
| // replace source range with "0" ^~++ |
| // get ^~~~~ = "0;" |
| RangeTypeTest T(Code, 42, 44); |
| T.Rewrite.ReplaceText(T.CRange, "foo"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "foogc;"); |
| T.Rewrite.ReplaceText(T.TRange, "bar"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "bar;"); |
| T.Rewrite.ReplaceText(T.SRange, "0"); |
| EXPECT_EQ(T.Rewrite.getRewrittenText(T.makeCharRange(42, 47)), "0;"); |
| } |
| |
| } // anonymous namespace |