@@ -1112,17 +1112,7 @@ populate(
1112
1112
populate (I.Requires , TRC);
1113
1113
}
1114
1114
1115
- if (D->hasAttrs ())
1116
- {
1117
- for (AttrVec& attrs = D->getAttrs ();
1118
- Attr const * attr: attrs)
1119
- {
1120
- if (IdentifierInfo const * II = attr->getAttrName ())
1121
- {
1122
- I.Attributes .emplace_back (II->getName ());
1123
- }
1124
- }
1125
- }
1115
+ populateAttributes (I, D);
1126
1116
}
1127
1117
1128
1118
void
@@ -1234,14 +1224,7 @@ populate(
1234
1224
I.HasNoUniqueAddress = D->hasAttr <NoUniqueAddressAttr>();
1235
1225
I.IsDeprecated = D->hasAttr <DeprecatedAttr>();
1236
1226
I.IsMaybeUnused = D->hasAttr <UnusedAttr>();
1237
- if (D->hasAttrs ())
1238
- {
1239
- for (AttrVec& attrs = D->getAttrs ();
1240
- Attr const * attr: attrs)
1241
- {
1242
- I.Attributes .emplace_back (attr->getAttrName ()->getName ());
1243
- }
1244
- }
1227
+ populateAttributes (I, D);
1245
1228
}
1246
1229
1247
1230
void
@@ -1673,6 +1656,29 @@ populate(
1673
1656
}));
1674
1657
}
1675
1658
1659
+ template <std::derived_from<Info> InfoTy>
1660
+ void
1661
+ ASTVisitor::
1662
+ populateAttributes (InfoTy& I, const Decl* D)
1663
+ {
1664
+ if constexpr (requires { I.Attributes ; })
1665
+ {
1666
+ MRDOCS_CHECK_OR (D->hasAttrs ());
1667
+ for (Attr const * attr: D->getAttrs ())
1668
+ {
1669
+ IdentifierInfo const * II = attr->getAttrName ();
1670
+ if (!II)
1671
+ {
1672
+ continue ;
1673
+ }
1674
+ if (std::ranges::find (I.Attributes , II->getName ()) == I.Attributes .end ())
1675
+ {
1676
+ I.Attributes .emplace_back (II->getName ());
1677
+ }
1678
+ }
1679
+ }
1680
+ }
1681
+
1676
1682
std::string
1677
1683
ASTVisitor::
1678
1684
extractName (NamedDecl const * D)
0 commit comments