|
13 | 13 | #include "clang/AST/ExprConcepts.h" |
14 | 14 | #include "clang/AST/RecursiveASTVisitor.h" |
15 | 15 | #include "clang/AST/Type.h" |
| 16 | +#include "clang/Sema/HeuristicResolver.h" |
16 | 17 |
|
17 | 18 | using namespace clang; |
18 | 19 | using namespace clang::index; |
@@ -165,51 +166,33 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> { |
165 | 166 | Parent, ParentDC, Roles, Relations, E); |
166 | 167 | } |
167 | 168 |
|
168 | | - bool indexDependentReference( |
169 | | - const Expr *E, const Type *T, const DeclarationNameInfo &NameInfo, |
170 | | - llvm::function_ref<bool(const NamedDecl *ND)> Filter) { |
171 | | - if (!T) |
172 | | - return true; |
173 | | - const TemplateSpecializationType *TST = |
174 | | - T->getAs<TemplateSpecializationType>(); |
175 | | - if (!TST) |
176 | | - return true; |
177 | | - TemplateName TN = TST->getTemplateName(); |
178 | | - const ClassTemplateDecl *TD = |
179 | | - dyn_cast_or_null<ClassTemplateDecl>(TN.getAsTemplateDecl()); |
180 | | - if (!TD) |
181 | | - return true; |
182 | | - CXXRecordDecl *RD = TD->getTemplatedDecl(); |
183 | | - if (!RD->hasDefinition()) |
184 | | - return true; |
185 | | - RD = RD->getDefinition(); |
186 | | - std::vector<const NamedDecl *> Symbols = |
187 | | - RD->lookupDependentName(NameInfo.getName(), Filter); |
| 169 | + bool indexDependentReference(const Expr *E, SourceLocation Loc, |
| 170 | + std::vector<const NamedDecl *> TargetSymbols) { |
188 | 171 | // FIXME: Improve overload handling. |
189 | | - if (Symbols.size() != 1) |
| 172 | + if (TargetSymbols.size() != 1) |
190 | 173 | return true; |
191 | | - SourceLocation Loc = NameInfo.getLoc(); |
192 | 174 | if (Loc.isInvalid()) |
193 | 175 | Loc = E->getBeginLoc(); |
194 | 176 | SmallVector<SymbolRelation, 4> Relations; |
195 | 177 | SymbolRoleSet Roles = getRolesForRef(E, Relations); |
196 | | - return IndexCtx.handleReference(Symbols[0], Loc, Parent, ParentDC, Roles, |
197 | | - Relations, E); |
| 178 | + return IndexCtx.handleReference(TargetSymbols[0], Loc, Parent, ParentDC, |
| 179 | + Roles, Relations, E); |
198 | 180 | } |
199 | 181 |
|
200 | 182 | bool VisitCXXDependentScopeMemberExpr(CXXDependentScopeMemberExpr *E) { |
201 | | - const DeclarationNameInfo &Info = E->getMemberNameInfo(); |
202 | | - return indexDependentReference( |
203 | | - E, E->getBaseType().getTypePtrOrNull(), Info, |
204 | | - [](const NamedDecl *D) { return D->isCXXInstanceMember(); }); |
| 183 | + auto *Resolver = IndexCtx.getResolver(); |
| 184 | + if (!Resolver) |
| 185 | + return true; |
| 186 | + return indexDependentReference(E, E->getMemberNameInfo().getLoc(), |
| 187 | + Resolver->resolveMemberExpr(E)); |
205 | 188 | } |
206 | 189 |
|
207 | 190 | bool VisitDependentScopeDeclRefExpr(DependentScopeDeclRefExpr *E) { |
208 | | - const DeclarationNameInfo &Info = E->getNameInfo(); |
209 | | - const NestedNameSpecifier *NNS = E->getQualifier(); |
210 | | - return indexDependentReference( |
211 | | - E, NNS->getAsType(), Info, |
212 | | - [](const NamedDecl *D) { return !D->isCXXInstanceMember(); }); |
| 191 | + auto *Resolver = IndexCtx.getResolver(); |
| 192 | + if (!Resolver) |
| 193 | + return true; |
| 194 | + return indexDependentReference(E, E->getNameInfo().getLoc(), |
| 195 | + Resolver->resolveDeclRefExpr(E)); |
213 | 196 | } |
214 | 197 |
|
215 | 198 | bool VisitDesignatedInitExpr(DesignatedInitExpr *E) { |
|
0 commit comments