[PATCH] D70194: [clangd] Ignore more implicit nodes in computing selection.

Sam McCall via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Thu Nov 14 08:43:52 PST 2019


This revision was automatically updated to reflect the committed changes.
Closed by commit rGbbcbb10e2d08: [clangd] Ignore more implicit nodes in computing selection. (authored by sammccall).

Changed prior to commit:
  https://reviews.llvm.org/D70194?vs=229141&id=229319#toc

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70194/new/

https://reviews.llvm.org/D70194

Files:
  clang-tools-extra/clangd/Selection.cpp
  clang-tools-extra/clangd/unittests/SelectionTests.cpp


Index: clang-tools-extra/clangd/unittests/SelectionTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/SelectionTests.cpp
+++ clang-tools-extra/clangd/unittests/SelectionTests.cpp
@@ -213,11 +213,18 @@
       {
           R"cpp(
             struct S {
-              int foo;
-              int bar() { return [[f^oo]]; }
+              int foo() const;
+              int bar() { return [[f^oo]](); }
             };
           )cpp",
-          "MemberExpr", // Not implicit CXXThisExpr!
+          "MemberExpr", // Not implicit CXXThisExpr, or its implicit cast!
+      },
+      {
+          R"cpp(
+            auto lambda = [](const char*){ return 0; };
+            int x = lambda([["y^"]]);
+          )cpp",
+          "StringLiteral", // Not DeclRefExpr to operator()!
       },
 
       // Point selections.
Index: clang-tools-extra/clangd/Selection.cpp
===================================================================
--- clang-tools-extra/clangd/Selection.cpp
+++ clang-tools-extra/clangd/Selection.cpp
@@ -10,9 +10,11 @@
 #include "Logger.h"
 #include "SourceCode.h"
 #include "clang/AST/ASTTypeTraits.h"
+#include "clang/AST/Expr.h"
 #include "clang/AST/PrettyPrinter.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/AST/TypeLoc.h"
+#include "clang/Basic/OperatorKinds.h"
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Basic/TokenKinds.h"
@@ -145,6 +147,32 @@
 }
 #endif
 
+bool isImplicit(const Stmt* S) {
+  // Some Stmts are implicit and shouldn't be traversed, but there's no
+  // "implicit" attribute on Stmt/Expr.
+  // Unwrap implicit casts first if present (other nodes too?).
+  if (auto *ICE = llvm::dyn_cast<ImplicitCastExpr>(S))
+    S = ICE->getSubExprAsWritten();
+  // Implicit this in a MemberExpr is not filtered out by RecursiveASTVisitor.
+  // It would be nice if RAV handled this (!shouldTraverseImplicitCode()).
+  if (auto *CTI = llvm::dyn_cast<CXXThisExpr>(S))
+    if (CTI->isImplicit())
+      return true;
+  // Refs to operator() and [] are (almost?) always implicit as part of calls.
+  if (auto *DRE = llvm::dyn_cast<DeclRefExpr>(S)) {
+    if (auto *FD = llvm::dyn_cast<FunctionDecl>(DRE->getDecl())) {
+      switch (FD->getOverloadedOperator()) {
+      case OO_Call:
+      case OO_Subscript:
+        return true;
+      default:
+        break;
+      }
+    }
+  }
+  return false;
+}
+
 // We find the selection by visiting written nodes in the AST, looking for nodes
 // that intersect with the selected character range.
 //
@@ -210,13 +238,8 @@
   }
   // Stmt is the same, but this form allows the data recursion optimization.
   bool dataTraverseStmtPre(Stmt *X) {
-    if (!X)
+    if (!X || isImplicit(X))
       return false;
-    // Implicit this in a MemberExpr is not filtered out by RecursiveASTVisitor.
-    // It would be nice if RAV handled this (!shouldTRaverseImplicitCode()).
-    if (auto *CTI = llvm::dyn_cast<CXXThisExpr>(X))
-      if (CTI->isImplicit())
-        return false;
     auto N = DynTypedNode::create(*X);
     if (canSafelySkipNode(N))
       return false;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D70194.229319.patch
Type: text/x-patch
Size: 3180 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20191114/639a9146/attachment-0001.bin>


More information about the cfe-commits mailing list