ArcsinX created this revision.
Herald added subscribers: cfe-commits, usaxena95, kadircet, arphaman, jkorous, 
MaskRay, ilya-biryukov.
Herald added a project: clang.

This patch fixes redundant hover with information about Decl which is not under 
cursor.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D83508

Files:
  clang-tools-extra/clangd/Hover.cpp
  clang-tools-extra/clangd/unittests/HoverTests.cpp


Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -942,6 +942,13 @@
           template <typename T> void foo() {
             (void)[[size^of]](T);
           })cpp",
+      R"cpp(// No Decl for token under cursor.
+          namespace ns {
+          #define FOO B^AR;
+          })cpp",
+      R"cpp(//error-ok
+          unknown f(i^nt);
+      )cpp",
       // literals
       "auto x = t^rue;",
       "auto x = '^A';",
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -820,6 +820,18 @@
         SelectionTree::createRight(AST.getASTContext(), TB, Offset, Offset);
     std::vector<const Decl *> Result;
     if (const SelectionTree::Node *N = ST.commonAncestor()) {
+      // Don't allow Decls which are not related with tokens under cursor.
+      if (const auto *D = N->ASTNode.get<Decl>()) {
+        bool IsDeclTouchingCursor = false;
+        for (const auto &Tok : TokensTouchingCursor) {
+          if (D->getLocation() == Tok.location()) {
+            IsDeclTouchingCursor = true;
+            break;
+          }
+        }
+        if (!IsDeclTouchingCursor)
+          return llvm::None;
+      }
       // FIXME: Fill in HighlightRange with range coming from N->ASTNode.
       auto Decls = explicitReferenceTargets(N->ASTNode, DeclRelation::Alias);
       if (!Decls.empty()) {


Index: clang-tools-extra/clangd/unittests/HoverTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/HoverTests.cpp
+++ clang-tools-extra/clangd/unittests/HoverTests.cpp
@@ -942,6 +942,13 @@
           template <typename T> void foo() {
             (void)[[size^of]](T);
           })cpp",
+      R"cpp(// No Decl for token under cursor.
+          namespace ns {
+          #define FOO B^AR;
+          })cpp",
+      R"cpp(//error-ok
+          unknown f(i^nt);
+      )cpp",
       // literals
       "auto x = t^rue;",
       "auto x = '^A';",
Index: clang-tools-extra/clangd/Hover.cpp
===================================================================
--- clang-tools-extra/clangd/Hover.cpp
+++ clang-tools-extra/clangd/Hover.cpp
@@ -820,6 +820,18 @@
         SelectionTree::createRight(AST.getASTContext(), TB, Offset, Offset);
     std::vector<const Decl *> Result;
     if (const SelectionTree::Node *N = ST.commonAncestor()) {
+      // Don't allow Decls which are not related with tokens under cursor.
+      if (const auto *D = N->ASTNode.get<Decl>()) {
+        bool IsDeclTouchingCursor = false;
+        for (const auto &Tok : TokensTouchingCursor) {
+          if (D->getLocation() == Tok.location()) {
+            IsDeclTouchingCursor = true;
+            break;
+          }
+        }
+        if (!IsDeclTouchingCursor)
+          return llvm::None;
+      }
       // FIXME: Fill in HighlightRange with range coming from N->ASTNode.
       auto Decls = explicitReferenceTargets(N->ASTNode, DeclRelation::Alias);
       if (!Decls.empty()) {
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to