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 cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits