static folly::Optional declare()

in glean/lang/clang/ast.cpp [986:1026]


    static folly::Optional<ClassDecl> declare(
        ASTVisitor& visitor,
        const clang::CXXRecordDecl *decl,
        Cxx::Scope scope,
        Src::Range range) {
      if (decl->isInjectedClassName()) {
        return folly::none;
      }

      folly::Optional<Cxx::RecordKind> kind;
      switch (decl->getTagKind()) {
        case clang::TTK_Struct:
          kind = Cxx::RecordKind::struct_();
          break;

        case clang::TTK_Class:
          kind = Cxx::RecordKind::class_();
          break;

        case clang::TTK_Union:
          kind = Cxx::RecordKind::union_();
          break;

        default:
          break;
      }
      if (kind) {
        auto qname = visitor.db.fact<Cxx::QName>(
          visitor.db.name(decl->getName()), scope);
        return ClassDecl
          { {}
          , qname
          , visitor.db.fact<Cxx::RecordDeclaration>(
              qname,
              kind.value(),
              range)
          };
      } else {
        return folly::none;
      }
    }