Skip to content

Commit ddb04e5

Browse files
[clang][Index] Use HeuristicResolver in libIndex
1 parent 33c42f8 commit ddb04e5

File tree

4 files changed

+36
-36
lines changed

4 files changed

+36
-36
lines changed

clang/lib/Index/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ add_clang_library(clangIndex
2323
clangFormat
2424
clangFrontend
2525
clangLex
26+
clangSema
2627
clangSerialization
2728
clangToolingCore
2829

clang/lib/Index/IndexBody.cpp

Lines changed: 16 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "clang/AST/ExprConcepts.h"
1414
#include "clang/AST/RecursiveASTVisitor.h"
1515
#include "clang/AST/Type.h"
16+
#include "clang/Sema/HeuristicResolver.h"
1617

1718
using namespace clang;
1819
using namespace clang::index;
@@ -165,51 +166,33 @@ class BodyIndexer : public RecursiveASTVisitor<BodyIndexer> {
165166
Parent, ParentDC, Roles, Relations, E);
166167
}
167168

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) {
188171
// FIXME: Improve overload handling.
189-
if (Symbols.size() != 1)
172+
if (TargetSymbols.size() != 1)
190173
return true;
191-
SourceLocation Loc = NameInfo.getLoc();
192174
if (Loc.isInvalid())
193175
Loc = E->getBeginLoc();
194176
SmallVector<SymbolRelation, 4> Relations;
195177
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);
198180
}
199181

200182
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));
205188
}
206189

207190
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));
213196
}
214197

215198
bool VisitDesignatedInitExpr(DesignatedInitExpr *E) {

clang/lib/Index/IndexingContext.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "clang/Basic/SourceLocation.h"
1515
#include "clang/Basic/SourceManager.h"
1616
#include "clang/Index/IndexDataConsumer.h"
17+
#include "clang/Sema/HeuristicResolver.h"
1718

1819
using namespace clang;
1920
using namespace index;
@@ -25,6 +26,17 @@ static bool isGeneratedDecl(const Decl *D) {
2526
return false;
2627
}
2728

29+
IndexingContext::IndexingContext(IndexingOptions IndexOpts,
30+
IndexDataConsumer &DataConsumer)
31+
: IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
32+
33+
IndexingContext::~IndexingContext() = default;
34+
35+
void IndexingContext::setASTContext(ASTContext &ctx) {
36+
Ctx = &ctx;
37+
Resolver = Ctx ? std::make_unique<HeuristicResolver>(*Ctx) : nullptr;
38+
}
39+
2840
bool IndexingContext::shouldIndex(const Decl *D) {
2941
return !isGeneratedDecl(D);
3042
}

clang/lib/Index/IndexingContext.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace clang {
2121
class Decl;
2222
class DeclGroupRef;
2323
class ImportDecl;
24+
class HeuristicResolver;
2425
class TagDecl;
2526
class TypeSourceInfo;
2627
class NamedDecl;
@@ -39,15 +40,18 @@ class IndexingContext {
3940
IndexingOptions IndexOpts;
4041
IndexDataConsumer &DataConsumer;
4142
ASTContext *Ctx = nullptr;
43+
std::unique_ptr<HeuristicResolver> Resolver;
4244

4345
public:
44-
IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer)
45-
: IndexOpts(IndexOpts), DataConsumer(DataConsumer) {}
46+
IndexingContext(IndexingOptions IndexOpts, IndexDataConsumer &DataConsumer);
47+
~IndexingContext();
4648

4749
const IndexingOptions &getIndexOpts() const { return IndexOpts; }
4850
IndexDataConsumer &getDataConsumer() { return DataConsumer; }
4951

50-
void setASTContext(ASTContext &ctx) { Ctx = &ctx; }
52+
void setASTContext(ASTContext &ctx);
53+
54+
HeuristicResolver *getResolver() const { return Resolver.get(); }
5155

5256
bool shouldIndex(const Decl *D);
5357

0 commit comments

Comments
 (0)