|
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