static folly::Optional declare()

in glean/lang/clang/ast.cpp [1151:1201]


    static folly::Optional<FunDecl> declare(
        ASTVisitor& visitor,
        const clang::FunctionDecl *decl,
        Cxx::Scope scope,
        Src::Range range) {
      // TODO: should we ignore deleted functions or have some info about them?
      if (decl->isDeleted()
        || decl->getTemplateSpecializationKind()
            == clang::TSK_ImplicitInstantiation) {
        return folly::none;
      }

      if (auto name = visitor.functionName(decl)) {
        folly::Optional<Cxx::MethodSignature> method;

        if (auto mtd = clang::dyn_cast<clang::CXXMethodDecl>(decl)) {
          if (mtd->isInstance()) {
            method = Cxx::MethodSignature{
              mtd->isVirtual(),
              mtd->isConst(),
              mtd->isVolatile(),
              visitor.refQualifier(mtd->getRefQualifier())
            };
          }
        }

        auto qname = visitor.db.fact<Cxx::FunctionQName>(name.value(), scope);
        auto decl_fact = visitor.db.fact<Cxx::FunctionDeclaration>(
          qname,
          visitor.signature(decl->getReturnType(), decl->parameters()),
          maybe(method),
          range
        );

        if (decl->hasAttrs()) {
          for (const auto attr : decl->getAttrs()) {
            visitor.db.fact<Cxx::FunctionAttribute>(
              visitor.db.fact<Cxx::Attribute>(visitor.db.srcText(attr->getRange()).str()),
              decl_fact
            );
          }
        }
        return FunDecl{
            {},
            qname,
            decl_fact,
            method.has_value()};
      } else {
        return folly::none;
      }
    }