diff options
author | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2010-11-18 21:50:39 (GMT) |
---|---|---|
committer | dimitri <dimitri@afe2bf4a-e733-0410-8a33-86f594647bc7> | 2010-11-18 21:50:39 (GMT) |
commit | 0014470c309dccbc2ac72c527391039900b8cf3d (patch) | |
tree | a6d2454b4e6d53003fa829bb7134fe373461ed97 /src | |
parent | 01f41c40b8505c8f197ef1e5bf7e3a3bc777dc0e (diff) | |
download | Doxygen-0014470c309dccbc2ac72c527391039900b8cf3d.zip Doxygen-0014470c309dccbc2ac72c527391039900b8cf3d.tar.gz Doxygen-0014470c309dccbc2ac72c527391039900b8cf3d.tar.bz2 |
Release-1.7.2-20101118
Diffstat (limited to 'src')
36 files changed, 369 insertions, 123 deletions
diff --git a/src/classdef.cpp b/src/classdef.cpp index e38a251..a924dd6 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -1315,6 +1315,7 @@ void ClassDef::writeMemberGroups(OutputList &ol) // write user defined member groups if (m_impl->memberGroupSDict) { + m_impl->memberGroupSDict->sort(); MemberGroupSDict::Iterator mgli(*m_impl->memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index 1e5cc17..1682a95 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -102,6 +102,7 @@ CommandMap cmdMap[] = { "$", CMD_DOLLAR }, { "#", CMD_HASH }, { "%", CMD_PERCENT }, + { "::", CMD_DCOLON }, { "\"", CMD_QUOTE }, { "_internalref", CMD_INTERNALREF }, { "dot", CMD_DOT }, diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 1f4bd02..30e5b68 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -114,7 +114,8 @@ enum CommandType CMD_COPYBRIEF = 80, CMD_COPYDETAILS = 81, CMD_QUOTE = 82, - CMD_MSCFILE = 83 + CMD_MSCFILE = 83, + CMD_DCOLON = 84 }; enum HtmlTagType @@ -621,7 +621,7 @@ static void addParmType() static void addUsingDirective(const char *name) { - if (g_exampleBlock && g_sourceFileDef && name) + if (g_sourceFileDef && name) { NamespaceDef *nd = Doxygen::namespaceSDict->find(name); if (nd) @@ -3394,10 +3394,12 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, g_exampleName = exName; g_sourceFileDef = fd; g_lineNumbers = fd!=0 && showLineNumbers; - if (exBlock && fd==0) + bool cleanupSourceDef = FALSE; + if (/* exBlock */ fd==0) { // create a dummy filedef for the example - g_sourceFileDef = new FileDef("",exName); + g_sourceFileDef = new FileDef("",(exName?exName:"generated")); + cleanupSourceDef = TRUE; } if (g_sourceFileDef) { @@ -3433,7 +3435,7 @@ void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s, endFontClass(); g_code->endCodeLine(); } - if (exBlock && fd==0) + if (cleanupSourceDef) { // delete the temporary file definition used for this example delete g_sourceFileDef; diff --git a/src/commentcnv.l b/src/commentcnv.l index 660dae6..d3a7a92 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -25,6 +25,7 @@ #include <qstack.h> #include <qregexp.h> #include <qtextstream.h> +#include <qglobal.h> #include "bufstr.h" #include "debug.h" @@ -33,6 +34,7 @@ #include "doxygen.h" #include "util.h" +#include <assert.h> #define ADDCHAR(c) g_outBuf->addChar(c) #define ADDARRAY(a,s) g_outBuf->addArray(a,s) @@ -134,7 +136,7 @@ static inline void copyToOutput(const char *s,int len) } } } - else + else if (len>0) { ADDARRAY(s,len); static int tabSize=Config_getInt("TAB_SIZE"); @@ -318,17 +320,23 @@ void replaceComment(int offset); copyToOutput(yytext,yyleng); } <Scan>("//!"|"///").*/\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */ - if (g_mlBrief) REJECT; // bail out if we do not need to convert - int i=3; - if (yytext[2]=='/') + if (g_mlBrief) { - while (i<(int)yyleng && yytext[i]=='/') i++; + REJECT; // bail out if we do not need to convert + } + else + { + int i=3; + if (yytext[2]=='/') + { + while (i<(int)yyleng && yytext[i]=='/') i++; + } + g_blockHeadCol=g_col; + copyToOutput("/**",3); + replaceAliases(yytext+i); + g_inSpecialComment=TRUE; + BEGIN(SComment); } - g_blockHeadCol=g_col; - copyToOutput("/**",3); - replaceAliases(yytext+i); - g_inSpecialComment=TRUE; - BEGIN(SComment); } <Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */ if (g_mlBrief) REJECT; @@ -602,7 +610,7 @@ void replaceComment(int offset); } <SComment>\n[ \t]*"//!" | <SComment>\n[ \t]*"//!<"/.*\n | -<SComment>\n[ \t]*"//!"[^<\n]/.*\n { +<SComment>\n[ \t]*"//!"[^<\n]/.*\n { replaceComment(1); g_readLineCtx=YY_START; BEGIN(ReadLine); @@ -752,24 +760,25 @@ void replaceComment(int offset); %% -void replaceComment(int offset) +void replaceComment(int offset) { - if (g_mlBrief) - { - copyToOutput(yytext,yyleng); - } - else - { + if (g_mlBrief) + { + copyToOutput(yytext,yyleng); + } + else + { //printf("replaceComment(%s)\n",yytext); - int i=computeIndent(&yytext[offset]); - if (i==g_blockHeadCol) - { - replaceCommentMarker(yytext,yyleng); - } - else - { - copyToOutput(" */",3); - int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); + int i=computeIndent(&yytext[offset]); + if (i==g_blockHeadCol) + { + replaceCommentMarker(yytext,yyleng); + } + else + { + copyToOutput(" */",3); + int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]); + g_inSpecialComment=FALSE; BEGIN(Scan); } } diff --git a/src/commentscan.l b/src/commentscan.l index 5926d7c..c51431b 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -2661,7 +2661,7 @@ void openGroup(Entry *e,const char *,int) } else // start of a member group { - //printf(" membergroup id=%d\n",g_memberGroupId); + //printf(" membergroup id=%d %s\n",g_memberGroupId,g_memberGroupHeader.data()); if (g_memberGroupId==DOX_NOGROUP) // no group started yet { static int curGroupId=0; diff --git a/src/compound.xsd b/src/compound.xsd index 7f67a2c..0b2ed4d 100644 --- a/src/compound.xsd +++ b/src/compound.xsd @@ -586,12 +586,6 @@ <xsd:sequence> <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" /> </xsd:sequence> - </xsd:complexType> - - <xsd:complexType name="docParamName" mixed="true"> - <xsd:sequence> - <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" /> - </xsd:sequence> <xsd:attribute name="direction" type="DoxParamDir" use="optional" /> </xsd:complexType> diff --git a/src/compound_xsd.h b/src/compound_xsd.h index 0404b78..1961b07 100644 --- a/src/compound_xsd.h +++ b/src/compound_xsd.h @@ -586,12 +586,6 @@ " <xsd:sequence>\n" " <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" " </xsd:sequence>\n" -" </xsd:complexType>\n" -"\n" -" <xsd:complexType name=\"docParamName\" mixed=\"true\">\n" -" <xsd:sequence>\n" -" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n" -" </xsd:sequence>\n" " <xsd:attribute name=\"direction\" type=\"DoxParamDir\" use=\"optional\" />\n" " </xsd:complexType>\n" "\n" diff --git a/src/config.xml b/src/config.xml index be324a4..d7d4669 100644 --- a/src/config.xml +++ b/src/config.xml @@ -420,6 +420,14 @@ Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. Note: This option applies only to the class list, not to the alphabetical list. ' defval='0'/> + <option type='bool' id='STRICT_PROTO_MATCHING' docs=' +If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +do proper type resolution of all parameters of a function it will reject a +match between the prototype and the implementation of a member function even +if there is only one candidate or it is obvious which candidate to choose +by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +will still accept a match between prototype and implementation in such cases. +' defval='0'/> <option type='bool' id='GENERATE_TODOLIST' docs=' The GENERATE_TODOLIST tag can be used to enable (YES) or disable (NO) the todo list. This list is created by putting \todo @@ -663,8 +671,8 @@ The FILTER_PATTERNS tag can be used to specify filters on a per file pattern basis. Doxygen will compare the file name with each pattern and apply the filter if there is a match. The filters are a list of the form: pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further -info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER -is applied to all files. +info on how filters are used. If FILTER_PATTERNS is empty or if +non of the patterns match the file name, INPUT_FILTER is applied. '> </option> <option type='bool' id='FILTER_SOURCE_FILES' docs=' @@ -672,6 +680,13 @@ If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using INPUT_FILTER) will be used to filter the input files when producing source files to browse (i.e. when SOURCE_BROWSER is set to YES). ' defval='0'/> + <option type='list' id='FILTER_SOURCE_PATTERNS' format='file' docs=' +The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +pattern. A pattern will override the setting for FILTER_PATTERN (if any) +and it is also possible to disable source filtering for a specific pattern +using *.ext= (so without naming a filter). This option only has effect when +FILTER_SOURCE_FILES is enabled. +' depends='FILTER_SOURCE_FILES'/> </group> <group name='Source Browser' docs='configuration options related to source browsing'> <option type='bool' id='SOURCE_BROWSER' docs=' diff --git a/src/configoptions.cpp b/src/configoptions.cpp index 38f7ed8..d3d4aa4 100644 --- a/src/configoptions.cpp +++ b/src/configoptions.cpp @@ -601,6 +601,14 @@ void addConfigOptions(Config *cfg) ); //---- cb = cfg->addBool( + "STRICT_PROTO_MATCHING", + "If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to do proper type resolution of all parameters of a function it will reject a\n" + "match between the prototype and the implementation of a member function even if there is only one candidate or it is obvious which candidate to choose by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen\n" + "will still accept a match between prototype and implementation in such cases.", + FALSE + ); + //---- + cb = cfg->addBool( "GENERATE_TODOLIST", "The GENERATE_TODOLIST tag can be used to enable (YES) or\n" "disable (NO) the todo list. This list is created by putting \\todo\n" @@ -934,8 +942,8 @@ void addConfigOptions(Config *cfg) "filter if there is a match.\n" "The filters are a list of the form:\n" "pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further\n" - "info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER\n" - "is applied to all files." + "info on how filters are used. If FILTER_PATTERNS is empty or if\n" + "non of the patterns match the file name, INPUT_FILTER is applied." ); cl->setWidgetType(ConfigList::File); //---- @@ -946,6 +954,17 @@ void addConfigOptions(Config *cfg) "files to browse (i.e. when SOURCE_BROWSER is set to YES).", FALSE ); + //---- + cl = cfg->addList( + "FILTER_SOURCE_PATTERNS", + "The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file\n" + "pattern. A pattern will override the setting for FILTER_PATTERN (if any)\n" + "and it is also possible to disable source filtering for a specific pattern\n" + "using *.ext= (so without naming a filter). This option only has effect when\n" + "FILTER_SOURCE_FILES is enabled." + ); + cl->addDependency("FILTER_SOURCE_FILES"); + cl->setWidgetType(ConfigList::File); //--------------------------------------------------------------------------- cfg->addInfo("Source Browser","configuration options related to source browsing"); //--------------------------------------------------------------------------- diff --git a/src/declinfo.l b/src/declinfo.l index 3affce2..13c0715 100644 --- a/src/declinfo.l +++ b/src/declinfo.l @@ -128,9 +128,11 @@ ID "$"?([a-z_A-Z\x80-\xFF][a-z_A-Z0-9\x80-\xFF]*)|(@[0-9]+) name += yytext; } } -<Start>(~{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java, +<Start>([~!]{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java, // the / was add to deal with multi- // dimensional C++ arrays like A[][15] + // the leading ~ is for a destructor + // the leading ! is for a C++/CLI finalizer (see bug 456475 and 635198) addTypeName(); name += yytext; } diff --git a/src/definition.cpp b/src/definition.cpp index 6cec012..e4cf2c8 100644 --- a/src/definition.cpp +++ b/src/definition.cpp @@ -544,7 +544,7 @@ static bool readCodeFragment(const char *fileName, static bool filterSourceFiles = Config_getBool("FILTER_SOURCE_FILES"); //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine); if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name - QCString filter = getFileFilter(fileName); + QCString filter = getFileFilter(fileName,TRUE); FILE *f=0; bool usePipe = !filter.isEmpty() && filterSourceFiles; if (!usePipe) // no filter given or wanted diff --git a/src/docparser.cpp b/src/docparser.cpp index 1b51d0a..55c1f0f 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -540,6 +540,7 @@ static void detectNoDocumentedParams() g_memberDef->hasDocumentedReturnType() || returnType.isEmpty() || // empty return type returnType.find("void")!=-1 || // void return type + returnType.find("subroutine")!=-1 || // fortran subroutine g_memberDef->isConstructor() || // a constructor g_memberDef->isDestructor() // or destructor ) @@ -1107,8 +1108,12 @@ static void handleLinkedWord(DocNode *parent,QList<DocNode> &children) if (g_token->name.left(1)=="#" || g_token->name.left(2)=="::") { warn_doc_error(g_fileName,doctokenizerYYlineno,"warning: explicit link request to '%s' could not be resolved",qPrint(name)); + children.append(new DocWord(parent,g_token->name)); + } + else + { + children.append(new DocWord(parent,name)); } - children.append(new DocWord(parent,name)); } } @@ -1179,6 +1184,9 @@ reparsetoken: case CMD_HASH: children.append(new DocSymbol(parent,DocSymbol::Hash)); break; + case CMD_DCOLON: + children.append(new DocSymbol(parent,DocSymbol::DoubleColon)); + break; case CMD_PERCENT: children.append(new DocSymbol(parent,DocSymbol::Percent)); break; @@ -3018,6 +3026,7 @@ int DocIndexEntry::parse() case CMD_AMP: m_entry+='&'; break; case CMD_DOLLAR: m_entry+='$'; break; case CMD_HASH: m_entry+='#'; break; + case CMD_DCOLON: m_entry+="::"; break; case CMD_PERCENT: m_entry+='%'; break; case CMD_QUOTE: m_entry+='"'; break; default: @@ -4772,6 +4781,9 @@ int DocPara::handleCommand(const QCString &cmdName) case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Hash)); break; + case CMD_DCOLON: + m_children.append(new DocSymbol(this,DocSymbol::DoubleColon)); + break; case CMD_PERCENT: m_children.append(new DocSymbol(this,DocSymbol::Percent)); break; @@ -6197,6 +6209,9 @@ void DocText::parse() case CMD_HASH: m_children.append(new DocSymbol(this,DocSymbol::Hash)); break; + case CMD_DCOLON: + m_children.append(new DocSymbol(this,DocSymbol::DoubleColon)); + break; case CMD_PERCENT: m_children.append(new DocSymbol(this,DocSymbol::Percent)); break; diff --git a/src/docparser.h b/src/docparser.h index 6b2a863..6494d08 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -313,7 +313,7 @@ class DocSymbol : public DocNode { public: enum SymType { Unknown=0, BSlash, At, Less, Greater, Amp, Dollar, Hash, - Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute, + DoubleColon, Percent, Copy, Tm, Reg, Apos, Quot, Uml, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Slash, Lsquo, Rsquo, Ldquo, Rdquo, Ndash, Mdash, Aelig, AElig }; diff --git a/src/docsets.cpp b/src/docsets.cpp index fa14cfa..17fbd7d 100644 --- a/src/docsets.cpp +++ b/src/docsets.cpp @@ -343,6 +343,16 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *) case MemberDef::Event: type="event"; break; } + cd = md->getClassDef(); + nd = md->getNamespaceDef(); + if (cd) + { + scope = cd->qualifiedName(); + } + else if (nd) + { + scope = nd->name(); + } writeToken(m_tts,md,type,lang,scope,md->anchor()); } else if (context && context->isLinkable()) @@ -404,7 +414,7 @@ void DocSets::addIndexItem(Definition *context,MemberDef *md,const char *) } if (m_scopes.find(context->getOutputFileBase())==0) { - writeToken(m_tts,context,type,lang,0,0,decl); + writeToken(m_tts,context,type,lang,scope,0,decl); m_scopes.append(context->getOutputFileBase(),(void*)0x8); } } diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 5cec5d7..a463c34 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -310,6 +310,7 @@ VERBATIM "verbatim"{BLANK}* SPCMD1 {CMD}([a-z_A-Z][a-z_A-Z0-9]*|{VERBATIM}) SPCMD2 {CMD}[\\@<>&$#%~"] SPCMD3 {CMD}form#[0-9]+ +SPCMD4 {CMD}"::" INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in") PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]" TEMPCHAR [a-z_A-Z0-9,: \t\*\&] @@ -429,7 +430,8 @@ REFWORD {LABELID}|{REFWORD2} return TK_COMMAND; } <St_Para>{SPCMD1} | -<St_Para>{SPCMD2} { /* special command */ +<St_Para>{SPCMD2} | +<St_Para>{SPCMD4} { /* special command */ g_token->name = yytext+1; g_token->name = g_token->name.stripWhiteSpace(); g_token->paramDir=TokenInfo::Unspecified; diff --git a/src/dot.cpp b/src/dot.cpp index 523d515..423e45d 100644 --- a/src/dot.cpp +++ b/src/dot.cpp @@ -997,9 +997,9 @@ bool DotManager::run() { uint numDotRuns = m_dotRuns.count(); uint numDotMaps = m_dotMaps.count(); - if (numDotRuns+numDotMaps>0) + if (numDotRuns+numDotMaps>1) { - msg("Generating dot graphs using %d parallel threads...\n",m_workers.count()); + msg("Generating dot graphs using %d parallel threads...\n",QMIN(numDotRuns+numDotMaps,m_workers.count())); } int i=1; QListIterator<DotRunner> li(m_dotRuns); diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 7ff5c89..f229ded 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -3921,7 +3921,7 @@ static bool findTemplateInstanceRelation(Entry *root, // int *tempArgIndex; // for (;(tempArgIndex=qdi.current());++qdi) // { - // printf("(%s->%d) ",qdi.currentKey().data(),*tempArgIndex); + // printf("(%s->%d) ",qdi.currentKey(),*tempArgIndex); // } //} //printf("\n"); @@ -5651,26 +5651,53 @@ static void findMember(EntryNav *rootNav, if (count==0 && !(isFriend && funcType=="class")) { int candidates=0; + ClassDef *ccd = 0, *ecd = 0; + MemberDef *cmd = 0, *emd = 0; if (mn->count()>0) { //printf("Assume template class\n"); for (mni.toFirst();(md=mni.current());++mni) { - ClassDef *cd=md->getClassDef(); - //printf("cd->name()==%s className=%s\n",cd->name().data(),className.data()); - if (cd!=0 && rightScopeMatch(cd->name(),className)) + ccd=md->getClassDef(); + cmd=md; + //printf("ccd->name()==%s className=%s\n",ccd->name().data(),className.data()); + if (ccd!=0 && rightScopeMatch(ccd->name(),className)) { LockingPtr<ArgumentList> templAl = md->templateArguments(); if (root->tArgLists && templAl!=0 && root->tArgLists->getLast()->count()<=templAl->count()) { - addMethodToClass(rootNav,cd,md->name(),isFriend); + addMethodToClass(rootNav,ccd,md->name(),isFriend); return; } + if (md->argsString()==argListToString(root->argList,TRUE,FALSE)) + { // exact argument list match -> remember + ecd = ccd; + emd = cmd; + } candidates++; } } } + static bool strictProtoMatching = Config_getBool("STRICT_PROTO_MATCHING"); + if (!strictProtoMatching) + { + if (candidates==1 && ccd && cmd) + { + // we didn't find an actual match on argument lists, but there is only 1 member with this + // name in the same scope, so that has to be the one. + addMemberDocs(rootNav,cmd,funcDecl,0,overloaded,0); + return; + } + else if (candidates>1 && ecd && emd) + { + // we didn't find a unique match using type resolution, + // but one of the matches has the exact same signature so + // we take that one. + addMemberDocs(rootNav,emd,funcDecl,0,overloaded,0); + return; + } + } QCString warnMsg = "warning: no "; if (noMatchCount>1) warnMsg+="uniquely "; diff --git a/src/filedef.cpp b/src/filedef.cpp index 786fcf1..1cc840b 100644 --- a/src/filedef.cpp +++ b/src/filedef.cpp @@ -61,7 +61,7 @@ class DevNullCodeDocInterface : public CodeOutputInterface //--------------------------------------------------------------------------- /*! create a new file definition, where \a p is the file path, - \a nm the file name, and \a ref is an HTML anchor name if the + \a nm the file name, and \a lref is an HTML anchor name if the file was read from a tag file or 0 otherwise */ FileDef::FileDef(const char *p,const char *nm, @@ -431,6 +431,7 @@ void FileDef::writeMemberGroups(OutputList &ol) /* write user defined member groups */ if (memberGroupSDict) { + memberGroupSDict->sort(); MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) @@ -789,7 +790,7 @@ void FileDef::writeSource(OutputList &ol) pIntf->resetCodeParserState(); ol.startCodeFragment(); pIntf->parseCode(ol,0, - fileToString(absFilePath(),filterSourceFiles), + fileToString(absFilePath(),filterSourceFiles,TRUE), FALSE,0,this ); ol.endCodeFragment(); @@ -806,7 +807,7 @@ void FileDef::parseSource() pIntf->resetCodeParserState(); pIntf->parseCode( devNullIntf,0, - fileToString(absFilePath(),filterSourceFiles), + fileToString(absFilePath(),filterSourceFiles,TRUE), FALSE,0,this ); } diff --git a/src/fortranscanner.l b/src/fortranscanner.l index cb6a9f9..3156eb1 100644 --- a/src/fortranscanner.l +++ b/src/fortranscanner.l @@ -527,7 +527,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA /*------- module/global/typedef variable ---------------------------------------------------*/ -<SubprogBody,SubprogBodyContains>^{BS}"end"({BS}{SUBPROG}({BS_}{ID})?)?{BS}/(\n|!) { +<SubprogBody,SubprogBodyContains>^{BS}[0-9]*{BS}"end"({BS}{SUBPROG}({BS_}{ID})?)?{BS}/(\n|!) { //fprintf(stderr,"1e=========> got end subprog: %s\n", yytext); /* args is used for parameters in list of functions, argList for @@ -696,7 +696,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA // TYPE_SPEC is for old function style function result result= yytext; result= result.stripWhiteSpace(); - extractPrefix(result); + //extractPrefix(result); //fprintf(stderr, "===%s\n", (const char*)result); current->type = result; yy_push_state(SubprogPrefix); @@ -712,7 +712,7 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA // Fortran subroutine or function found result= yytext; result= result.stripWhiteSpace(); - extractPrefix(result); + //extractPrefix(result); addSubprogram(result); yy_push_state(Subprog); } @@ -841,7 +841,9 @@ PREFIX (RECURSIVE{BS_}|PURE{BS_}|ELEMENTAL{BS_}){0,2}(RECURSIVE|PURE|ELEMENTA %% //---------------------------------------------------------------------------- -static void extractPrefix(QCString &text) { +#if 0 +static void extractPrefix(QCString &text) +{ int prefixIndex = 0; int curIndex = 0; bool cont = TRUE; @@ -860,6 +862,7 @@ static void extractPrefix(QCString &text) { } } } +#endif static int getAmpersandAtTheStart(const char *buf, int length) { diff --git a/src/groupdef.cpp b/src/groupdef.cpp index aaf4d1b..7d7ea6c 100644 --- a/src/groupdef.cpp +++ b/src/groupdef.cpp @@ -753,6 +753,7 @@ void GroupDef::writeMemberGroups(OutputList &ol) /* write user defined member groups */ if (memberGroupSDict) { + memberGroupSDict->sort(); /* write user defined member groups */ MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp index 81dc753..081dcc9 100644 --- a/src/htmldocvisitor.cpp +++ b/src/htmldocvisitor.cpp @@ -179,6 +179,7 @@ void HtmlDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "&"; break; case DocSymbol::Dollar: m_t << "$"; break; case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; case DocSymbol::Copy: m_t << "©"; break; case DocSymbol::Tm: m_t << "™"; break; @@ -304,7 +305,7 @@ void HtmlDocVisitor::visit(DocVerbatim *s) if (m_hide) return; switch(s->type()) { - case DocVerbatim::Code: // fall though + case DocVerbatim::Code: forceEndParagraph(s); m_t << PREFRAG_START; Doxygen::parserManager->getParser(m_langExt) diff --git a/src/index.cpp b/src/index.cpp index 8031f56..a049a3f 100644 --- a/src/index.cpp +++ b/src/index.cpp @@ -42,6 +42,7 @@ #include "pagedef.h" #include "dirdef.h" #include "vhdldocgen.h" +#include "layout.h" #define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX 200 #define MAX_ITEMS_BEFORE_QUICK_INDEX 30 @@ -1879,6 +1880,35 @@ void writeQuickMemberIndex(OutputList &ol, //---------------------------------------------------------------------------- +struct CmhlInfo +{ + CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} + const char *fname; + QCString title; +}; + +static const CmhlInfo *getCmhlInfo(int hl) +{ + static bool fortranOpt = Config_getBool("OPTIMIZE_FOR_FORTRAN"); + static bool vhdlOpt = Config_getBool("OPTIMIZE_OUTPUT_VHDL"); + static CmhlInfo cmhlInfo[] = + { + CmhlInfo("functions", theTranslator->trAll()), + CmhlInfo("functions_func", + fortranOpt ? theTranslator->trSubprograms() : + vhdlOpt ? VhdlDocGen::trFunctionAndProc() : + theTranslator->trFunctions()), + CmhlInfo("functions_vars",theTranslator->trVariables()), + CmhlInfo("functions_type",theTranslator->trTypedefs()), + CmhlInfo("functions_enum",theTranslator->trEnumerations()), + CmhlInfo("functions_eval",theTranslator->trEnumerationValues()), + CmhlInfo("functions_prop",theTranslator->trProperties()), + CmhlInfo("functions_evnt",theTranslator->trEvents()), + CmhlInfo("functions_rela",theTranslator->trRelatedFunctions()) + }; + return &cmhlInfo[hl]; +} + static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl) { if (documentedClassMembers[hl]==0) return; @@ -1894,6 +1924,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h numPages=127; } +#if 0 struct CmhlInfo { CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {} @@ -1914,6 +1945,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h CmhlInfo("functions_evnt",theTranslator->trEvents()), CmhlInfo("functions_rela",theTranslator->trRelatedFunctions()) }; +#endif ol.pushGeneratorState(); ol.disableAllBut(OutputGenerator::Html); @@ -1922,7 +1954,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h QCString title = fortranOpt ? theTranslator->trCompoundMembersFortran() : vhdlOpt ? VhdlDocGen::trDesignUnitMembers() : theTranslator->trCompoundMembers() ; - if (hl!=CMHL_All) title+=(QCString)" - "+cmhlInfo[hl].title; + if (hl!=CMHL_All) title+=(QCString)" - "+getCmhlInfo(hl)->title; int page; bool first=TRUE; @@ -1930,7 +1962,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h { if (!multiPageIndex || g_memberIndexLetterUsed[hl][page].count()>0) { - QCString fileName = cmhlInfo[hl].fname; + QCString fileName = getCmhlInfo(hl)->fname; if (multiPageIndex && !first) { fileName+=QCString().sprintf("_0x%02x",page); @@ -1942,8 +1974,8 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h // index item for global member list startQuickIndexItem(ol, - cmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); - ol.writeString(fixSpaces(cmhlInfo[0].title)); + getCmhlInfo(0)->fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first); + ol.writeString(fixSpaces(getCmhlInfo(0)->title)); endQuickIndexItem(ol); // index items per category member lists @@ -1952,10 +1984,10 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h { if (documentedClassMembers[i]>0) { - startQuickIndexItem(ol,cmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); - ol.writeString(fixSpaces(cmhlInfo[i].title)); + startQuickIndexItem(ol,getCmhlInfo(i)->fname+Doxygen::htmlFileExtension,hl==i,TRUE,first); + ol.writeString(fixSpaces(getCmhlInfo(i)->title)); //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n", - // multiPageIndex,first,fileName.data(),cmhlInfo[i].fname,cmhlInfo[i].title.data()); + // multiPageIndex,first,fileName.data(),getCmhlInfo(i)->fname,getCmhlInfo(i)->title.data()); endQuickIndexItem(ol); } } @@ -1967,7 +1999,7 @@ static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight h if (quickIndex) { writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page, - cmhlInfo[hl].fname,multiPageIndex); + getCmhlInfo(hl)->fname,multiPageIndex); } ol.endQuickIndices(); @@ -2978,6 +3010,57 @@ void writeExampleIndex(OutputList &ol) ol.popGeneratorState(); } + +//---------------------------------------------------------------------------- + +void writeFullNavIndex(QTextStream &t, LayoutNavEntry *root,int indent) +{ + QCString indentStr; + indentStr.fill(' ',indent*2); + if (root->children().count()>0) + { + t << indentStr << "<ul>" << endl; + QListIterator<LayoutNavEntry> li(root->children()); + LayoutNavEntry *entry; + for (li.toFirst();(entry=li.current());++li) + { + t << indentStr << "<li>"; + t << "<a href=\"" << entry->baseFile() << Doxygen::htmlFileExtension << "\">"; + t << fixSpaces(entry->title()); + t << "</a>"; + t << "</li>" << endl; + writeFullNavIndex(t,entry,indent+1); + if (entry->kind()==LayoutNavEntry::ClassMembers) + { + t << indentStr << " <ul>" << endl; + // index items per category member lists + int i; + for (i=0;i<CMHL_Total;i++) + { + if (documentedClassMembers[i]>0) + { + t << indentStr << " <li>"; + t << "<a href=\"" << getCmhlInfo(i)->fname << Doxygen::htmlFileExtension << "\">"; + t << fixSpaces(getCmhlInfo(i)->title); + t << "</a>"; + t << "</li>" << endl; + } + } + t << indentStr << " </ul>" << endl; + } + else if (entry->kind()==LayoutNavEntry::NamespaceMembers) + { + t << indentStr << " <namespacemembers>" << endl; + } + else if (entry->kind()==LayoutNavEntry::FileGlobals) + { + t << indentStr << " <fileglobals>" << endl; + } + } + t << indentStr << "</ul>" << endl; + } +} + //---------------------------------------------------------------------------- void countRelatedPages(int &docPages,int &indexPages) @@ -3619,6 +3702,18 @@ void writeIndex(OutputList &ol) projPrefix=Config_getString("PROJECT_NAME")+" "; } +#if 0 + { + QFile f("navindex.html"); + if (f.open(IO_WriteOnly)) + { + QTextStream t(&f); + LayoutNavEntry *layout = LayoutDocManager::instance().rootNavEntry(); + writeFullNavIndex(t,layout,0); + } + } +#endif + //-------------------------------------------------------------------- // write HTML index //-------------------------------------------------------------------- diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp index 46b9299..3c2e6f6 100644 --- a/src/latexdocvisitor.cpp +++ b/src/latexdocvisitor.cpp @@ -148,6 +148,7 @@ void LatexDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "\\&"; break; case DocSymbol::Dollar: m_t << "\\$"; break; case DocSymbol::Hash: m_t << "\\#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "\\%"; break; case DocSymbol::Copy: m_t << "\\copyright"; break; case DocSymbol::Tm: m_t << "\\texttrademark"; break; diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp index d1ec0d3..5dd9f5e 100644 --- a/src/mandocvisitor.cpp +++ b/src/mandocvisitor.cpp @@ -82,6 +82,7 @@ void ManDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "&"; break; case DocSymbol::Dollar: m_t << "$"; break; case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; case DocSymbol::Copy: m_t << "(C)"; break; case DocSymbol::Tm: m_t << "(TM)"; break; diff --git a/src/membergroup.cpp b/src/membergroup.cpp index d44a481..3e0f4e0 100644 --- a/src/membergroup.cpp +++ b/src/membergroup.cpp @@ -107,7 +107,7 @@ void MemberGroup::setAnchors(ClassDef *context) void MemberGroup::writeDeclarations(OutputList &ol, ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd) { - //printf("MemberGroup::writeDeclarations() memberList->count()=%d\n",memberList->count()); + printf("MemberGroup::writeDeclarations() %s\n",grpHeader.data()); QCString ldoc = doc; if (!ldoc.isEmpty()) ldoc.prepend("<a name=\""+anchor()+"\"></a>"); memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,ldoc/*,TRUE,TRUE*/); diff --git a/src/membergroup.h b/src/membergroup.h index cedad1e..496a95d 100644 --- a/src/membergroup.h +++ b/src/membergroup.h @@ -115,6 +115,10 @@ class MemberGroupSDict : public SIntDict<MemberGroup> public: MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {} ~MemberGroupSDict() {} + int compareItems(GCI item1,GCI item2) + { + return ((MemberGroup *)item1)->groupId() - ((MemberGroup*)item2)->groupId(); + } }; diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp index 98b4831..337403d 100644 --- a/src/namespacedef.cpp +++ b/src/namespacedef.cpp @@ -348,6 +348,7 @@ void NamespaceDef::writeMemberGroups(OutputList &ol) /* write user defined member groups */ if (memberGroupSDict) { + memberGroupSDict->sort(); MemberGroupSDict::Iterator mgli(*memberGroupSDict); MemberGroup *mg; for (;(mg=mgli.current());++mgli) diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp index 2b57f6c..a274ba9 100644 --- a/src/perlmodgen.cpp +++ b/src/perlmodgen.cpp @@ -532,6 +532,7 @@ void PerlModDocVisitor::visit(DocSymbol *sy) case DocSymbol::Amp: c = '&'; break; case DocSymbol::Dollar: c = '$'; break; case DocSymbol::Hash: c = '#'; break; + case DocSymbol::DoubleColon: s = "::"; break; case DocSymbol::Percent: c = '%'; break; case DocSymbol::Quot: c = '"'; break; case DocSymbol::Lsquo: s = "\\\'"; break; @@ -1300,10 +1300,10 @@ static void readIncludeFile(const QCString &inc) QCString absPath = incFileName; if (QDir::isRelativePath(incFileName)) { - QString absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName); + absPath = QDir::cleanDirPath(oldFileDef->getPath()+"/"+incFileName); //printf("%s + %s -> resolved path %s\n",oldFileDef->getPath().data(),incFileName.data(),absPath.data()); } - FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig); + FileDef *fd = findFileDef(Doxygen::inputNameDict,absPath,ambig); //printf("%s::findFileDef(%s)=%p\n",oldFileDef->name().data(),incFileName.data(),fd); // add include dependency to the file in which the #include was found oldFileDef->addIncludeDependency(fd,incFileName,localInclude,g_isImported); @@ -2130,8 +2130,7 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'")) } <SkipCComment,SkipCPPComment>[\\@]"cond"[ \t\r]*\n | <CondLine>. { - outputArray(yytext,yyleng); - g_yyLineNr+=QCString(yytext).contains('\n'); + unput(*yytext); startCondSection(" "); if (YY_START==CondLine) BEGIN(g_condCtx); } diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 4886b8d..c0a4019 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -110,6 +110,7 @@ void RTFDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "&"; break; case DocSymbol::Dollar: m_t << "$"; break; case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; case DocSymbol::Copy: m_t << "(C)"; break; case DocSymbol::Tm: m_t << "(TM)"; break; diff --git a/src/scanner.l b/src/scanner.l index be8f716..2fdf0f2 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -2099,7 +2099,12 @@ TYPEDEFPREFIX (("typedef"{BN}+)?)((("volatile"|"const"){BN}+)?) yyLineNr = atoi(&yytext[1]); //printf("setting line number to %d\n",yyLineNr); lastPreLineCtrlContext = YY_START; - current->program+=yytext; + if (YY_START==ReadBody || + YY_START==ReadNSBody || + YY_START==ReadBodyIntf) + { + current->program+=yytext; + } BEGIN( PreLineCtrl ); } <PreLineCtrl>"\""[^\n\"]*"\"" { @@ -5553,6 +5558,15 @@ static void handleCommentBlock(const QCString &doc,bool brief) if (docBlockInBody && hideInBodyDocs) return; //printf("parseCommentBlock [%s] brief=%d\n",doc.data(),brief); int lineNr = brief ? current->briefLine : current->docLine; // line of block start + + // fill in inbodyFile && inbodyLine the first time, see bug 633891 + Entry *docEntry = docBlockInBody && previous ? previous : current; + if (docBlockInBody && docEntry && docEntry->inbodyLine==-1) + { + docEntry->inbodyFile = yyFileName; + docEntry->inbodyLine = lineNr; + } + while (parseCommentBlock( g_thisParser, docBlockInBody && previous ? previous : current, diff --git a/src/textdocvisitor.cpp b/src/textdocvisitor.cpp index a39e16a..bddd436 100644 --- a/src/textdocvisitor.cpp +++ b/src/textdocvisitor.cpp @@ -33,6 +33,7 @@ void TextDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "&"; break; case DocSymbol::Dollar: m_t << "$"; break; case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; case DocSymbol::Copy: m_t << "©"; break; case DocSymbol::Tm: m_t << "&tm;"; break; diff --git a/src/util.cpp b/src/util.cpp index c9967ae..e22df70 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1959,7 +1959,7 @@ void writeExample(OutputList &ol,ExampleSDict *ed) } -QCString argListToString(ArgumentList *al,bool useCanonicalType) +QCString argListToString(ArgumentList *al,bool useCanonicalType,bool showDefVals) { QCString result; if (al==0) return result; @@ -1988,7 +1988,7 @@ QCString argListToString(ArgumentList *al,bool useCanonicalType) { result+= type1+type2; } - if (!a->defval.isEmpty()) + if (!a->defval.isEmpty() && showDefVals) { result+="="+a->defval; } @@ -2089,24 +2089,9 @@ int filterCRLF(char *buf,int len) return dest; // length of the valid part of the buf } - -/*! looks for a filter for the file \a name. Returns the name of the filter - * if there is a match for the file name, otherwise an empty string. - */ -QCString getFileFilter(const char* name) +static QCString getFilterFromList(const char *name,const QStrList &filterList,bool &found) { - // sanity check - if (name==0) return ""; - - // first look for filter pattern list - QStrList& filterList = Config_getList("FILTER_PATTERNS"); - - if (filterList.isEmpty()) - { - // use INPUT_FILTER instead (For all files) - return Config_getString("INPUT_FILTER"); - } - + found=FALSE; // compare the file name to the filter pattern list QStrListIterator sli(filterList); char* filterStr; @@ -2127,6 +2112,7 @@ QCString getFileFilter(const char* name) { // add quotes if the name has spaces filterName="\""+filterName+"\""; } + found=TRUE; return filterName; } } @@ -2136,6 +2122,39 @@ QCString getFileFilter(const char* name) return ""; } +/*! looks for a filter for the file \a name. Returns the name of the filter + * if there is a match for the file name, otherwise an empty string. + * In case \a inSourceCode is TRUE then first the source filter list is + * considered. + */ +QCString getFileFilter(const char* name,bool isSourceCode) +{ + // sanity check + if (name==0) return ""; + + QStrList& filterSrcList = Config_getList("FILTER_SOURCE_PATTERNS"); + QStrList& filterList = Config_getList("FILTER_PATTERNS"); + + QCString filterName; + bool found=FALSE; + if (isSourceCode && !filterSrcList.isEmpty()) + { // first look for source filter pattern list + filterName = getFilterFromList(name,filterSrcList,found); + } + if (!found && !filterName.isEmpty()) + { // then look for filter pattern list + filterName = getFilterFromList(name,filterList,found); + } + if (!found) + { // then use the generic input filter + return Config_getString("INPUT_FILTER"); + } + else + { + return filterName; + } +} + #if 0 QCString recodeString(const QCString &str,const char *fromEncoding,const char *toEncoding) { @@ -2220,7 +2239,7 @@ QCString transcodeCharacterStringToUTF8(const QCString &input) * is TRUE the file will be filtered by any user specified input filter. * If \a name is "-" the string will be read from standard input. */ -QCString fileToString(const char *name,bool filter) +QCString fileToString(const char *name,bool filter,bool isSourceCode) { if (name==0 || name[0]==0) return 0; QFile f; @@ -2255,7 +2274,7 @@ QCString fileToString(const char *name,bool filter) err("error: file `%s' not found\n",name); return ""; } - QCString filterName = getFileFilter(name); + QCString filterName = getFileFilter(name,isSourceCode); if (filterName.isEmpty() || !filter) { f.setName(name); @@ -2870,13 +2889,13 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, (srcAType+" "+srcAName)==dstAType) { MATCH - return TRUE; + return TRUE; } else if (!dstAName.isEmpty() && !srcA->type.isEmpty() && (dstAType+" "+dstAName)==srcAType) { MATCH - return TRUE; + return TRUE; } @@ -2993,7 +3012,7 @@ static bool matchArgument(const Argument *srcA,const Argument *dstA, } } MATCH - return TRUE; + return TRUE; } @@ -3033,12 +3052,12 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, if (match) { MATCH - return TRUE; + return TRUE; } else { NOMATCH - return FALSE; + return FALSE; } } @@ -3050,7 +3069,7 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, a->type = "void"; srcAl->append(a); MATCH - return TRUE; + return TRUE; } if ( dstAl->count()==0 && srcAl->count()==1 && srcAl->getFirst()->type=="void" ) @@ -3059,13 +3078,13 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, a->type = "void"; dstAl->append(a); MATCH - return TRUE; + return TRUE; } if (srcAl->count() != dstAl->count()) { NOMATCH - return FALSE; // different number of arguments -> no match + return FALSE; // different number of arguments -> no match } if (checkCV) @@ -3073,12 +3092,12 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, if (srcAl->constSpecifier != dstAl->constSpecifier) { NOMATCH - return FALSE; // one member is const, the other not -> no match + return FALSE; // one member is const, the other not -> no match } if (srcAl->volatileSpecifier != dstAl->volatileSpecifier) { NOMATCH - return FALSE; // one member is volatile, the other not -> no match + return FALSE; // one member is volatile, the other not -> no match } } @@ -3092,11 +3111,11 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, usingNamespaces,usingClasses)) { NOMATCH - return FALSE; + return FALSE; } } MATCH - return TRUE; // all arguments match + return TRUE; // all arguments match } #endif @@ -3162,8 +3181,10 @@ QCString getCanonicalTemplateSpec(Definition *d,FileDef *fs,const QCString& spec static QCString getCanonicalTypeForIdentifier( Definition *d,FileDef *fs,const QCString &word, - QCString *tSpec) + QCString *tSpec,int count=0) { + if (count>10) return word; // oops recursion + QCString symName,scope,result,templSpec,tmpName; //DefinitionList *defList=0; if (tSpec && !tSpec->isEmpty()) templSpec = stripDeclKeywords(getCanonicalTemplateSpec(d,fs,*tSpec)); @@ -3266,7 +3287,15 @@ static QCString getCanonicalTypeForIdentifier( else if (mType && mType->isTypedef()) // a typedef { //result = mType->qualifiedName(); // changed after 1.7.2 - result = mType->typeString(); + //result = mType->typeString(); + if (word!=mType->typeString()) + { + result = getCanonicalTypeForIdentifier(d,fs,mType->typeString(),tSpec,count++); + } + else + { + result = mType->typeString(); + } } else // fallback { @@ -6927,7 +6956,7 @@ bool readInputFile(const char *fileName,BufStr &inBuf) QFileInfo fi(fileName); if (!fi.exists()) return FALSE; - QCString filterName = getFileFilter(fileName); + QCString filterName = getFileFilter(fileName,FALSE); if (filterName.isEmpty()) { QFile f(fileName); @@ -118,7 +118,7 @@ void linkifyText(const TextGeneratorIntf &ol, void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId=-1); -QCString fileToString(const char *name,bool filter=FALSE); +QCString fileToString(const char *name,bool filter=FALSE,bool isSourceCode=FALSE); QCString dateToString(bool); @@ -135,7 +135,7 @@ bool getDefs(const QCString &scopeName, bool checkCV=FALSE ); -QCString getFileFilter(const char* name); +QCString getFileFilter(const char* name,bool isSourceCode); bool resolveRef(/* in */ const char *scName, /* in */ const char *name, @@ -207,7 +207,7 @@ inline bool isId(int c) QCString removeRedundantWhiteSpace(const QCString &s); -QCString argListToString(ArgumentList *al,bool useCanonicalType=FALSE); +QCString argListToString(ArgumentList *al,bool useCanonicalType=FALSE,bool showDefVals=TRUE); QCString tempArgListToString(ArgumentList *al); diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp index 5dfa052..5ebc070 100644 --- a/src/xmldocvisitor.cpp +++ b/src/xmldocvisitor.cpp @@ -76,6 +76,7 @@ void XmlDocVisitor::visit(DocSymbol *s) case DocSymbol::Amp: m_t << "&"; break; case DocSymbol::Dollar: m_t << "$"; break; case DocSymbol::Hash: m_t << "#"; break; + case DocSymbol::DoubleColon: m_t << "::"; break; case DocSymbol::Percent: m_t << "%"; break; case DocSymbol::Copy: m_t << "<copy/>"; break; case DocSymbol::Tm: m_t << "<trademark/>"; break; |