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