diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -336,6 +336,8 @@ // Keep track of SymbolID -> index mapping, to fill in index data later. llvm::DenseMap ResultIndex; + static constexpr trace::Metric LocateASTReferentMetric( + "locate_ast_referent", trace::Metric::Counter, "case"); auto AddResultDecl = [&](const NamedDecl *D) { D = getPreferredDecl(D); auto Loc = @@ -369,8 +371,10 @@ // 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(); @@ -379,6 +383,7 @@ 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); @@ -403,6 +408,7 @@ if (auto *CTSD = dyn_cast(D)) { if (TouchedIdentifier && D->getLocation() == TouchedIdentifier->location()) { + LocateASTReferentMetric.record(1, "template-specialization-to-primary"); AddResultDecl(CTSD->getSpecializedTemplate()); continue; } @@ -418,9 +424,12 @@ 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); }