diff options
author | Dimitri van Heesch <dimitri@stack.nl> | 2005-07-21 08:42:44 (GMT) |
---|---|---|
committer | Dimitri van Heesch <dimitri@stack.nl> | 2005-07-21 08:42:44 (GMT) |
commit | 64c0fdd7432f5d9ddd815fbb459c651f6933a2ea (patch) | |
tree | 0d39615cce00be60a77b797babf9b09b9c6b2a09 /src | |
parent | 7a1074b436cfe0a5e2b49be7d2571e7f5e716243 (diff) | |
download | Doxygen-64c0fdd7432f5d9ddd815fbb459c651f6933a2ea.zip Doxygen-64c0fdd7432f5d9ddd815fbb459c651f6933a2ea.tar.gz Doxygen-64c0fdd7432f5d9ddd815fbb459c651f6933a2ea.tar.bz2 |
Release-1.4.4
Diffstat (limited to 'src')
-rw-r--r-- | src/.cvsignore | 3 | ||||
-rw-r--r-- | src/classdef.cpp | 1 | ||||
-rw-r--r-- | src/cmdmapper.cpp | 1 | ||||
-rw-r--r-- | src/cmdmapper.h | 9 | ||||
-rw-r--r-- | src/commentcnv.l | 19 | ||||
-rw-r--r-- | src/commentscan.h | 55 | ||||
-rw-r--r-- | src/commentscan.l | 89 | ||||
-rw-r--r-- | src/constexp.l | 8 | ||||
-rw-r--r-- | src/defargs.l | 4 | ||||
-rw-r--r-- | src/docparser.cpp | 33 | ||||
-rw-r--r-- | src/docparser.h | 2 | ||||
-rw-r--r-- | src/doctokenizer.l | 4 | ||||
-rw-r--r-- | src/doxygen.cpp | 39 | ||||
-rw-r--r-- | src/htmlgen.cpp | 6 | ||||
-rw-r--r-- | src/pre.l | 6 | ||||
-rw-r--r-- | src/rtfdocvisitor.cpp | 4 | ||||
-rw-r--r-- | src/scanner.l | 8 | ||||
-rw-r--r-- | src/translator_fr.h | 18 | ||||
-rw-r--r-- | src/util.cpp | 65 |
19 files changed, 269 insertions, 105 deletions
diff --git a/src/.cvsignore b/src/.cvsignore index 1f84cb5..66f3839 100644 --- a/src/.cvsignore +++ b/src/.cvsignore @@ -20,3 +20,6 @@ doxytag.cpp pre.cpp scanner.cpp version.cpp +commentscan.cpp +pycode.cpp +pyscanner.cpp diff --git a/src/classdef.cpp b/src/classdef.cpp index 6a80aca..acf2233 100644 --- a/src/classdef.cpp +++ b/src/classdef.cpp @@ -2389,6 +2389,7 @@ void ClassDef::mergeCategory(ClassDef *category) void ClassDef::addUsedClass(ClassDef *cd,const char *accessName) { + //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName); if (m_usesImplClassDict==0) { m_usesImplClassDict = new UsesClassDict(17); diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp index dddfcfd..b0b57d5 100644 --- a/src/cmdmapper.cpp +++ b/src/cmdmapper.cpp @@ -106,6 +106,7 @@ CommandMap cmdMap[] = { "manonly", CMD_MANONLY }, { "endmanonly", CMD_ENDMANONLY }, { "includelineno", CMD_INCWITHLINES }, + { "inheritdoc", CMD_INHERITDOC }, { 0, 0 } }; diff --git a/src/cmdmapper.h b/src/cmdmapper.h index 1c65e24..f7758fd 100644 --- a/src/cmdmapper.h +++ b/src/cmdmapper.h @@ -36,9 +36,9 @@ enum CommandType CMD_AMP = 2, CMD_ANCHOR = 3, CMD_AT = 4, - CMD_ATTENTION = 5 | SIMPLESECT_BIT, - CMD_AUTHOR = 6 | SIMPLESECT_BIT, - CMD_AUTHORS = 7 | SIMPLESECT_BIT, + CMD_ATTENTION = 5 | SIMPLESECT_BIT, + CMD_AUTHOR = 6 | SIMPLESECT_BIT, + CMD_AUTHORS = 7 | SIMPLESECT_BIT, CMD_BOLD = 8, CMD_BSLASH = 9, CMD_CODE = 10, @@ -106,7 +106,8 @@ enum CommandType CMD_ENDDOT = 72, CMD_MANONLY = 73, CMD_ENDMANONLY = 74, - CMD_INCWITHLINES = 75 + CMD_INCWITHLINES = 75, + CMD_INHERITDOC = 76 }; enum HtmlTagType diff --git a/src/commentcnv.l b/src/commentcnv.l index 9e7f8a4..fa72e3f 100644 --- a/src/commentcnv.l +++ b/src/commentcnv.l @@ -320,18 +320,29 @@ CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'")) copyToOutput(yytext,yyleng); BEGIN(CComment); } -<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code")/[ \r\t\n] { /* start of a verbatim block */ +<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f[")/[ \r\t\n] { /* start of a verbatim block */ copyToOutput(yytext,yyleng); - g_blockName=&yytext[1]; + if (yytext[2]=='[') + { + g_blockName="f]"; + } + else + { + g_blockName=&yytext[1]; + } g_lastCommentContext = YY_START; BEGIN(Verbatim); } <Scan>. { /* any other character */ copyToOutput(yytext,yyleng); } -<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */ +<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]") { /* end of verbatim block */ copyToOutput(yytext,yyleng); - if (&yytext[4]==g_blockName) + if (yytext[1]=='f') // end of formula + { + BEGIN(g_lastCommentContext); + } + else if (&yytext[4]==g_blockName) { BEGIN(g_lastCommentContext); } diff --git a/src/commentscan.h b/src/commentscan.h index 363dda2..74efa63 100644 --- a/src/commentscan.h +++ b/src/commentscan.h @@ -21,16 +21,51 @@ class ParserInterface; -int parseCommentBlock(/* in */ ParserInterface *parser, - /* in */ Entry *curEntry, - /* in */ const QCString &comment, - /* in */ const QCString &fileName, - /* in */ int lineNr, - /* in */ bool isBrief, - /* in */ bool isJavaDocStyle, - /* in,out */ Protection &prot, - /* in,out */ int &position, - /* out */ bool &newEntryNeeded +/** @file + * @brief Interface for the comment block parser */ + +/** Invokes the comment block parser with the request to parse a + * single comment block. + * @param[in] parser The language parse that invoked this function. + * The comment block parse may invoke + * ParserInterface::parsePrototype() in order to parse + * the argument of a @@fn command. + * @param[in] curEntry The Entry to which the comment block belongs. + * Any information (like documentation) that is found in + * the comment block will be stored in this entry. + * @param[in] comment A string representing the actual comment block. + * Note that leading *'s are already stripped from the comment block. + * @param[in] fileName The name of the file in which the comment is found. + * Mainly used for producing warnings. + * @param[in] lineNr The line number at which the comment block was found. + * @param[in] isBrief TRUE iff this comment block represents a brief description. + * @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style. + * This means that it starts as a brief description until the end of + * the sentences is found and then proceeds as a detailed description. + * @param[in,out] prot The protection level in which this comment block was + * found. Commands in the comment block may override this. + * @param[in,out] position The character position within \a comment where the + * comment block starts. Typically used in case the comment block + * contains multiple structural commands. + * @param[out] newEntryNeeded Boolean that is TRUE if the comment block parser + * finds that a the comment block finishes the entry and a new one + * needs to be started. + * @returns TRUE if the comment requires further processing. The + * parameter \a newEntryNeeded will typically be true in this case and + * \a position will indicate the offset inside the \a comment string + * where to proceed parsing. FALSE indicates no further processing is + * needed. + */ +bool parseCommentBlock(ParserInterface *parser, + Entry *curEntry, + const QCString &comment, + const QCString &fileName, + int lineNr, + bool isBrief, + bool isJavaDocStyle, + Protection &prot, + int &position, + bool &newEntryNeeded ); void groupEnterFile(const char *file,int line); diff --git a/src/commentscan.l b/src/commentscan.l index a44caa7..10222d2 100644 --- a/src/commentscan.l +++ b/src/commentscan.l @@ -332,6 +332,8 @@ static int braceCount; static bool insidePre; static bool parseMore; +static int g_commentCount; + //----------------------------------------------------------------------------- static QStack<Grouping> g_autoGroupStack; @@ -909,8 +911,9 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] addOutput(yytext); setOutput(OutputDoc); } - else - { + else if (!current->brief.stripWhiteSpace().isEmpty()) + { // only go to the detailed description if we have + // found some brief description and not just whitespace setOutput(OutputDoc); addOutput(yytext); } @@ -1422,13 +1425,24 @@ MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-] BEGIN(Comment); } } -<FormatBlock>[^ \@\\\n]* { // some word +<FormatBlock>[^ \@\*\/\\\n]* { // some word addOutput(yytext); } <FormatBlock>{DOCNL} { // new line if (*yytext=='\n') yyLineNr++; addOutput('\n'); } +<FormatBlock>"/*" { // start of a C-comment + g_commentCount++; + } +<FormatBlock>"*/" { // end of a C-comment + g_commentCount--; + if (g_commentCount<0 && blockName!="verbatim") + { + warn(yyFileName,yyLineNr, + "Warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data()); + } + } <FormatBlock>. { addOutput(*yytext); } @@ -1883,6 +1897,7 @@ static bool handleName(const QCString &) bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC); g_memberGroupHeader.resize(0); BEGIN( NameParam ); + closeGroup(current,yyFileName,yyLineNr); return stop; } @@ -1979,6 +1994,7 @@ static bool handleFormatBlock(const QCString &s) addOutput("@"+s+" "); //printf("handleFormatBlock(%s)\n",s.data()); blockName=s; + g_commentCount=0; BEGIN(FormatBlock); return FALSE; } @@ -2218,6 +2234,12 @@ bool parseCommentBlock(/* in */ ParserInterface *parser, current->doc="\n\n"; } + if (current->section==Entry::MEMBERGRP_SEC && + g_memberGroupId==DOX_NOGROUP) // @name section but no group started yet + { + openGroup(current,yyFileName,yyLineNr); + } + Debug::print(Debug::CommentScan,0,"CommentScanner\n%s:%d\n" "input=[%s]\nbrief=[%s]\ndocs=[%s]\n------------\n", fileName.data(),lineNr,comment.data(), @@ -2249,10 +2271,13 @@ void groupEnterFile(const char *,int) void groupLeaveFile(const char *fileName,int line) { - if (g_memberGroupId!=DOX_NOGROUP) - { - warn(fileName,line,"Warning: end of file while inside a member group\n"); - } + //if (g_memberGroupId!=DOX_NOGROUP) + //{ + // warn(fileName,line,"Warning: end of file while inside a member group\n"); + //} + g_memberGroupId=DOX_NOGROUP; + g_memberGroupRelates.resize(0); + g_memberGroupDocs.resize(0); if (!g_autoGroupStack.isEmpty()) { warn(fileName,line,"Warning: end of file while inside a group\n"); @@ -2270,12 +2295,12 @@ void groupEnterCompound(const char *fileName,int line,const char *name) g_memberGroupDocs.resize(0); } -void groupLeaveCompound(const char *fileName,int line,const char *name) +void groupLeaveCompound(const char *,int,const char *) { - if (g_memberGroupId!=DOX_NOGROUP) - { - warn(fileName,line,"Warning: end of compound %s while inside a member group\n",name); - } + //if (g_memberGroupId!=DOX_NOGROUP) + //{ + // warn(fileName,line,"Warning: end of compound %s while inside a member group\n",name); + //} g_memberGroupId=DOX_NOGROUP; g_memberGroupRelates.resize(0); g_memberGroupDocs.resize(0); @@ -2284,7 +2309,8 @@ void groupLeaveCompound(const char *fileName,int line,const char *name) void closeGroup(Entry *e,const char *fileName,int) { - //printf("%s:%d: closeGroup()\n",fileName,line); + //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n", + // e->name.data(),e->section,g_autoGroupStack.count()); if (g_memberGroupId!=DOX_NOGROUP) // end of member group { MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId); @@ -2301,34 +2327,39 @@ void closeGroup(Entry *e,const char *fileName,int) } else if (!g_autoGroupStack.isEmpty()) // end of auto group { - delete g_autoGroupStack.pop(); + Grouping *grp = g_autoGroupStack.pop(); + e->groups->removeLast(); + delete grp; } } -void openGroup(Entry *e,const char *fileName,int line) +void openGroup(Entry *e,const char *,int) { - //printf("%s:%d: openGroup(sec=%x)\n",fileName,line,e->section); + //printf("==> openGroup(name=%s,sec=%x)\n",e->name.data(),e->section); if (e->section==Entry::GROUPDOC_SEC) // auto group { g_autoGroupStack.push(new Grouping(e->name,e->groupingPri())); } else // start of a member group { - if (g_memberGroupId!=DOX_NOGROUP) + if (g_memberGroupId==DOX_NOGROUP) // no group started yet { - warn(fileName,line,"Warning: member groups cannot be nested. Ending current group!\n"); - closeGroup(e,fileName,line); - } - static int curGroupId=0; - g_memberGroupId = curGroupId++; - //printf("new group id=%d header=%s\n",g_memberGroupId,g_memberGroupHeader.data()); + static int curGroupId=0; + g_memberGroupId = curGroupId++; + //printf("new group id=%d header=%s\n",g_memberGroupId,g_memberGroupHeader.data()); - MemberGroupInfo *info = new MemberGroupInfo; - info->header = g_memberGroupHeader.stripWhiteSpace(); - Doxygen::memGrpInfoDict.insert(g_memberGroupId,info); + MemberGroupInfo *info = new MemberGroupInfo; + info->header = g_memberGroupHeader.stripWhiteSpace(); + Doxygen::memGrpInfoDict.insert(g_memberGroupId,info); - g_memberGroupRelates = e->relates; - e->mGrpId = g_memberGroupId; + g_memberGroupRelates = e->relates; + e->mGrpId = g_memberGroupId; + } + //else + //{ + // warn(fileName,line,"Warning: member groups cannot be nested. Ending current group!\n"); + // closeGroup(e,fileName,line); + //} } } @@ -2338,7 +2369,7 @@ void initGroupInfo(Entry *e) e->relates = g_memberGroupRelates; if (!g_autoGroupStack.isEmpty()) { - //printf("Appending group %s\n",autoGroupStack.top()->groupname.data()); + //printf("Appending group %s to %s\n",g_autoGroupStack.top()->groupname.data(),e->name.data()); e->groups->append(new Grouping(*g_autoGroupStack.top())); } } diff --git a/src/constexp.l b/src/constexp.l index ed2d945..1b97648 100644 --- a/src/constexp.l +++ b/src/constexp.l @@ -48,6 +48,8 @@ static int yyread(char *buf,int max_size) %} +CONSTSUFFIX ([uU][lL]?[lL]?)|(lL][lL]?[uU]?) + %option nounput %% @@ -80,13 +82,13 @@ static int yyread(char *buf,int max_size) g_strToken=yytext; return TOK_CHARACTER; } -0[0-7]*[uUlL]* { g_strToken=yytext; +0[0-7]*{CONSTSUFFIX}? { g_strToken=yytext; return TOK_OCTALINT; } -[1-9][0-9]*[uUlL]* { g_strToken=yytext; +[1-9][0-9]*{CONSTSUFFIX}? { g_strToken=yytext; return TOK_DECIMALINT; } -(0x|0X)[0-9a-fA-F]+[uUlL]* { g_strToken=yytext+2; +(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { g_strToken=yytext+2; return TOK_HEXADECIMALINT; } (([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? { diff --git a/src/defargs.l b/src/defargs.l index 00c862f..462efda 100644 --- a/src/defargs.l +++ b/src/defargs.l @@ -336,6 +336,10 @@ ID [a-z_A-Z][a-z_A-Z0-9]* <ReadFuncArgType,ReadFuncArgPtr>. { g_curArgTypeName+=*yytext; } + +<ReadFuncArgDef,CopyArgString>"->"|">="|">>" { + g_curArgDefValue+=yytext; + } <ReadFuncArgDef,CopyArgString>. { g_curArgDefValue+=*yytext; } diff --git a/src/docparser.cpp b/src/docparser.cpp index c5cabcd..1399788 100644 --- a/src/docparser.cpp +++ b/src/docparser.cpp @@ -1623,7 +1623,7 @@ void DocCopy::parse() g_nodeStack.clear(); g_copyStack.append(def); internalValidatingParseDoc(this,m_children,doc); - ASSERT(g_copyStack.remove(def)); + g_copyStack.remove(def); ASSERT(g_styleStack.isEmpty()); ASSERT(g_nodeStack.isEmpty()); docParserPopContext(); @@ -4043,6 +4043,31 @@ int DocPara::handleStartCode() return retval; } +void DocPara::handleInheritDoc() +{ + if (g_memberDef) // inheriting docs from a member + { + MemberDef *reMd = g_memberDef->reimplements(); + if (reMd) // member from which was inherited. + { + MemberDef *thisMd = g_memberDef; + //printf("{InheritDocs:%s=>%s}\n",g_memberDef->qualifiedName().data(),reMd->qualifiedName().data()); + docParserPushContext(); + g_context=reMd->getOuterScope()->name(); + g_memberDef=reMd; + g_styleStack.clear(); + g_nodeStack.clear(); + g_copyStack.append(reMd); + internalValidatingParseDoc(this,m_children,reMd->briefDescription()); + internalValidatingParseDoc(this,m_children,reMd->documentation()); + g_copyStack.remove(reMd); + docParserPopContext(); + g_memberDef = thisMd; + } + } +} + + int DocPara::handleCommand(const QString &cmdName) { DBG(("handleCommand(%s)\n",cmdName.data())); @@ -4392,6 +4417,9 @@ int DocPara::handleCommand(const QString &cmdName) case CMD_INTERNALREF: warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data()); break; + case CMD_INHERITDOC: + handleInheritDoc(); + break; default: // we should not get here! ASSERT(0); @@ -5576,7 +5604,8 @@ DocNode *validatingParseDoc(const char *fileName,int startLine, g_fileName = fileName; g_relPath = (!linkFromIndex && ctx) ? - relativePathToRoot(ctx->getOutputFileBase()) : QString(""); + QString(relativePathToRoot(ctx->getOutputFileBase())) : + QString(""); //printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data()); g_memberDef = md; g_nodeStack.clear(); diff --git a/src/docparser.h b/src/docparser.h index 1a58614..e7fefa2 100644 --- a/src/docparser.h +++ b/src/docparser.h @@ -977,10 +977,10 @@ class DocPara : public CompAccept<DocPara>, public DocNode void handleLink(const QString &cmdName,bool isJavaLink); void handleRef(const QString &cmdName); void handleSection(const QString &cmdName); + void handleInheritDoc(); int handleStartCode(); int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level); bool injectToken(int tok,const QString &tokText); - //int handleLanguageSwitch(); private: DocNode *m_parent; diff --git a/src/doctokenizer.l b/src/doctokenizer.l index 6cc93d1..34f82a2 100644 --- a/src/doctokenizer.l +++ b/src/doctokenizer.l @@ -408,6 +408,10 @@ REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"))*({ID}(":")?){FUNCARG}? g_token->name = "javalink"; return TK_COMMAND; } +<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" { + g_token->name = "inheritdoc"; + return TK_COMMAND; + } <St_Para>{SPCMD3} { g_token->name = "form"; bool ok; diff --git a/src/doxygen.cpp b/src/doxygen.cpp index 8a78ea9..1035776 100644 --- a/src/doxygen.cpp +++ b/src/doxygen.cpp @@ -1173,9 +1173,6 @@ static void findUsingDirectives(Entry *root) gd->addNamespace(nd); } - bool ambig; - // file definition containing the namespace nd - FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); // insert the namespace in the file definition if (fd) { @@ -1492,7 +1489,7 @@ static MemberDef *addVariableToClass( prot,Normal,root->stat,related, mtype,0,0); md->setTagInfo(root->tagInfo); - md->setMemberClass(cd); + md->setMemberClass(cd); // also sets outer scope (i.e. getOuterScope()) //md->setDefFile(root->fileName); //md->setDefLine(root->startLine); md->setDocumentation(root->doc,root->docFile,root->docLine); @@ -1670,7 +1667,7 @@ static MemberDef *addVariableToFile( md->setDefinition(def); md->enableCallGraph(root->callGraph); md->setExplicitExternal(root->explicitExternal); - md->setOuterScope(fd); + //md->setOuterScope(fd); if (!root->explicitExternal) { md->setBodySegment(root->bodyLine,root->endBodyLine); @@ -3184,21 +3181,17 @@ static void findUsedClassesForClass(Entry *root, type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs); } - QCString typeName = resolveTypeDef(masterCd,usedClassName); - //printf("*** Found resolved class %s for %s\n",typeName.data(),usedClassName.data()); - - if (!typeName.isEmpty()) // if we could resolve the typedef, use - // the result as the class name. - { - usedClassName=typeName; - } - //printf(" template substitution gives=%s\n",type.data()); while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1) { - //printf(" found used class %s\n",usedClassName.data()); - // the name could be a type definition, resolve it - //QCString typeName = resolveTypeDef(masterCd,usedClassName); + // find the type (if any) that matches usedClassName + ClassDef *typeCd = getResolvedClass(masterCd,masterCd->getFileDef(),usedClassName); + //printf("====> usedClassName=%s -> typeCd=%s\n", + // usedClassName.data(),typeCd?typeCd->name().data():"<none>"); + if (typeCd) + { + usedClassName = typeCd->name(); + } int sp=usedClassName.find('<'); if (sp==-1) sp=0; @@ -4033,14 +4026,14 @@ static void addMemberDocs(Entry *root, if (al) { //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty()); - if (!root->doc.isEmpty()) + if ((!root->doc.isEmpty() || !root->proto)) { mergeArguments(md->argumentList(),al,TRUE); } } else { - if ( !root->doc.isEmpty() && + if ( (!root->doc.isEmpty() || !root->proto) && matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(), rscope,rfd,root->argList, TRUE @@ -4704,9 +4697,10 @@ static void findMember(Entry *root, ClassDef *cd=md->getClassDef(); Debug::print(Debug::FindMembers,0, "3. member definition found, " - "scope needed=`%s' scope=`%s' args=`%s'\n", + "scope needed=`%s' scope=`%s' args=`%s' fileName=%s\n", scopeName.data(),cd ? cd->name().data() : "<none>", - md->argsString()); + md->argsString(), + root->fileName.data()); //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data()); bool ambig; FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig); @@ -7624,6 +7618,9 @@ static void expandAliases() for (adi.toFirst();(s=adi.current());++adi) { aliasesProcessed.clear(); + // avoid expanding this command recursively + aliasesProcessed.insert(adi.currentKey(),(void *)0x8); + // expand embedded commands *s = expandAliasesRec(*s); } } diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp index cae67c0..9da1e6e 100644 --- a/src/htmlgen.cpp +++ b/src/htmlgen.cpp @@ -1641,6 +1641,12 @@ void HtmlGenerator::writeSearchPage() { writeDefaultQuickLinks(t,TRUE,HLI_Search,""); } + else + { + t << "<div class=\"qindex\">\n"; + t << " <form class=\"search\" action=\"search.php\" " + << "method=\"get\">\n"; + } t << "\n<?php\n\n"; t << "function search_results()\n"; @@ -652,10 +652,7 @@ static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int // result.data(),expr.mid(pos,len).data()); return TRUE; } - else - { - return FALSE; - } + return FALSE; } @@ -2297,6 +2294,7 @@ void preprocessFile(const char *fileName,BufStr &output) else { QCString cmd = inputFilter+" \""+fileName+"\""; + Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data()); preYYin = popen(cmd,"r"); if (!preYYin) { diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp index 85a020e..ab2b6ac 100644 --- a/src/rtfdocvisitor.cpp +++ b/src/rtfdocvisitor.cpp @@ -561,7 +561,7 @@ void RTFDocVisitor::visitPost(DocPara *p) if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n"); if (!p->isLast() && // omit <p> for last paragraph - !(p->parent() && // and for parameter sections + !(p->parent() && // and for parameters & sections p->parent()->kind()==DocNode::Kind_ParamSect ) ) @@ -728,7 +728,7 @@ void RTFDocVisitor::visitPost(DocSection *) { if (m_hide) return; DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n"); - m_t << "}" << endl; // end section + m_t << "\\par}" << endl; // end section m_lastIsPara=TRUE; } diff --git a/src/scanner.l b/src/scanner.l index e419a48..54a7060 100644 --- a/src/scanner.l +++ b/src/scanner.l @@ -1869,7 +1869,6 @@ IDLATTR ("["[^\]]*"]"){BN}* } } <FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" { - //handleGroupEndCommand(); closeGroup(current,yyFileName,yyLineNr); } <FindMembers>"=" { @@ -2929,16 +2928,13 @@ IDLATTR ("["[^\]]*"]"){BN}* } } <ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' { + *copyArgString+=yytext; + fullArgString+=yytext; if (insidePHP) { lastCopyArgStringContext=YY_START; BEGIN(CopyArgPHPString); } - else - { - *copyArgString+=yytext; - fullArgString+=yytext; - } } <ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n { yyLineNr++; diff --git a/src/translator_fr.h b/src/translator_fr.h index 7c6c8ed..0dc2ef6 100644 --- a/src/translator_fr.h +++ b/src/translator_fr.h @@ -60,6 +60,8 @@ * | - translator_fr.h now conforms exactly to translator_en.h * | (try: gvim -d translator_en.h translator_fr.h) * -------------+------------------------------------------------------------ + * 2005-07-12 | Update for new since 1.4.1 + * -------------+------------------------------------------------------------ */ #ifndef TRANSLATOR_FR_H #define TRANSLATOR_FR_H @@ -85,7 +87,7 @@ // Translator class (by the local maintainer) when the localized // translator is made up-to-date again. -class TranslatorFrench : public TranslatorAdapter_1_4_1 +class TranslatorFrench : public Translator { public: @@ -1650,6 +1652,20 @@ class TranslatorFrench : public TranslatorAdapter_1_4_1 return result; } +////////////////////////////////////////////////////////////////////////// +// new since 1.4.1 +////////////////////////////////////////////////////////////////////////// + + /*! This text is added to the documentation when the \\overload command + * is used for a overloaded function. + */ + virtual QCString trOverloadText() + { + return "Ceci est une fonction membre surchargée, " + "proposée par commodité. Elle diffère de la fonction " + "çi-dessus uniquement par le(s) argument(s) qu'elle accepte."; + } }; #endif + diff --git a/src/util.cpp b/src/util.cpp index a175db0..637a45d 100644 --- a/src/util.cpp +++ b/src/util.cpp @@ -1053,6 +1053,7 @@ ClassDef *getResolvedClassRec(Definition *scope, (fileScope->getUsedClasses() && fileScope->getUsedClasses()->count()>0)) ); + //printf("hasUsingStatements=%d\n",hasUsingStatements); // Since it is often the case that the same name is searched in the same // scope over an over again (especially for the linked source code generation) // we use a cache to collect previous results. This is possible since the @@ -1062,7 +1063,7 @@ ClassDef *getResolvedClassRec(Definition *scope, int scopeNameLen = scope->name().length()+1; int nameLen = name.length()+1; int explicitPartLen = explicitScopePart.length(); - int fileScopeLen = hasUsingStatements ? 1+fileScope->name().length() : 0; + int fileScopeLen = hasUsingStatements ? 1+fileScope->absFilePath().length() : 0; // below is a more efficient coding of // QCString key=scope->name()+"+"+name+"+"+explicitScopePart; @@ -1084,7 +1085,7 @@ ClassDef *getResolvedClassRec(Definition *scope, // below is a more efficient coding of // key+="+"+fileScope->name(); *p++='+'; - qstrcpy(p,fileScope->name()); + qstrcpy(p,fileScope->absFilePath()); p+=fileScopeLen-1; } *p='\0'; @@ -1097,7 +1098,8 @@ ClassDef *getResolvedClassRec(Definition *scope, if (pTypeDef) *pTypeDef=pval->typeDef; //printf("] cachedMatch=%s\n", // pval->classDef?pval->classDef->name().data():"<none>"); - //if (pTemplSpec) printf("templSpec=%s\n",pTemplSpec->data()); + //if (pTemplSpec) + // printf("templSpec=%s\n",pTemplSpec->data()); return pval->classDef; } else // not found yet; we already add a 0 to avoid the possibility of @@ -1235,7 +1237,8 @@ ClassDef *getResolvedClassRec(Definition *scope, } //printf("] bestMatch=%s distance=%d\n", // bestMatch?bestMatch->name().data():"<none>",minDistance); - //if (pTemplSpec) printf("templSpec=%s\n",pTemplSpec->data()); + //if (pTemplSpec) + // printf("templSpec=%s\n",pTemplSpec->data()); return bestMatch; } @@ -2660,6 +2663,7 @@ bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl, #endif +#if 0 static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templSpec) { ASSERT(symbol!=0); @@ -2671,7 +2675,7 @@ static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templ ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec); if (cd) { - return cd->qualifiedNameWithTemplateParameters(); + return cd->qualifiedName()+templSpec; } else if (md) { @@ -2680,14 +2684,28 @@ static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templ } return symbol->qualifiedName(); } +#endif + +static QCString stripDeclKeywords(const QCString &s) +{ + int i=s.find(" class "); + if (i!=-1) return s.left(i)+s.mid(i+6); + i=s.find(" typename "); + if (i!=-1) return s.left(i)+s.mid(i+9); + i=s.find(" union "); + if (i!=-1) return s.left(i)+s.mid(i+6); + i=s.find(" struct "); + if (i!=-1) return s.left(i)+s.mid(i+7); + return s; +} static QCString getCanonicalTypeForIdentifier( Definition *d,FileDef *fs,const QCString &word, QCString *tSpec) { QCString symName,scope,result,templSpec,tmpName; - DefinitionList *defList=0; - if (tSpec) templSpec = *tSpec; + //DefinitionList *defList=0; + if (tSpec) templSpec = stripDeclKeywords(*tSpec); if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty()) { @@ -2698,10 +2716,12 @@ static QCString getCanonicalTypeForIdentifier( symName=word; } +#if 0 // I've commented this out because it leads to obscure errors + // while not gaining much w.r.t. speed. if (!symName.isEmpty() && !templSpec.isEmpty() && (defList=Doxygen::symbolMap->find(symName+templSpec)) && defList->count()==1) // word without scope but with template specs - // is a unique symbol in the symbol map + // is a unique symbol in the symbol map { QCString ts; result = resolveSymbolName(fs,defList->first(),ts); @@ -2710,24 +2730,33 @@ static QCString getCanonicalTypeForIdentifier( else if (!symName.isEmpty() && (defList=Doxygen::symbolMap->find(symName)) && defList->count()==1) // word without scope is a - // unique symbol in the symbol map + // unique symbol in the symbol map { QCString ts; - //printf("unique symName=%s\n",symName.data()); + //printf("unique symName=%s templSpec=%s\n",symName.data(),templSpec.data()); result = resolveSymbolName(fs,defList->first(),ts)+templSpec; + //printf("result=%s ts=%s\n",result.data(),ts.data()); + if (tSpec) *tSpec=""; } else // symbol not unique, try to find the one in the right scope +#endif { ClassDef *cd = 0; MemberDef *mType = 0; + QCString ts; if (!templSpec.isEmpty()) { - cd = getResolvedClass(d,fs,word+templSpec,&mType,0,TRUE); + cd = getResolvedClass(d,fs,word+templSpec,&mType,&ts,TRUE); if (cd && tSpec) *tSpec=""; } if (cd==0) { - cd = getResolvedClass(d,fs,word,&mType,0,TRUE); + cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE); + } + + if (!ts.isEmpty() && templSpec.isEmpty()) + { + templSpec = stripDeclKeywords(ts); } //printf("symbol=%s word=%s cd=%s d=%s fs=%s\n", // symName.data(), @@ -2737,7 +2766,7 @@ static QCString getCanonicalTypeForIdentifier( // fs?fs->name().data():"<none>" // ); - //printf(">>>> word '%s' => '%s'\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>"); + //printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",(word+templSpec).data(),cd?cd->qualifiedNameWithTemplateParameters().data():"<none>",templSpec.data(),ts.data()); if (cd) // known type { //result = cd->qualifiedNameWithTemplateParameters(); @@ -2828,7 +2857,7 @@ static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *a pp=p; } canType += type.right(type.length()-pp); - //printf("result = %s->%s\n",type.data(),canType.data()); + //printf("extractCanonicalType = %s->%s\n",type.data(),canType.data()); return removeRedundantWhiteSpace(canType); } @@ -2855,11 +2884,13 @@ static bool matchArgument2( { // case "unsigned int" <-> "unsigned int i" srcA->type+=sSrcName; srcA->name=""; + srcA->canType=""; // invalidate cached type value } else if (sDstName==srcA->type.right(sDstName.length())) { // case "unsigned int i" <-> "unsigned int" dstA->type+=sDstName; dstA->name=""; + dstA->canType=""; // invalidate cached type value } if (srcA->canType.isEmpty()) @@ -3094,11 +3125,9 @@ void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwr dstA->docs = srcA->docs.copy(); } //printf("Merge argument `%s|%s' `%s|%s'\n", - // srcA->type.data(),srcA->name.data(), - // dstA->type.data(),dstA->name.data()); + // srcA->type.data(),srcA->name.data(), + // dstA->type.data(),dstA->name.data()); } - //printf("result mergeArguments `%s|%s', `%s|%s'\n", - // argListToString(srcAl).data(),argListToString(dstAl).data()); } /*! |