summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDimitri van Heesch <doxygen@gmail.com>2020-10-14 19:40:19 (GMT)
committerDimitri van Heesch <doxygen@gmail.com>2020-10-14 19:40:19 (GMT)
commit01ded6f6963d4798ce1338246d6d946dbc3922d9 (patch)
treec1ae21b1453f284db4ae2a2fe06e938e3c52d8df
parentf64705ecdeff9eead62e63f27b2ba88bea87c259 (diff)
downloadDoxygen-01ded6f6963d4798ce1338246d6d946dbc3922d9.zip
Doxygen-01ded6f6963d4798ce1338246d6d946dbc3922d9.tar.gz
Doxygen-01ded6f6963d4798ce1338246d6d946dbc3922d9.tar.bz2
issue #8091: [C++] Newer doxygen versions add a lot of bogus warnings about undocumented entities
-rw-r--r--src/defargs.l4
-rw-r--r--src/doxygen.cpp27
-rw-r--r--src/memberdef.cpp8
-rw-r--r--src/util.cpp89
-rw-r--r--src/util.h2
5 files changed, 70 insertions, 60 deletions
diff --git a/src/defargs.l b/src/defargs.l
index 6ecc7ff..e25c1fe 100644
--- a/src/defargs.l
+++ b/src/defargs.l
@@ -511,6 +511,8 @@ RAWEND ")"[^ \t\(\)\\]{0,16}\"
<FuncQual>"volatile" {
yyextra->argList->setVolatileSpecifier(TRUE);
}
+<FuncQual>"override" {
+ }
<FuncQual>"&" {
yyextra->argList->setRefQualifier(RefQualifierLValue);
}
@@ -790,7 +792,7 @@ std::unique_ptr<ArgumentList> stringToArgumentList(SrcLangExt lang, const char *
yyextra->argList->setNoParameters(TRUE);
}
if (extraTypeChars) *extraTypeChars=yyextra->extraTypeChars;
- //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
+ //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(*al).data());
printlex(yy_flex_debug, FALSE, __FILE__, NULL);
defargsYYlex_destroy(yyscanner);
return al;
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
index 73c4b02..7970441 100644
--- a/src/doxygen.cpp
+++ b/src/doxygen.cpp
@@ -4111,7 +4111,7 @@ static bool findTemplateInstanceRelation(const Entry *root,
//printf("\n");
bool existingClass = (templSpec ==
- tempArgListToString(templateClass->templateArguments(),root->lang)
+ tempArgListToString(templateClass->templateArguments(),root->lang,false)
);
if (existingClass) return TRUE;
@@ -4382,7 +4382,7 @@ static bool findClassRelation(
// instance (for instance if a class
// derived from a template argument)
{
- //printf("baseClass=%p templSpec=%s\n",baseClass,templSpec.data());
+ //printf("baseClass=%s templSpec=%s\n",baseClass->name().data(),templSpec.data());
ClassDef *templClass=getClass(baseClass->name()+templSpec);
if (templClass)
{
@@ -7352,14 +7352,13 @@ static void computeMemberRelations()
{
const ClassDef *bmcd = bmd->getClassDef();
//printf("Check relation between '%s'::'%s' (%p) and '%s'::'%s' (%p)\n",
- // mcd->name().data(),md->name().data(),md,
- // bmcd->name().data(),bmd->name().data(),bmd
+ // mcd->name().data(),md->name().data(),md.get(),
+ // bmcd->name().data(),bmd->name().data(),bmd.get()
// );
if (bmcd && mcd && bmcd!=mcd &&
- (bmd->virtualness()!=Normal || bmd->getLanguage()==SrcLangExt_Python ||
- bmd->getLanguage()==SrcLangExt_Java || bmd->getLanguage()==SrcLangExt_PHP ||
- bmcd->compoundType()==ClassDef::Interface ||
- bmcd->compoundType()==ClassDef::Protocol
+ (bmd->virtualness()!=Normal ||
+ bmd->getLanguage()==SrcLangExt_Python || bmd->getLanguage()==SrcLangExt_Java || bmd->getLanguage()==SrcLangExt_PHP ||
+ bmcd->compoundType()==ClassDef::Interface || bmcd->compoundType()==ClassDef::Protocol
) &&
md->isFunction() &&
mcd->isLinkable() &&
@@ -7370,8 +7369,8 @@ static void computeMemberRelations()
const ArgumentList &bmdAl = bmd->argumentList();
const ArgumentList &mdAl = md->argumentList();
//printf(" Base argList='%s'\n Super argList='%s'\n",
- // argListToString(bmdAl.pointer()).data(),
- // argListToString(mdAl.pointer()).data()
+ // argListToString(bmdAl).data(),
+ // argListToString(mdAl).data()
// );
if (
matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),&bmdAl,
@@ -7380,6 +7379,7 @@ static void computeMemberRelations()
)
)
{
+ //printf("match!\n");
MemberDef *rmd;
if ((rmd=md->reimplements())==0 ||
minClassDistance(mcd,bmcd)<minClassDistance(mcd,rmd->getClassDef())
@@ -7391,6 +7391,10 @@ static void computeMemberRelations()
//printf("%s: add reimplementedBy member %s\n",bmcd->name().data(),mcd->name().data());
bmd->insertReimplementedBy(md.get());
}
+ else
+ {
+ //printf("no match!\n");
+ }
}
}
}
@@ -7947,7 +7951,8 @@ static void inheritDocumentation()
{
for (const auto &md : *mn)
{
- //printf("%04d Member '%s'\n",count++,md->name().data());
+ //static int count=0;
+ //printf("%04d Member '%s'\n",count++,md->qualifiedName().data());
if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
{ // no documentation yet
MemberDef *bmd = md->reimplements();
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
index c3c420a..cae209c 100644
--- a/src/memberdef.cpp
+++ b/src/memberdef.cpp
@@ -4343,11 +4343,9 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember(
const ArgumentList &formalArgs,const std::unique_ptr<ArgumentList> &actualArgs) const
{
//printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
- std::unique_ptr<ArgumentList> actualArgList;
+ std::unique_ptr<ArgumentList> actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
if (!m_impl->defArgList.empty())
{
- actualArgList = std::make_unique<ArgumentList>(m_impl->defArgList);
-
// replace formal arguments with actuals
for (Argument &arg : *actualArgList)
{
@@ -4356,10 +4354,6 @@ MemberDef *MemberDefImpl::createTemplateInstanceMember(
actualArgList->setTrailingReturnType(
substituteTemplateArgumentsInString(actualArgList->trailingReturnType(),formalArgs,actualArgs));
}
- else
- {
- actualArgList = std::make_unique<ArgumentList>();
- }
QCString methodName=name();
if (methodName.left(9)=="operator ") // conversion operator
diff --git a/src/util.cpp b/src/util.cpp
index 41fcffa..6045bac 100644
--- a/src/util.cpp
+++ b/src/util.cpp
@@ -2200,55 +2200,57 @@ QCString argListToString(const ArgumentList &al,bool useCanonicalType,bool showD
return removeRedundantWhiteSpace(result);
}
-QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang)
+QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang,bool includeDefault)
{
QCString result;
if (al.empty()) return result;
result="<";
- auto it = al.begin();
- while (it!=al.end())
+ bool first=true;
+ for (const auto &a : al)
{
- Argument a = *it;
- if (!a.name.isEmpty()) // add template argument name
+ if (a.defval.isEmpty() || includeDefault)
{
- if (a.type.left(4)=="out") // C# covariance
- {
- result+="out ";
- }
- else if (a.type.left(3)=="in") // C# contravariance
+ if (!first) result+=", ";
+ if (!a.name.isEmpty()) // add template argument name
{
- result+="in ";
- }
- if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
- {
- result+=a.type+" ";
+ if (a.type.left(4)=="out") // C# covariance
+ {
+ result+="out ";
+ }
+ else if (a.type.left(3)=="in") // C# contravariance
+ {
+ result+="in ";
+ }
+ if (lang==SrcLangExt_Java || lang==SrcLangExt_CSharp)
+ {
+ result+=a.type+" ";
+ }
+ result+=a.name;
}
- result+=a.name;
- }
- else // extract name from type
- {
- int i=a.type.length()-1;
- while (i>=0 && isId(a.type.at(i))) i--;
- if (i>0)
+ else // extract name from type
{
- result+=a.type.right(a.type.length()-i-1);
- if (a.type.find("...")!=-1)
+ int i=a.type.length()-1;
+ while (i>=0 && isId(a.type.at(i))) i--;
+ if (i>0)
{
- result+="...";
+ result+=a.type.right(a.type.length()-i-1);
+ if (a.type.find("...")!=-1)
+ {
+ result+="...";
+ }
+ }
+ else // nothing found -> take whole name
+ {
+ result+=a.type;
}
}
- else // nothing found -> take whole name
+ if (!a.typeConstraint.isEmpty() && lang==SrcLangExt_Java)
{
- result+=a.type;
+ result+=" extends "; // TODO: now Java specific, C# has where...
+ result+=a.typeConstraint;
}
+ first=false;
}
- if (!a.typeConstraint.isEmpty() && lang==SrcLangExt_Java)
- {
- result+=" extends "; // TODO: now Java specific, C# has where...
- result+=a.typeConstraint;
- }
- ++it;
- if (it!=al.end()) result+=", ";
}
result+=">";
return removeRedundantWhiteSpace(result);
@@ -2814,8 +2816,10 @@ static QCString getCanonicalTypeForIdentifier(
{
symName=word;
}
- //printf("getCanonicalTypeForIdentifier(%s,[%s->%s]) start\n",
- // word.data(),tSpec?tSpec->data():"<none>",templSpec.data());
+ //printf("getCanonicalTypeForIdentifier(%s d=%s fs=%s ,[%s->%s]) start\n",
+ // word.data(),
+ // d ? d->name().data() : "<null>",fs ? fs->name().data() : "<null>",
+ // tSpec?tSpec->data():"<none>",templSpec.data());
const ClassDef *cd = 0;
const MemberDef *mType = 0;
@@ -2908,7 +2912,13 @@ static QCString getCanonicalTypeForIdentifier(
//printf("word=%s typeString=%s\n",word.data(),mType->typeString());
if (word!=mType->typeString())
{
- result = getCanonicalTypeForIdentifier(d,fs,mType->typeString(),tSpec,count+1);
+ QCString type = mType->typeString();
+ if (type.startsWith("typename "))
+ {
+ type.stripPrefix("typename ");
+ type = stripTemplateSpecifiersFromScope(type,FALSE);
+ }
+ result = getCanonicalTypeForIdentifier(d,fs,type,tSpec,count+1);
}
else
{
@@ -2961,7 +2971,6 @@ static QCString extractCanonicalType(const Definition *d,const FileDef *fs,QCStr
//printf(" i=%d p=%d\n",i,p);
if (i>pp) canType += type.mid(pp,i-pp);
-
QCString ct = getCanonicalTypeForIdentifier(d,fs,word,&templSpec);
// in case the ct is empty it means that "word" represents scope "d"
@@ -3032,9 +3041,9 @@ static bool matchArgument2(
{
//printf(">> match argument: %s::'%s|%s' (%s) <-> %s::'%s|%s' (%s)\n",
// srcScope ? srcScope->name().data() : "",
- // srcA->type.data(),srcA->name.data(),srcA->canType.data(),
+ // srcA.type.data(),srcA.name.data(),srcA.canType.data(),
// dstScope ? dstScope->name().data() : "",
- // dstA->type.data(),dstA->name.data(),dstA->canType.data());
+ // dstA.type.data(),dstA.name.data(),dstA.canType.data());
//if (srcA->array!=dstA->array) // nomatch for char[] against char
//{
diff --git a/src/util.h b/src/util.h
index 5324bf7..09b1d22 100644
--- a/src/util.h
+++ b/src/util.h
@@ -283,7 +283,7 @@ QCString removeRedundantWhiteSpace(const QCString &s);
QCString argListToString(const ArgumentList &al,bool useCanonicalType=FALSE,bool showDefVals=TRUE);
-QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang);
+QCString tempArgListToString(const ArgumentList &al,SrcLangExt lang,bool includeDefaults=true);
QCString generateMarker(int id);