in glean/lang/clang/ast.cpp [2098:2123]
void xrefExpr(
const clang::Decl * FOLLY_NULLABLE decl,
const clang::NestedNameSpecifier * FOLLY_NULLABLE qualifier,
clang::SourceRange range) {
if (decl) {
// TODO: We aren't cross-referencing local variables for now but should
// eventually.
if (!clang::isa<clang::VarDecl>(decl)
|| decl->getParentFunctionOrMethod() == nullptr) {
auto xref = XRef::unknown(decl);
if (auto fun = clang::dyn_cast<clang::FunctionDecl>(decl)) {
xref = XRef::toTemplatableDecl(funDecls, fun);
} else if (auto var = clang::dyn_cast<clang::VarDecl>(decl)) {
xref = XRef::toTemplatableDecl(varDecls, var);
} else if (auto field = clang::dyn_cast<clang::FieldDecl>(decl)) {
// TODO: can this ever happen? or will it always be a MemberExpr?
xref = XRef::toDecl(varDecls, field);
} else if (auto e = clang::dyn_cast<clang::EnumConstantDecl>(decl)) {
if (auto r = enumeratorDecls(e)) {
xref = XRef::to(e, Cxx::XRefTarget::enumerator(r->fact));
}
}
usingTracker.inNameContext(qualifier, [&]{ xrefTarget(range, xref); });
}
}
}