From 01ded6f6963d4798ce1338246d6d946dbc3922d9 Mon Sep 17 00:00:00 2001 From: Dimitri van Heesch Date: Wed, 14 Oct 2020 21:40:19 +0200 Subject: issue #8091: [C++] Newer doxygen versions add a lot of bogus warnings about undocumented entities --- src/defargs.l | 4 ++- src/doxygen.cpp | 27 ++++++++++------- src/memberdef.cpp | 8 +---- src/util.cpp | 89 ++++++++++++++++++++++++++++++------------------------- src/util.h | 2 +- 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}\" "volatile" { yyextra->argList->setVolatileSpecifier(TRUE); } +"override" { + } "&" { yyextra->argList->setRefQualifier(RefQualifierLValue); } @@ -790,7 +792,7 @@ std::unique_ptr 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)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 &actualArgs) const { //printf(" Member %s %s %s\n",typeString(),name().data(),argsString()); - std::unique_ptr actualArgList; + std::unique_ptr actualArgList = std::make_unique(m_impl->defArgList); if (!m_impl->defArgList.empty()) { - actualArgList = std::make_unique(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(); - } 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():"",templSpec.data()); + //printf("getCanonicalTypeForIdentifier(%s d=%s fs=%s ,[%s->%s]) start\n", + // word.data(), + // d ? d->name().data() : "",fs ? fs->name().data() : "", + // tSpec?tSpec->data():"",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); -- cgit v0.12