@@ -950,6 +950,8 @@ populate(
950950 FunctionInfo& I,
951951 DeclTy* D)
952952{
953+ MRDOCS_SYMBOL_TRACE (D, context_);
954+
953955 // D is the templated declaration if FTD is non-null
954956 if (D->isFunctionTemplateSpecialization ())
955957 {
@@ -987,91 +989,91 @@ populate(
987989 }
988990 }
989991
990- // KRYSTIAN TODO: move other extraction that requires
991- // a valid function type here
992- if (auto FT = getDeclaratorType (D); ! FT.isNull ())
992+ // Get the function type and extract information that comes from the type
993+ if (auto FT = getDeclaratorType (D); !FT.isNull ())
993994 {
995+ MRDOCS_SYMBOL_TRACE (FT, context_);
994996 const auto * FPT = FT->template getAs <FunctionProtoType>();
997+ MRDOCS_SYMBOL_TRACE (FPT, context_);
995998 populate (I.Noexcept , FPT);
996999 I.HasTrailingReturn |= FPT->hasTrailingReturn ();
9971000 }
9981001
9991002 //
10001003 // FunctionDecl
10011004 //
1002- I.OverloadedOperator = toOperatorKind (
1003- D->getOverloadedOperator ());
1004- I.IsVariadic |= D->isVariadic ();
1005- I.IsDefaulted |= D->isDefaulted ();
1006- I.IsExplicitlyDefaulted |= D->isExplicitlyDefaulted ();
1007- I.IsDeleted |= D->isDeleted ();
1008- I.IsDeletedAsWritten |= D->isDeletedAsWritten ();
1009- I.IsNoReturn |= D->isNoReturn ();
1010- // subsumes D->hasAttr<NoReturnAttr>()
1011- // subsumes D->hasAttr<CXX11NoReturnAttr>()
1012- // subsumes D->hasAttr<C11NoReturnAttr>()
1013- // subsumes D->getType()->getAs<FunctionType>()->getNoReturnAttr()
1014- I.HasOverrideAttr |= D->template hasAttr <OverrideAttr>();
1015-
1016- if (ConstexprSpecKind const CSK = D->getConstexprKind ();
1005+ FunctionDecl const * FD = D;
1006+ I.OverloadedOperator = toOperatorKind (FD->getOverloadedOperator ());
1007+ I.IsVariadic |= FD->isVariadic ();
1008+ I.IsDefaulted |= FD->isDefaulted ();
1009+ I.IsExplicitlyDefaulted |= FD->isExplicitlyDefaulted ();
1010+ I.IsDeleted |= FD->isDeleted ();
1011+ I.IsDeletedAsWritten |= FD->isDeletedAsWritten ();
1012+ I.IsNoReturn |= FD->isNoReturn ();
1013+ I.HasOverrideAttr |= FD->template hasAttr <OverrideAttr>();
1014+
1015+ if (ConstexprSpecKind const CSK = FD->getConstexprKind ();
10171016 CSK != ConstexprSpecKind::Unspecified)
10181017 {
10191018 I.Constexpr = toConstexprKind (CSK);
10201019 }
10211020
1022- if (StorageClass const SC = D ->getStorageClass ())
1021+ if (StorageClass const SC = FD ->getStorageClass ())
10231022 {
10241023 I.StorageClass = toStorageClassKind (SC);
10251024 }
10261025
1027- I.IsNodiscard |= D->template hasAttr <WarnUnusedResultAttr>();
1028- I.IsExplicitObjectMemberFunction |= D->hasCXXExplicitFunctionObjectParameter ();
1026+ I.IsNodiscard |= FD->template hasAttr <WarnUnusedResultAttr>();
1027+ I.IsExplicitObjectMemberFunction |= FD->hasCXXExplicitFunctionObjectParameter ();
1028+
10291029 //
10301030 // CXXMethodDecl
10311031 //
10321032 if constexpr (std::derived_from<DeclTy, CXXMethodDecl>)
10331033 {
1034- I. IsVirtual | = D-> isVirtual () ;
1035- I.IsVirtualAsWritten |= D-> isVirtualAsWritten ();
1036- I.IsPure |= D-> isPureVirtual ();
1037- I.IsConst |= D-> isConst ();
1038- I.IsVolatile |= D-> isVolatile ();
1039- I.RefQualifier = toReferenceKind (D-> getRefQualifier () );
1040- I.IsFinal |= D-> template hasAttr <FinalAttr>( );
1041- // D->isCopyAssignmentOperator()
1042- // D->isMoveAssignmentOperator ()
1043- // D->isOverloadedOperator();
1044- // D->isStaticOverloadedOperator ();
1045- }
1034+ CXXMethodDecl const * MD = D;
1035+ I.IsVirtual |= MD-> isVirtual ();
1036+ I.IsVirtualAsWritten |= MD-> isVirtualAsWritten ();
1037+ I.IsPure |= MD-> isPureVirtual ();
1038+ I.IsConst |= MD-> isConst ();
1039+ I.IsVolatile |= MD-> isVolatile ( );
1040+ I.RefQualifier = toReferenceKind (MD-> getRefQualifier () );
1041+ I. IsFinal |= MD-> template hasAttr <FinalAttr>();
1042+ // MD->isCopyAssignmentOperator ()
1043+ // MD->isMoveAssignmentOperator()
1044+ // MD->isOverloadedOperator ();
1045+ // MD->isStaticOverloadedOperator();
10461046
1047- //
1048- // CXXDestructorDecl
1049- //
1050- // if constexpr(std::derived_from<DeclTy, CXXDestructorDecl>)
1051- // {
1052- // }
1047+ //
1048+ // CXXDestructorDecl
1049+ //
1050+ // if constexpr(std::derived_from<DeclTy, CXXDestructorDecl>)
1051+ // {
1052+ // }
10531053
1054- //
1055- // CXXConstructorDecl
1056- //
1057- if constexpr (std::derived_from<DeclTy, CXXConstructorDecl>)
1058- {
1059- populate (I.Explicit , D->getExplicitSpecifier ());
1060- }
1054+ //
1055+ // CXXConstructorDecl
1056+ //
1057+ if constexpr (std::derived_from<DeclTy, CXXConstructorDecl>)
1058+ {
1059+ populate (I.Explicit , D->getExplicitSpecifier ());
1060+ }
10611061
1062- //
1063- // CXXConversionDecl
1064- //
1065- if constexpr (std::derived_from<DeclTy, CXXConversionDecl>)
1066- {
1067- populate (I.Explicit , D->getExplicitSpecifier ());
1062+ //
1063+ // CXXConversionDecl
1064+ //
1065+ if constexpr (std::derived_from<DeclTy, CXXConversionDecl>)
1066+ {
1067+ populate (I.Explicit , D->getExplicitSpecifier ());
1068+ }
10681069 }
10691070
1070- ArrayRef<ParmVarDecl*> const params = D ->parameters ();
1071+ ArrayRef<ParmVarDecl*> const params = FD ->parameters ();
10711072 I.Params .resize (params.size ());
10721073 for (std::size_t i = 0 ; i < params.size (); ++i)
10731074 {
10741075 ParmVarDecl const * P = params[i];
1076+ MRDOCS_SYMBOL_TRACE (P, context_);
10751077 Param& param = I.Params [i];
10761078
10771079 if (param.Name .empty ())
@@ -1099,16 +1101,16 @@ populate(
10991101 }
11001102 }
11011103
1102- I.Class = toFunctionClass (D ->getDeclKind ());
1104+ I.Class = toFunctionClass (FD ->getDeclKind ());
11031105
11041106 // extract the return type in direct dependency mode
11051107 // if it contains a placeholder type which is
11061108 // deduceded as a local class type
1107- QualType const RT = D ->getReturnType ();
1109+ QualType const RT = FD ->getReturnType ();
11081110 MRDOCS_SYMBOL_TRACE (RT, context_);
11091111 I.ReturnType = toTypeInfo (RT);
11101112
1111- if (auto * TRC = D ->getTrailingRequiresClause ())
1113+ if (auto * TRC = FD ->getTrailingRequiresClause ())
11121114 {
11131115 populate (I.Requires , TRC);
11141116 }
@@ -1120,8 +1122,9 @@ void
11201122ASTVisitor::
11211123populate (FunctionInfo& I, FunctionTemplateDecl* D)
11221124{
1123- populate (I.Template , D->getTemplatedDecl (), D);
1124- populate (I, D->getTemplatedDecl ());
1125+ FunctionDecl* TD = D->getTemplatedDecl ();
1126+ populate (I.Template , TD, D);
1127+ populate (I, TD);
11251128}
11261129
11271130void
@@ -1375,7 +1378,8 @@ ASTVisitor::
13751378populate (TemplateInfo& Template, DeclTy*, TemplateDeclTy* TD)
13761379{
13771380 MRDOCS_ASSERT (TD);
1378- populate (Template, TD->getTemplateParameters ());
1381+ TemplateParameterList const * TPL = TD->getTemplateParameters ();
1382+ populate (Template, TPL);
13791383}
13801384
13811385template <std::derived_from<CXXRecordDecl> CXXRecordDeclTy>
@@ -1592,18 +1596,25 @@ populate(
15921596 {
15931597 I = std::make_unique<TemplateTParam>();
15941598 }
1595- auto * R = dynamic_cast <TemplateTParam*>(I.get ());
1596- if (R->Params .empty ())
1599+ TemplateTemplateParmDecl const * TTPD = cast<TemplateTemplateParmDecl>(P);
1600+ MRDOCS_CHECK_OR (TTPD);
1601+ TemplateParameterList const * TPL = TTPD->getTemplateParameters ();
1602+ MRDOCS_CHECK_OR (TPL);
1603+ auto * Result = dynamic_cast <TemplateTParam*>(I.get ());
1604+ if (Result->Params .size () < TPL->size ())
15971605 {
1598- for (NamedDecl const * NP: *P->getTemplateParameters ())
1599- {
1600- populate (R->Params .emplace_back (), NP);
1601- }
1606+ Result->Params .resize (TPL->size ());
16021607 }
1603- if (P-> hasDefaultArgument () && !R-> Default )
1608+ for (std:: size_t i = 0 ; i < TPL-> size (); ++i )
16041609 {
1605- R->Default = toTArg (
1606- P->getDefaultArgument ().getArgument ());
1610+ NamedDecl const * TP = TPL->getParam (i);
1611+ populate (Result->Params [i], TP);
1612+ }
1613+ if (TTPD->hasDefaultArgument () && !Result->Default )
1614+ {
1615+ TemplateArgumentLoc const & TAL = TTPD->getDefaultArgument ();
1616+ TemplateArgument const & TA = TAL.getArgument ();
1617+ Result->Default = toTArg (TA);
16071618 }
16081619 return ;
16091620 }
@@ -1634,9 +1645,10 @@ populate(
16341645 {
16351646 TI.Params .resize (TPL->size ());
16361647 }
1637- for (std::size_t I = 0 ; I < TPL->size (); ++I )
1648+ for (std::size_t i = 0 ; i < TPL->size (); ++i )
16381649 {
1639- populate (TI.Params [I], TPL->getParam (I));
1650+ NamedDecl const * P = TPL->getParam (i);
1651+ populate (TI.Params [i], P);
16401652 }
16411653 if (auto * RC = TPL->getRequiresClause ())
16421654 {
0 commit comments