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