https://github.com/HighCommander4 updated 
https://github.com/llvm/llvm-project/pull/125153

>From 656a47976d1b8699d5f6e0b0b9421866804c8eb2 Mon Sep 17 00:00:00 2001
From: Nathan Ridge <zeratul...@hotmail.com>
Date: Thu, 30 Jan 2025 21:31:12 -0500
Subject: [PATCH] [clang][Index] Use HeuristicResolver in libIndex

The uses replace hand-rolled code that did a subset of what
HeuristicResolver does.
---
 clang/lib/Index/CMakeLists.txt                |  1 +
 clang/lib/Index/IndexBody.cpp                 | 49 ++++++-------------
 clang/lib/Index/IndexingContext.cpp           | 12 +++++
 clang/lib/Index/IndexingContext.h             | 10 ++--
 .../Index/Core/index-dependent-source.cpp     | 22 ++++-----
 5 files changed, 47 insertions(+), 47 deletions(-)

diff --git a/clang/lib/Index/CMakeLists.txt b/clang/lib/Index/CMakeLists.txt
index b4e294304f115..f0d2b579c8df6 100644
--- a/clang/lib/Index/CMakeLists.txt
+++ b/clang/lib/Index/CMakeLists.txt
@@ -23,6 +23,7 @@ add_clang_library(clangIndex
   clangFormat
   clangFrontend
   clangLex
+  clangSema
   clangSerialization
   clangToolingCore
 
diff --git a/clang/lib/Index/IndexBody.cpp b/clang/lib/Index/IndexBody.cpp
index f1dc4d5831ce7..8b4a8889a9e65 100644
--- a/clang/lib/Index/IndexBody.cpp
+++ b/clang/lib/Index/IndexBody.cpp
@@ -13,6 +13,7 @@
 #include "clang/AST/ExprConcepts.h"
 #include "clang/AST/RecursiveASTVisitor.h"
 #include "clang/AST/Type.h"
+#include "clang/Sema/HeuristicResolver.h"
 
 using namespace clang;
 using namespace clang::index;
@@ -168,51 +169,33 @@ class BodyIndexer : public 
RecursiveASTVisitor<BodyIndexer> {
                                     Parent, ParentDC, Roles, Relations, E);
   }
 
-  bool indexDependentReference(
-      const Expr *E, const Type *T, const DeclarationNameInfo &NameInfo,
-      llvm::function_ref<bool(const NamedDecl *ND)> Filter) {
-    if (!T)
-      return true;
-    const TemplateSpecializationType *TST =
-        T->getAs<TemplateSpecializationType>();
-    if (!TST)
-      return true;
-    TemplateName TN = TST->getTemplateName();
-    const ClassTemplateDecl *TD =
-        dyn_cast_or_null<ClassTemplateDecl>(TN.getAsTemplateDecl());
-    if (!TD)
-      return true;
-    CXXRecordDecl *RD = TD->getTemplatedDecl();
-    if (!RD->hasDefinition())
-      return true;
-    RD = RD->getDefinition();
-    std::vector<const NamedDecl *> Symbols =
-        RD->lookupDependentName(NameInfo.getName(), Filter);
+  bool indexDependentReference(const Expr *E, SourceLocation Loc,
+                               std::vector<const NamedDecl *> TargetSymbols) {
     // FIXME: Improve overload handling.
-    if (Symbols.size() != 1)
+    if (TargetSymbols.size() != 1)
       return true;
-    SourceLocation Loc = NameInfo.getLoc();
     if (Loc.isInvalid())
       Loc = E->getBeginLoc();
     SmallVector<SymbolRelation, 4> Relations;
     SymbolRoleSet Roles = getRolesForRef(E, Relations);
-    return IndexCtx.handleReference(Symbols[0], Loc, Parent, ParentDC, Roles,
-                                    Relations, E);
+    return IndexCtx.handleReference(TargetSymbols[0], Loc, Parent, ParentDC,
+                                    Roles, Relations, E);
   }
 
   bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) {
-    const DeclarationNameInfo &Info = E->getMemberNameInfo();
-    return indexDependentReference(
-        E, E->getBaseType().getTypePtrOrNull(), Info,
-        [](const NamedDecl *D) { return D->isCXXInstanceMember(); });
+    auto *Resolver = IndexCtx.getResolver();
+    if (!Resolver)
+      return true;
+    return indexDependentReference(E, E->getMemberNameInfo().getLoc(),
+                                   Resolver->resolveMemberExpr(E));
   }
 
   bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) {
-    const DeclarationNameInfo &Info = E->getNameInfo();
-    const NestedNameSpecifier *NNS = E->getQualifier();
-    return indexDependentReference(
-        E, NNS->getAsType(), Info,
-        [](const NamedDecl *D) { return !D->isCXXInstanceMember(); });
+    auto *Resolver = IndexCtx.getResolver();
+    if (!Resolver)
+      return true;
+    return indexDependentReference(E, E->getNameInfo().getLoc(),
+                                   Resolver->resolveDeclRefExpr(E));
   }
 
   bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {
diff --git a/clang/lib/Index/IndexingContext.cpp 
b/clang/lib/Index/IndexingContext.cpp
index 2dd68dfcc5a70..bdd6c5acf1d34 100644
--- a/clang/lib/Index/IndexingContext.cpp
+++ b/clang/lib/Index/IndexingContext.cpp
@@ -14,6 +14,7 @@
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManager.h"
 #include "clang/Index/IndexDataConsumer.h"
+#include "clang/Sema/HeuristicResolver.h"
 
 using namespace clang;
 using namespace index;
@@ -25,6 +26,17 @@ static bool isGeneratedDecl(const Decl *D) {
   return false;
 }
 
+IndexingContext::IndexingContext(IndexingOptions IndexOpts,
+                                 IndexDataConsumer &DataConsumer)
+    : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
+
+IndexingContext::~IndexingContext() = default;
+
+void IndexingContext::setASTContext(ASTContext &ctx) {
+  Ctx = &ctx;
+  Resolver = Ctx ? std::make_unique<HeuristicResolver>(*Ctx) : nullptr;
+}
+
 bool IndexingContext::shouldIndex(const Decl *D) {
   return !isGeneratedDecl(D);
 }
diff --git a/clang/lib/Index/IndexingContext.h 
b/clang/lib/Index/IndexingContext.h
index 3020b33bea385..01bfcb9d578bc 100644
--- a/clang/lib/Index/IndexingContext.h
+++ b/clang/lib/Index/IndexingContext.h
@@ -21,6 +21,7 @@ namespace clang {
   class Decl;
   class DeclGroupRef;
   class ImportDecl;
+  class HeuristicResolver;
   class TagDecl;
   class TypeSourceInfo;
   class NamedDecl;
@@ -39,15 +40,18 @@ class IndexingContext {
   IndexingOptions IndexOpts;
   IndexDataConsumer &DataConsumer;
   ASTContext *Ctx = nullptr;
+  std::unique_ptr<HeuristicResolver> Resolver;
 
 public:
-  IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer)
-    : IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
+  IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer);
+  ~IndexingContext();
 
   const IndexingOptions &getIndexOpts() const { return IndexOpts; }
   IndexDataConsumer &getDataConsumer() { return DataConsumer; }
 
-  void setASTContext(ASTContext &ctx) { Ctx = &ctx; }
+  void setASTContext(ASTContext &ctx);
+
+  HeuristicResolver *getResolver() const { return Resolver.get(); }
 
   bool shouldIndex(const Decl *D);
 
diff --git a/clang/test/Index/Core/index-dependent-source.cpp 
b/clang/test/Index/Core/index-dependent-source.cpp
index 8fec9abd1e926..ef414c8fdf7a0 100644
--- a/clang/test/Index/Core/index-dependent-source.cpp
+++ b/clang/test/Index/Core/index-dependent-source.cpp
@@ -3,7 +3,7 @@
 int invalid;
 
 class Base {
-  void baseFunction();
+  void baseFunction() const;
 
   int baseField;
 
@@ -13,7 +13,7 @@ class Base {
 template<typename T>
 class BaseTemplate {
 public:
-  T baseTemplateFunction();
+  T baseTemplateFunction() const;
 
   T baseTemplateField;
 
@@ -25,7 +25,7 @@ class TemplateClass: public Base , public BaseTemplate<T> {
 public:
   ~TemplateClass();
 
-  T function() { }
+  T function() const { }
 
   static void staticFunction() { }
 
@@ -48,27 +48,27 @@ template<typename T, typename S>
 void indexSimpleDependentDeclarations(const TemplateClass<T, S> &object) {
   // Valid instance members:
   object.function();
-// CHECK: [[@LINE-1]]:10 | instance-method/C++ | function | 
c:@ST>2#T#T@TemplateClass@F@function# | <no-cgname> | Ref,Call,RelCall,RelCont 
| rel: 1
+// CHECK: [[@LINE-1]]:10 | instance-method/C++ | function | 
c:@ST>2#T#T@TemplateClass@F@function#1 | <no-cgname> | Ref,Call,RelCall,RelCont 
| rel: 1
   object.field;
 // CHECK: [[@LINE-1]]:10 | field/C++ | field | 
c:@ST>2#T#T@TemplateClass@FI@field | <no-cgname> | Ref,RelCont | rel: 1
   object.baseFunction();
-// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseFunction | 
c:@S@Base@F@baseFunction# | __ZN4Base12baseFunctionEv | 
Ref,Call,RelCall,RelCont | rel: 1
+// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseFunction | 
c:@S@Base@F@baseFunction#1 | __ZNK4Base12baseFunctionEv | 
Ref,Call,RelCall,RelCont | rel: 1
   object.baseField;
 // CHECK: [[@LINE-1]]:10 | field/C++ | baseField | c:@S@Base@FI@baseField | 
<no-cgname> | Ref,RelCont | rel: 1
   object.baseTemplateFunction();
-// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseTemplateFunction | 
c:@ST>1#T@BaseTemplate@F@baseTemplateFunction# | <no-cgname> | 
Ref,Call,RelCall,RelCont | rel: 1
+// CHECK: [[@LINE-1]]:10 | instance-method/C++ | baseTemplateFunction | 
c:@ST>1#T@BaseTemplate@F@baseTemplateFunction#1 | <no-cgname> | 
Ref,Call,RelCall,RelCont | rel: 1
   object.baseTemplateField;
 // CHECK: [[@LINE-1]]:10 | field/C++ | baseTemplateField | 
c:@ST>1#T@BaseTemplate@FI@baseTemplateField | <no-cgname> | Ref,RelCont | rel: 1
 
-  // Invalid instance members:
+  // Static members (these are still valid to access via an instance):
   object.variable;
-// CHECK-NOT: [[@LINE-1]]:10
+// CHECK: [[@LINE-1]]:10 | static-property/C++ | variable | 
c:@ST>2#T#T@TemplateClass@variable | __ZN13TemplateClass8variableE | 
Ref,RelCont | rel: 1
   object.staticFunction();
-// CHECK-NOT: [[@LINE-1]]:10
+// CHECK: [[@LINE-1]]:10 | static-method/C++ | staticFunction | 
c:@ST>2#T#T@TemplateClass@F@staticFunction#S | <no-cgname> | 
Ref,Call,RelCall,RelCont | rel: 1
   object.Struct;
-// CHECK-NOT: [[@LINE-1]]:10
+// CHECK: [[@LINE-1]]:10 | struct/C | Struct | 
c:@ST>2#T#T@TemplateClass@S@Struct | <no-cgname> | Ref,RelCont | rel: 1
   object.EnumValue;
-// CHECK-NOT: [[@LINE-1]]:10
+// CHECK: [[@LINE-1]]:10 | enumerator/C | EnumValue | 
c:@ST>2#T#T@TemplateClass@E@Enum@EnumValue | <no-cgname> | Ref,RelCont | rel: 1
 
   // Valid static members:
   TemplateClass<T, S>::staticFunction();

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to