|
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