[clang-tools-extra] 10540e4 - [clangd] Filter out implicit references while renaming
    Kirill Bobyrev via cfe-commits 
    cfe-commits at lists.llvm.org
       
    Thu Feb  6 02:29:03 PST 2020
    
    
  
Author: Kirill Bobyrev
Date: 2020-02-06T11:28:23+01:00
New Revision: 10540e480dfb243d992ff77db14219f696cc774a
URL: https://github.com/llvm/llvm-project/commit/10540e480dfb243d992ff77db14219f696cc774a
DIFF: https://github.com/llvm/llvm-project/commit/10540e480dfb243d992ff77db14219f696cc774a.diff
LOG: [clangd] Filter out implicit references while renaming
This patch is based on D72746 and prevents non-spelled references from
being renamed which would cause incorrect behavior otherwise.
Reviewed by: hokein
Differential Revision: https://reviews.llvm.org/D74112
Added: 
    
Modified: 
    clang-tools-extra/clangd/refactor/Rename.cpp
    clang-tools-extra/clangd/unittests/RenameTests.cpp
Removed: 
    
################################################################################
diff  --git a/clang-tools-extra/clangd/refactor/Rename.cpp b/clang-tools-extra/clangd/refactor/Rename.cpp
index 83f3a02d80d7..31fabc787625 100644
--- a/clang-tools-extra/clangd/refactor/Rename.cpp
+++ b/clang-tools-extra/clangd/refactor/Rename.cpp
@@ -306,6 +306,8 @@ findOccurrencesOutsideFile(const NamedDecl &RenameDecl,
   bool HasMore = Index.refs(RQuest, [&](const Ref &R) {
     if (AffectedFiles.size() > MaxLimitFiles)
       return;
+    if ((R.Kind & RefKind::Spelled) == RefKind::Unknown)
+      return;
     if (auto RefFilePath = filePath(R.Location, /*HintFilePath=*/MainFile)) {
       if (*RefFilePath != MainFile)
         AffectedFiles[*RefFilePath].push_back(toRange(R.Location));
diff  --git a/clang-tools-extra/clangd/unittests/RenameTests.cpp b/clang-tools-extra/clangd/unittests/RenameTests.cpp
index 94f78ac0d977..43e6c778a7ad 100644
--- a/clang-tools-extra/clangd/unittests/RenameTests.cpp
+++ b/clang-tools-extra/clangd/unittests/RenameTests.cpp
@@ -33,7 +33,7 @@ using testing::UnorderedElementsAreArray;
 // Convert a Range to a Ref.
 Ref refWithRange(const clangd::Range &Range, const std::string &URI) {
   Ref Result;
-  Result.Kind = RefKind::Reference;
+  Result.Kind = RefKind::Reference | RefKind::Spelled;
   Result.Location.Start.setLine(Range.start.line);
   Result.Location.Start.setColumn(Range.start.character);
   Result.Location.End.setLine(Range.end.line);
@@ -440,6 +440,23 @@ TEST(RenameTest, WithinFileRename) {
         template <template<typename> class Z> struct Bar { };
         template <> struct Bar<[[Foo]]> {};
       )cpp",
+
+      {
+          // Implicit references in macro expansions.
+          R"cpp(
+        class [[Fo^o]] {};
+        #define FooFoo Foo
+        #define FOO Foo
+      )cpp",
+          R"cpp(
+        #include "foo.h"
+        void bar() {
+          [[Foo]] x;
+          FOO y;
+          FooFoo z;
+        }
+      )cpp",
+      },
   };
   for (llvm::StringRef T : Tests) {
     SCOPED_TRACE(T);
        
    
    
More information about the cfe-commits
mailing list