std::unique_ptr AstNode::Create()

in tools/apiview/parsers/cpp-api-parser/ApiViewProcessor/AstNode.cpp [3560:3669]


std::unique_ptr<AstNode> AstNode::Create(
    clang::Decl const* decl,
    AzureClassesDatabase* const azureClassesDatabase,
    std::shared_ptr<TypeHierarchy::TypeHierarchyNode> parentNode)
{
  switch (decl->getKind())
  {
    case Decl::Kind::CXXConstructor:
      return std::make_unique<AstConstructor>(
          cast<CXXConstructorDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::CXXDestructor:
      return std::make_unique<AstDestructor>(
          cast<CXXDestructorDecl>(decl), azureClassesDatabase, parentNode);
    case Decl::Kind::CXXConversion:
      return std::make_unique<AstConversion>(
          cast<CXXConversionDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::CXXMethod:
      return std::make_unique<AstMethod>(
          cast<CXXMethodDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::Function:
      return std::make_unique<AstFunction>(
          cast<FunctionDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::ParmVar: {
      return std::make_unique<AstParamVariable>(
          cast<ParmVarDecl>(decl), azureClassesDatabase, parentNode);
    }
    case Decl::Kind::Var:
      return std::make_unique<AstVariable>(cast<VarDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::ClassTemplateSpecialization:
      return std::make_unique<AstClassTemplateSpecialization>(
          cast<ClassTemplateSpecializationDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::Enum:
      return std::make_unique<AstEnum>(cast<EnumDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::EnumConstant:
      return std::make_unique<AstEnumerator>(
          cast<EnumConstantDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::Field:
      return std::make_unique<AstField>(cast<FieldDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::FunctionTemplate:
      return std::make_unique<AstFunctionTemplate>(
          cast<FunctionTemplateDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::ClassTemplate:
      return std::make_unique<AstClassTemplate>(
          cast<ClassTemplateDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::TemplateTypeParm:
      return std::make_unique<AstTemplateParameter>(
          cast<TemplateTypeParmDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::TemplateTemplateParm:
      return std::make_unique<AstTemplateTemplateParameter>(
          cast<TemplateTemplateParmDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::NonTypeTemplateParm:
      return std::make_unique<AstNonTypeTemplateParam>(
          cast<NonTypeTemplateParmDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::TypeAliasTemplate:
      return std::make_unique<AstTypeAliasTemplate>(
          cast<TypeAliasTemplateDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::TypeAlias:
      return std::make_unique<AstTypeAlias>(
          cast<TypeAliasDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::CXXRecord:
      return std::make_unique<AstClassLike>(
          cast<CXXRecordDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::AccessSpec:
      return std::make_unique<AstAccessSpec>(cast<AccessSpecDecl>(decl), azureClassesDatabase);

    case Decl::Kind::Friend:
      return std::make_unique<AstFriend>(cast<FriendDecl>(decl), azureClassesDatabase, parentNode);

    case Decl::Kind::UsingDirective:
      // A "UsingDirective" is a "using namespace" directive. We consider this an error
      // condition, add an AstNode so the error appears in the ApiView.
      return std::make_unique<AstUsingDirective>(
          cast<UsingDirectiveDecl>(decl), azureClassesDatabase, parentNode);
    case Decl::Kind::NamespaceAlias:
      return nullptr;
      //    return std::make_unique<AstNamespaceAlias>(cast<NamespaceAliasDecl>(decl,
      //    azureClassesDatabase));

    case Decl::Kind::Namespace:
      return nullptr;
      //    return std::make_unique<AstNamespace>(cast<NamespaceDecl>(decl,
      //    azureClassesDatabase));
    case Decl::Kind::Using:
      return std::make_unique<AstUsingDecl>(
          cast<UsingDecl>(decl), azureClassesDatabase, parentNode);
    default: {
      llvm::errs() << raw_ostream::Colors::RED << "Unknown DECL node "
                   << cast<NamedDecl>(decl)->getNameAsString()
                   << " type : " << decl->getDeclKindName() << raw_ostream::Colors::RESET << "\n ";
      return nullptr;
    }
  }
}