// Keep track of SymbolID -> index mapping, to fill in index data later.
llvm::DenseMap<SymbolID, size_t> ResultIndex;
+ static constexpr trace::Metric LocateASTReferentMetric(
+ "locate_ast_referent", trace::Metric::Counter, "case");
auto AddResultDecl = [&](const NamedDecl *D) {
D = getPreferredDecl(D);
auto Loc =
// saved in the AST.
if (CMD->isPure()) {
if (TouchedIdentifier && SM.getSpellingLoc(CMD->getLocation()) ==
- TouchedIdentifier->location())
+ TouchedIdentifier->location()) {
VirtualMethods.insert(getSymbolID(CMD));
+ LocateASTReferentMetric.record(1, "method-to-override");
+ }
}
// Special case: void foo() ^override: jump to the overridden method.
const InheritableAttr *Attr = D->getAttr<OverrideAttr>();
if (Attr && TouchedIdentifier &&
SM.getSpellingLoc(Attr->getLocation()) ==
TouchedIdentifier->location()) {
+ LocateASTReferentMetric.record(1, "method-to-base");
// We may be overridding multiple methods - offer them all.
for (const NamedDecl *ND : CMD->overridden_methods())
AddResultDecl(ND);
if (auto *CTSD = dyn_cast<ClassTemplateSpecializationDecl>(D)) {
if (TouchedIdentifier &&
D->getLocation() == TouchedIdentifier->location()) {
+ LocateASTReferentMetric.record(1, "template-specialization-to-primary");
AddResultDecl(CTSD->getSpecializedTemplate());
continue;
}
if (const auto *ID = CD->getClassInterface())
if (TouchedIdentifier &&
(CD->getLocation() == TouchedIdentifier->location() ||
- ID->getName() == TouchedIdentifier->text(SM)))
+ ID->getName() == TouchedIdentifier->text(SM))) {
+ LocateASTReferentMetric.record(1, "objc-category-to-class");
AddResultDecl(ID);
+ }
+ LocateASTReferentMetric.record(1, "regular");
// Otherwise the target declaration is the right one.
AddResultDecl(D);
}