Skip to content

Commit a9e4a9e

Browse files
committed
C++20 concepts: added support for parsing requires-clauses
1 parent fc2e284 commit a9e4a9e

File tree

8 files changed

+225
-27
lines changed

8 files changed

+225
-27
lines changed

src/classdef.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -239,6 +239,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
239239
virtual bool subGrouping() const;
240240
virtual bool isSliceLocal() const;
241241
virtual bool hasNonReferenceSuperClass() const;
242+
virtual QCString requiresClause() const;
242243
virtual ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,int startColumn,
243244
const QCString &templSpec,bool &freshInstance) const;
244245

@@ -309,6 +310,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
309310
MemberListType lt,const QCString &title,
310311
const char *subTitle=0,bool showInline=FALSE,const ClassDef *inheritedFrom=0,
311312
int lt2=-1,bool invert=FALSE,bool showAlways=FALSE) const;
313+
virtual void setRequiresClause(const char *req);
312314

313315
private:
314316
void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
@@ -527,6 +529,8 @@ class ClassDefAliasImpl : public DefinitionAliasMixin<ClassDef>
527529
{ return getCdAlias()->isSliceLocal(); }
528530
virtual bool hasNonReferenceSuperClass() const
529531
{ return getCdAlias()->hasNonReferenceSuperClass(); }
532+
virtual QCString requiresClause() const
533+
{ return getCdAlias()->requiresClause(); }
530534

531535
virtual int countMembersIncludingGrouped(MemberListType lt,const ClassDef *inheritedFrom,bool additional) const
532536
{ return getCdAlias()->countMembersIncludingGrouped(lt,inheritedFrom,additional); }
@@ -704,6 +708,9 @@ class ClassDefImpl::IMPL
704708
uint64 spec = 0;
705709

706710
QCString metaData;
711+
712+
/** C++20 requires clause */
713+
QCString requiresClause;
707714
};
708715

709716
void ClassDefImpl::IMPL::init(const char *defFileName, const char *name,
@@ -3184,6 +3191,16 @@ bool ClassDefImpl::hasNonReferenceSuperClass() const
31843191
return found;
31853192
}
31863193

3194+
QCString ClassDefImpl::requiresClause() const
3195+
{
3196+
return m_impl->requiresClause;
3197+
}
3198+
3199+
void ClassDefImpl::setRequiresClause(const char *req)
3200+
{
3201+
m_impl->requiresClause = req;
3202+
}
3203+
31873204
/*! called from MemberDef::writeDeclaration() to (recursively) write the
31883205
* definition of an anonymous struct, union or class.
31893206
*/

src/classdef.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,8 @@ class ClassDef : public Definition
358358
virtual bool isSliceLocal() const = 0;
359359
virtual bool hasNonReferenceSuperClass() const = 0;
360360

361+
virtual QCString requiresClause() const = 0;
362+
361363
//-----------------------------------------------------------------------------------
362364
// --- count members ----
363365
//-----------------------------------------------------------------------------------
@@ -405,6 +407,7 @@ class ClassDefMutable : public DefinitionMutable, public ClassDef
405407
virtual void setTagLessReference(const ClassDef *cd) = 0;
406408
virtual void setName(const char *name) = 0;
407409
virtual void setMetaData(const char *md) = 0;
410+
virtual void setRequiresClause(const char *req) = 0;
408411

409412
//-----------------------------------------------------------------------------------
410413
// --- actions ----

src/doxygen.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,6 +1011,10 @@ static void addClassToContext(const Entry *root)
10111011
cd->setTemplateArguments(*tArgList);
10121012
}
10131013
}
1014+
if (cd->requiresClause().isEmpty() && !root->req.isEmpty())
1015+
{
1016+
cd->setRequiresClause(root->req);
1017+
}
10141018

10151019
cd->setCompoundType(convertToCompoundType(root->section,root->spec));
10161020

@@ -1081,6 +1085,7 @@ static void addClassToContext(const Entry *root)
10811085
{
10821086
cd->setTemplateArguments(*tArgList);
10831087
}
1088+
cd->setRequiresClause(root->req);
10841089
cd->setProtection(root->protection);
10851090
cd->setIsStatic(root->stat);
10861091

@@ -1365,6 +1370,7 @@ static ClassDefMutable *createTagLessInstance(const ClassDef *rootCd,const Class
13651370
imd->setMemberSpecifiers(md->getMemberSpecifiers());
13661371
imd->setMemberGroupId(md->getMemberGroupId());
13671372
imd->setInitializer(md->initializer());
1373+
imd->setRequiresClause(md->requiresClause());
13681374
imd->setMaxInitLines(md->initializerLines());
13691375
imd->setBitfields(md->bitfieldString());
13701376
imd->setLanguage(md->getLanguage());
@@ -1982,6 +1988,7 @@ static void findUsingDeclImports(const Entry *root)
19821988
newMd->setBodySegment(md->getDefLine(),md->getStartBodyLine(),md->getEndBodyLine());
19831989
newMd->setBodyDef(md->getBodyDef());
19841990
newMd->setInitializer(md->initializer());
1991+
newMd->setRequiresClause(md->requiresClause());
19851992
newMd->setMaxInitLines(md->initializerLines());
19861993
newMd->setMemberGroupId(root->mGrpId);
19871994
newMd->setMemberSpecifiers(md->getMemberSpecifiers());
@@ -3104,6 +3111,7 @@ static void addMethodToClass(const Entry *root,ClassDefMutable *cd,
31043111
md->setMemberGroupId(root->mGrpId);
31053112
md->setTypeConstraints(root->typeConstr);
31063113
md->setLanguage(root->lang);
3114+
md->setRequiresClause(root->req);
31073115
md->setId(root->id);
31083116
md->setBodyDef(fd);
31093117
md->setFileDef(fd);
@@ -3213,6 +3221,7 @@ static void addGlobalFunction(const Entry *root,const QCString &rname,const QCSt
32133221
md->addSectionsToDefinition(root->anchors);
32143222
md->setMemberSpecifiers(root->spec);
32153223
md->setMemberGroupId(root->mGrpId);
3224+
md->setRequiresClause(root->req);
32163225

32173226
NamespaceDefMutable *nd = 0;
32183227
// see if the function is inside a namespace that was not part of
@@ -5026,6 +5035,10 @@ static void addMemberDocs(const Entry *root,
50265035
//printf("setInitializer\n");
50275036
md->setInitializer(rootInit.c_str());
50285037
}
5038+
if (md->requiresClause().isEmpty() && !root->req.isEmpty())
5039+
{
5040+
md->setRequiresClause(root->req);
5041+
}
50295042

50305043
md->setMaxInitLines(root->initLines);
50315044

src/entry.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ Entry::Entry(const Entry &e)
108108
id = e.id;
109109
extends = e.extends;
110110
groups = e.groups;
111+
req = e.req;
111112
m_fileDef = e.m_fileDef;
112113

113114
m_parent = e.m_parent;
@@ -242,6 +243,7 @@ void Entry::reset()
242243
tArgLists.clear();
243244
typeConstr.reset();
244245
sli.clear();
246+
req.resize(0);
245247
m_fileDef = 0;
246248
}
247249

src/entry.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,6 +295,7 @@ class Entry
295295
QCString id; //!< libclang id
296296
LocalToc localToc;
297297
QCString metaData; //!< Slice metadata
298+
QCString req; //!< C++20 requires clause
298299

299300
/// return the command name used to define GROUPDOC_SEC
300301
const char *groupDocCmd() const

src/memberdef.cpp

Lines changed: 61 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
229229
virtual QCString getDeclType() const;
230230
virtual StringVector getLabels(const Definition *container) const;
231231
virtual const ArgumentList &typeConstraints() const;
232+
virtual QCString requiresClause() const;
232233
virtual QCString documentation() const;
233234
virtual QCString briefDescription(bool abbr=FALSE) const;
234235
virtual QCString fieldType() const;
@@ -304,6 +305,7 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
304305
virtual void setBriefDescription(const char *b,const char *briefFile,int briefLine);
305306
virtual void setInbodyDocumentation(const char *d,const char *inbodyFile,int inbodyLine);
306307
virtual void setHidden(bool b);
308+
virtual void setRequiresClause(const char *req);
307309
virtual void incrementFlowKeyWordCount();
308310
virtual void writeDeclaration(OutputList &ol,
309311
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
@@ -344,6 +346,8 @@ class MemberDefImpl : public DefinitionMixin<MemberDefMutable>
344346
const QCString &cname) const;
345347
void _writeCategoryRelation(OutputList &ol) const;
346348
void _writeTagData(const DefType) const;
349+
void _writeTemplatePrefix(OutputList &ol, const Definition *def,
350+
const ArgumentList &al, bool writeReqClause=true) const;
347351

348352
static int s_indentLevel;
349353

@@ -735,6 +739,8 @@ class MemberDefAliasImpl : public DefinitionAliasMixin<MemberDef>
735739
{ return getMdAlias()->getDeclLine(); }
736740
virtual int getDeclColumn() const
737741
{ return getMdAlias()->getDeclColumn(); }
742+
virtual QCString requiresClause() const
743+
{ return getMdAlias()->requiresClause(); }
738744

739745
virtual void warnIfUndocumented() const {}
740746
virtual void warnIfUndocumentedParams() const {}
@@ -1119,26 +1125,6 @@ static void writeExceptionList(OutputList &ol, const ClassDef *cd, const MemberD
11191125
}
11201126
}
11211127

1122-
static void writeTemplatePrefix(OutputList &ol,const ArgumentList &al)
1123-
{
1124-
ol.docify("template<");
1125-
for (auto it = al.begin(); it!=al.end();)
1126-
{
1127-
Argument a = *it;
1128-
ol.docify(a.type);
1129-
ol.docify(" ");
1130-
ol.docify(a.name);
1131-
if (a.defval.length()!=0)
1132-
{
1133-
ol.docify(" = ");
1134-
ol.docify(a.defval);
1135-
}
1136-
++it;
1137-
if (it!=al.end()) ol.docify(", ");
1138-
}
1139-
ol.docify("> ");
1140-
}
1141-
11421128
//-----------------------------------------------------------------------------
11431129
//-----------------------------------------------------------------------------
11441130
//-----------------------------------------------------------------------------
@@ -1189,6 +1175,7 @@ class MemberDefImpl::IMPL
11891175
QCString initializer; // initializer
11901176
QCString extraTypeChars; // extra type info found after the argument list
11911177
QCString enumBaseType; // base type of the enum (C++11)
1178+
QCString requiresClause; // requires clause (C++20)
11921179
int initLines = 0; // number of lines in the initializer
11931180

11941181
uint64 memSpec = 0; // The specifiers present for this member
@@ -2008,6 +1995,46 @@ QCString MemberDefImpl::getDeclType() const
20081995
return ltype;
20091996
}
20101997

1998+
void MemberDefImpl::_writeTemplatePrefix(OutputList &ol, const Definition *def,
1999+
const ArgumentList &al, bool writeReqClause) const
2000+
{
2001+
ol.docify("template<");
2002+
for (auto it = al.begin(); it!=al.end();)
2003+
{
2004+
Argument a = *it;
2005+
linkifyText(TextGeneratorOLImpl(ol), // out
2006+
def, // scope
2007+
getFileDef(), // fileScope
2008+
this, // self
2009+
a.type, // text
2010+
FALSE // autoBreak
2011+
);
2012+
ol.docify(" ");
2013+
ol.docify(a.name);
2014+
if (a.defval.length()!=0)
2015+
{
2016+
ol.docify(" = ");
2017+
ol.docify(a.defval);
2018+
}
2019+
++it;
2020+
if (it!=al.end()) ol.docify(", ");
2021+
}
2022+
ol.docify("> ");
2023+
if (writeReqClause && !m_impl->requiresClause.isEmpty())
2024+
{
2025+
ol.lineBreak();
2026+
ol.docify("requires ");
2027+
linkifyText(TextGeneratorOLImpl(ol), // out
2028+
def, // scope
2029+
getFileDef(), // fileScope
2030+
this, // self
2031+
m_impl->requiresClause, // text
2032+
FALSE // autoBreak
2033+
);
2034+
}
2035+
}
2036+
2037+
20112038
void MemberDefImpl::writeDeclaration(OutputList &ol,
20122039
const ClassDef *cd,const NamespaceDef *nd,const FileDef *fd,const GroupDef *gd,
20132040
bool inGroup, const ClassDef *inheritedFrom,const char *inheritId) const
@@ -2086,10 +2113,11 @@ void MemberDefImpl::writeDeclaration(OutputList &ol,
20862113
if (m_impl->tArgList.hasParameters() && getLanguage()==SrcLangExt_Cpp)
20872114
{
20882115
if (!isAnonType) ol.startMemberTemplateParams();
2089-
writeTemplatePrefix(ol,m_impl->tArgList);
2116+
_writeTemplatePrefix(ol,d,m_impl->tArgList);
20902117
if (!isAnonType) ol.endMemberTemplateParams(anchor(),inheritId);
20912118
}
20922119

2120+
20932121
// *** write type
20942122
QCString ltype(m_impl->type);
20952123
if (isTypedef() && getLanguage() != SrcLangExt_Slice)
@@ -3280,7 +3308,7 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
32803308
{
32813309
if (!first) ol.docify(" ");
32823310
ol.startMemberDocPrefixItem();
3283-
writeTemplatePrefix(ol,tal);
3311+
_writeTemplatePrefix(ol,scopedContainer,tal);
32843312
ol.endMemberDocPrefixItem();
32853313
}
32863314
}
@@ -3296,15 +3324,15 @@ void MemberDefImpl::writeDocumentation(const MemberList *ml,
32963324
{
32973325
if (!first) ol.docify(" ");
32983326
ol.startMemberDocPrefixItem();
3299-
writeTemplatePrefix(ol,tal);
3327+
_writeTemplatePrefix(ol,scopedContainer,tal,false);
33003328
ol.endMemberDocPrefixItem();
33013329
}
33023330
}
33033331
}
33043332
if (m_impl->tArgList.hasParameters() && lang==SrcLangExt_Cpp) // function template prefix
33053333
{
33063334
ol.startMemberDocPrefixItem();
3307-
writeTemplatePrefix(ol,m_impl->tArgList);
3335+
_writeTemplatePrefix(ol,scopedContainer,m_impl->tArgList);
33083336
ol.endMemberDocPrefixItem();
33093337
}
33103338
}
@@ -5604,6 +5632,15 @@ QCString MemberDefImpl::enumBaseType() const
56045632
return m_impl->enumBaseType;
56055633
}
56065634

5635+
void MemberDefImpl::setRequiresClause(const char *req)
5636+
{
5637+
m_impl->requiresClause = req;
5638+
}
5639+
5640+
QCString MemberDefImpl::requiresClause() const
5641+
{
5642+
return m_impl->requiresClause;
5643+
}
56075644

56085645
void MemberDefImpl::cacheTypedefVal(const ClassDef*val, const QCString & templSpec, const QCString &resolvedType)
56095646
{

src/memberdef.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,8 @@ class MemberDef : public Definition
261261

262262
virtual const ArgumentList &typeConstraints() const = 0;
263263

264+
virtual QCString requiresClause() const = 0;
265+
264266
// overrules
265267
virtual QCString documentation() const = 0;
266268
virtual QCString briefDescription(bool abbr=FALSE) const = 0;
@@ -393,6 +395,8 @@ class MemberDefMutable : public DefinitionMutable, public MemberDef
393395

394396
virtual void setHidden(bool b) = 0;
395397

398+
virtual void setRequiresClause(const char *req) = 0;
399+
396400
//-----------------------------------------------------------------------------------
397401
// --- actions ----
398402
//-----------------------------------------------------------------------------------

0 commit comments

Comments
 (0)