usaxena95 updated this revision to Diff 429697.
usaxena95 added a comment.
Format.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D125675/new/
https://reviews.llvm.org/D125675
Files:
clang-tools-extra/clangd/XRefs.cpp
Index: clang-tools-extra/clangd/XRefs.cpp
===================================================================
--- clang-tools-extra/clangd/XRefs.cpp
+++ clang-tools-extra/clangd/XRefs.cpp
@@ -18,6 +18,7 @@
#include "index/Index.h"
#include "index/Merge.h"
#include "index/Relation.h"
+#include "index/SymbolID.h"
#include "index/SymbolLocation.h"
#include "support/Logger.h"
#include "clang/AST/ASTContext.h"
@@ -47,6 +48,7 @@
#include "clang/Index/USRGeneration.h"
#include "clang/Tooling/Syntax/Tokens.h"
#include "llvm/ADT/ArrayRef.h"
+#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/None.h"
#include "llvm/ADT/STLExtras.h"
#include "llvm/ADT/ScopeExit.h"
@@ -397,8 +399,8 @@
}
}
// Special case: void foo() ^override: jump to the overridden method.
- if (NodeKind.isSame(ASTNodeKind::getFromNodeKind<OverrideAttr>()) ||
- NodeKind.isSame(ASTNodeKind::getFromNodeKind<FinalAttr>())) {
+ if (NodeKind.isSame(ASTNodeKind::getFromNodeKind<OverrideAttr>()) ||
+ NodeKind.isSame(ASTNodeKind::getFromNodeKind<FinalAttr>())) {
// We may be overridding multiple methods - offer them all.
for (const NamedDecl *ND : CMD->overridden_methods())
AddResultDecl(ND);
@@ -887,8 +889,13 @@
};
ReferenceFinder(const ParsedAST &AST,
- const llvm::DenseSet<SymbolID> &TargetIDs, bool PerToken)
- : PerToken(PerToken), AST(AST), TargetIDs(TargetIDs) {}
+ const llvm::DenseSet<const Decl *> &Target, bool PerToken)
+ : PerToken(PerToken), AST(AST) {
+ for (const Decl *D : Target) {
+ const Decl *CD = D->getCanonicalDecl();
+ TargetDeclAndID[CD] = getSymbolID(CD);
+ }
+ }
std::vector<Reference> take() && {
llvm::sort(References, [](const Reference &L, const Reference &R) {
@@ -913,12 +920,12 @@
llvm::ArrayRef<index::SymbolRelation> Relations,
SourceLocation Loc,
index::IndexDataConsumer::ASTNodeInfo ASTNode) override {
+ auto DeclID = TargetDeclAndID.find(D->getCanonicalDecl());
+ if (DeclID == TargetDeclAndID.end())
+ return true;
const SourceManager &SM = AST.getSourceManager();
if (!isInsideMainFile(Loc, SM))
return true;
- SymbolID ID = getSymbolID(D);
- if (!TargetIDs.contains(ID))
- return true;
const auto &TB = AST.getTokens();
llvm::SmallVector<SourceLocation, 1> Locs;
@@ -942,7 +949,7 @@
for (SourceLocation L : Locs) {
L = SM.getFileLoc(L);
if (const auto *Tok = TB.spelledTokenAt(L))
- References.push_back({*Tok, Roles, ID});
+ References.push_back({*Tok, Roles, DeclID->getSecond()});
}
return true;
}
@@ -951,12 +958,13 @@
bool PerToken; // If true, report 3 references for split ObjC selector names.
std::vector<Reference> References;
const ParsedAST &AST;
- const llvm::DenseSet<SymbolID> &TargetIDs;
+ llvm::DenseMap<const Decl *, SymbolID> TargetDeclAndID;
};
std::vector<ReferenceFinder::Reference>
-findRefs(const llvm::DenseSet<SymbolID> &IDs, ParsedAST &AST, bool PerToken) {
- ReferenceFinder RefFinder(AST, IDs, PerToken);
+findRefs(const llvm::DenseSet<const Decl *> &TargetDecls, ParsedAST &AST,
+ bool PerToken) {
+ ReferenceFinder RefFinder(AST, TargetDecls, PerToken);
index::IndexingOptions IndexOpts;
IndexOpts.SystemSymbolFilter =
index::IndexingOptions::SystemSymbolFilterKind::All;
@@ -1242,16 +1250,15 @@
if (const SelectionTree::Node *N = ST.commonAncestor()) {
DeclRelationSet Relations =
DeclRelation::TemplatePattern | DeclRelation::Alias;
- auto Decls =
- targetDecl(N->ASTNode, Relations, AST.getHeuristicResolver());
- if (!Decls.empty()) {
+ llvm::DenseSet<const Decl *> TargetDecls;
+ for (const NamedDecl *D :
+ targetDecl(N->ASTNode, Relations, AST.getHeuristicResolver())) {
+ TargetDecls.insert(D);
+ }
+ if (!TargetDecls.empty()) {
// FIXME: we may get multiple DocumentHighlights with the same location
// and different kinds, deduplicate them.
- llvm::DenseSet<SymbolID> Targets;
- for (const NamedDecl *ND : Decls)
- if (auto ID = getSymbolID(ND))
- Targets.insert(ID);
- for (const auto &Ref : findRefs(Targets, AST, /*PerToken=*/true))
+ for (const auto &Ref : findRefs(TargetDecls, AST, /*PerToken=*/true))
Result.push_back(toHighlight(Ref, SM));
return true;
}
@@ -1377,12 +1384,12 @@
DeclRelation::TemplatePattern | DeclRelation::Alias;
std::vector<const NamedDecl *> Decls =
getDeclAtPosition(AST, *CurLoc, Relations);
- llvm::DenseSet<SymbolID> TargetsInMainFile;
+ llvm::DenseSet<const Decl *> TargetsInMainFile;
for (const NamedDecl *D : Decls) {
auto ID = getSymbolID(D);
if (!ID)
continue;
- TargetsInMainFile.insert(ID);
+ TargetsInMainFile.insert(D);
// Not all symbols can be referenced from outside (e.g. function-locals).
// TODO: we could skip TU-scoped symbols here (e.g. static functions) if
// we know this file isn't a header. The details might be tricky.
@@ -1909,7 +1916,7 @@
return T;
// If there's a specific type alias, point at that rather than unwrapping.
- if (const auto* TDT = T->getAs<TypedefType>())
+ if (const auto *TDT = T->getAs<TypedefType>())
return QualType(TDT, 0);
// Pointers etc => pointee type.
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits