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