]> granicus.if.org Git - clang/commitdiff
Add `replace` interface with range in AtomicChange.
authorHaojian Wu <hokein@google.com>
Thu, 30 Mar 2017 13:07:38 +0000 (13:07 +0000)
committerHaojian Wu <hokein@google.com>
Thu, 30 Mar 2017 13:07:38 +0000 (13:07 +0000)
Reviewers: ioeric

Reviewed By: ioeric

Subscribers: alexshap, klimek, cfe-commits

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

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@299073 91177308-0d34-0410-b5e6-96231b3b80d8

include/clang/Tooling/Refactoring/AtomicChange.h
lib/Tooling/Refactoring/AtomicChange.cpp
unittests/Tooling/RefactoringTest.cpp

index f437c4ba41fd10e13ef8fee3c8222f81a8f4f5ea..9cccd78677b1535da047274a57083389ba5f2446 100644 (file)
@@ -70,6 +70,12 @@ public:
   /// \brief Returns the error message or an empty string if it does not exist.
   const std::string &getError() const { return Error; }
 
+  /// \brief Adds a replacement that replaces the given Range with
+  /// ReplacementText.
+  /// \returns An llvm::Error carrying ReplacementError on error.
+  llvm::Error replace(const SourceManager &SM, const CharSourceRange &Range,
+                      llvm::StringRef ReplacementText);
+
   /// \brief Adds a replacement that replaces range [Loc, Loc+Length) with
   /// \p Text.
   /// \returns An llvm::Error carrying ReplacementError on error.
index 02c55100ffb690ea4bf78821e998d96f70f119cf..321bbfa2866aed70f200da9d3bc8df181415ec96 100644 (file)
@@ -132,6 +132,12 @@ AtomicChange AtomicChange::convertFromYAML(llvm::StringRef YAMLContent) {
   return E;
 }
 
+llvm::Error AtomicChange::replace(const SourceManager &SM,
+                                  const CharSourceRange &Range,
+                                  llvm::StringRef ReplacementText) {
+  return Replaces.add(Replacement(SM, Range, ReplacementText));
+}
+
 llvm::Error AtomicChange::replace(const SourceManager &SM, SourceLocation Loc,
                                   unsigned Length, llvm::StringRef Text) {
   return Replaces.add(Replacement(SM, Loc, Length, Text));
index c5633d36ed49992fb6d3a4b1d5a471d69af1529a..495ac755b39d9f0f3a2dcc056440d6561ce68622 100644 (file)
@@ -1092,7 +1092,7 @@ TEST(DeduplicateByFileTest, NonExistingFilePath) {
 
 class AtomicChangeTest : public ::testing::Test {
   protected:
-    void setUp() {
+    void SetUp() override {
       DefaultFileID = Context.createInMemoryFile("input.cpp", DefaultCode);
       DefaultLoc = Context.Sources.getLocForStartOfFile(DefaultFileID)
                        .getLocWithOffset(20);
@@ -1107,7 +1107,6 @@ class AtomicChangeTest : public ::testing::Test {
 };
 
 TEST_F(AtomicChangeTest, AtomicChangeToYAML) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err =
       Change.insert(Context.Sources, DefaultLoc, "aa", /*InsertAfter=*/false);
@@ -1140,7 +1139,6 @@ TEST_F(AtomicChangeTest, AtomicChangeToYAML) {
 }
 
 TEST_F(AtomicChangeTest, YAMLToAtomicChange) {
-  setUp();
   std::string YamlContent = "---\n"
                             "Key:             'input.cpp:20'\n"
                             "FilePath:        input.cpp\n"
@@ -1187,14 +1185,12 @@ TEST_F(AtomicChangeTest, YAMLToAtomicChange) {
 }
 
 TEST_F(AtomicChangeTest, CheckKeyAndKeyFile) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   EXPECT_EQ("input.cpp:20", Change.getKey());
   EXPECT_EQ("input.cpp", Change.getFilePath());
 }
 
 TEST_F(AtomicChangeTest, Replace) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err = Change.replace(Context.Sources, DefaultLoc, 2, "aa");
   ASSERT_TRUE(!Err);
@@ -1209,8 +1205,18 @@ TEST_F(AtomicChangeTest, Replace) {
   EXPECT_EQ(Change.getReplacements().size(), 1u);
 }
 
+TEST_F(AtomicChangeTest, ReplaceWithRange) {
+  AtomicChange Change(Context.Sources, DefaultLoc);
+  SourceLocation End = DefaultLoc.getLocWithOffset(20);
+  llvm::Error Err = Change.replace(
+      Context.Sources, CharSourceRange::getCharRange(DefaultLoc, End), "aa");
+  ASSERT_TRUE(!Err);
+  EXPECT_EQ(Change.getReplacements().size(), 1u);
+  EXPECT_EQ(*Change.getReplacements().begin(),
+            Replacement(Context.Sources, DefaultLoc, 20, "aa"));
+}
+
 TEST_F(AtomicChangeTest, InsertBefore) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err = Change.insert(Context.Sources, DefaultLoc, "aa");
   ASSERT_TRUE(!Err);
@@ -1225,7 +1231,6 @@ TEST_F(AtomicChangeTest, InsertBefore) {
 }
 
 TEST_F(AtomicChangeTest, InsertAfter) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err = Change.insert(Context.Sources, DefaultLoc, "aa");
   ASSERT_TRUE(!Err);
@@ -1240,7 +1245,6 @@ TEST_F(AtomicChangeTest, InsertAfter) {
 }
 
 TEST_F(AtomicChangeTest, InsertBeforeWithInvalidLocation) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err =
       Change.insert(Context.Sources, DefaultLoc, "a", /*InsertAfter=*/false);
@@ -1254,11 +1258,9 @@ TEST_F(AtomicChangeTest, InsertBeforeWithInvalidLocation) {
       std::move(Err), replacement_error::wrong_file_path,
       Replacement(Context.Sources, DefaultLoc, 0, "a"),
       Replacement(Context.Sources, SourceLocation(), 0, "a")));
-
 }
 
 TEST_F(AtomicChangeTest, InsertBeforeToWrongFile) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err =
       Change.insert(Context.Sources, DefaultLoc, "a", /*InsertAfter=*/false);
@@ -1276,7 +1278,6 @@ TEST_F(AtomicChangeTest, InsertBeforeToWrongFile) {
 }
 
 TEST_F(AtomicChangeTest, InsertAfterWithInvalidLocation) {
-  setUp();
   AtomicChange Change(Context.Sources, DefaultLoc);
   llvm::Error Err = Change.insert(Context.Sources, DefaultLoc, "a");
   ASSERT_TRUE(!Err);