void xrefExpr()

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); });
      }
    }
  }